diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0fc45255..9f3ee68b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,12 +28,12 @@ jobs: - name: Build run: | conda env list - cd content + cd portal make -j4 html - name: Deploy uses: peaceiris/actions-gh-pages@v3.7.3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./content/_build/html + publish_dir: ./portal/_build/html cname: projectpythia.org diff --git a/.github/workflows/update-external-links-gallery.yaml b/.github/workflows/update-external-links-gallery.yaml index 46696707..56e23f32 100644 --- a/.github/workflows/update-external-links-gallery.yaml +++ b/.github/workflows/update-external-links-gallery.yaml @@ -92,16 +92,16 @@ jobs: yaml = YAML() submission_file = 'gallery-submission-input.json' - links_file = 'content/links.yaml' + gallery_file = 'portal/gallery.yaml' with open(submission_file) as f: data = json.load(f) - with open(links_file) as f: - links = yaml.load(f) + with open(gallery_file) as f: + gallery = yaml.load(f) - with open(links_file, 'w') as f: - links.append(data) - yaml.dump(links, f) + with open(gallery_file, 'w') as f: + gallery.append(data) + yaml.dump(gallery, f) - name: Run pre-commit hooks run: | diff --git a/.gitignore b/.gitignore index 3a07f691..c8526ee6 100644 --- a/.gitignore +++ b/.gitignore @@ -131,9 +131,10 @@ dmypy.json *.DS_Store _build/ _thumbnails/ -content/pages/communications.md content/pages/code_of_conduct.md content/pages/links.md content/pages/links/*.md -content/notebooks_gallery/ +portal/code_of_conduct.md +portal/gallery.md +portal/gallery/*.md gallery-submission-input.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a6669dcd..82538b60 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.3.0 + rev: v4.0.1 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -10,17 +10,17 @@ repos: - id: double-quote-string-fixer - repo: https://github.com/ambv/black - rev: 20.8b1 + rev: 21.6b0 hooks: - id: black - repo: https://github.com/keewis/blackdoc - rev: v0.3 + rev: v0.3.3 hooks: - id: blackdoc - repo: https://gitlab.com/pycqa/flake8 - rev: 3.8.4 + rev: 3.9.2 hooks: - id: flake8 @@ -29,17 +29,17 @@ repos: hooks: - id: seed-isort-config - repo: https://github.com/pre-commit/mirrors-isort - rev: v5.6.4 + rev: v5.8.0 hooks: - id: isort - - repo: https://github.com/prettier/pre-commit - rev: 57f39166b5a5a504d6808b87ab98d41ebf095b46 - hooks: - - id: prettier + # - repo: https://github.com/prettier/pre-commit + # rev: 57f39166b5a5a504d6808b87ab98d41ebf095b46 + # hooks: + # - id: prettier - repo: https://github.com/nbQA-dev/nbQA - rev: 0.5.1 + rev: 0.13.0 hooks: - id: nbqa-black additional_dependencies: [black==20.8b1] diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 17ab997d..c60462e5 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,4 +8,5 @@ conda: environment: ci/environment.yml sphinx: + configuration: portal/conf.py fail_on_warning: false diff --git a/CODEOFCONDUCT.md b/CODEOFCONDUCT.md index 4bc01031..84a563ee 100644 --- a/CODEOFCONDUCT.md +++ b/CODEOFCONDUCT.md @@ -1,10 +1,10 @@ # Code of Conduct -## OUR PLEDGE +## Our Pledge We, as contributors, creators, stewards, and maintainers (participants), of Project Pythia pledge to make participation in our software, system or hardware project and community a safe, productive, welcoming and inclusive experience for everyone. All participants are required to abide by this Code of Conduct. This includes respectful treatment of everyone regardless of age, body size, disability, ethnicity, gender identity or expression, level of experience, nationality, political affiliation, veteran status, pregnancy, genetic information, physical appearance, race, religion, or sexual orientation, as well as any other characteristic protected under applicable US federal or state law. -## OUR STANDARDS +## Our Standards Examples of behaviors that contribute to a positive environment include: @@ -29,26 +29,26 @@ Examples of unacceptable behavior include, but are not limited to: - Threatening or stalking anyone, including a participant - Other conduct which could reasonably be considered inappropriate in a professional setting -## SCOPE +## Scope of this Code This Code of Conduct applies to all spaces managed by the Project whether they be physical, online or face-to-face. This includes project code, code repository, associated web pages, documentation, mailing lists, project websites and wiki pages, issue tracker, meetings, telecons, events, project social media accounts, and any other forums created by the project team which the community uses for communication. In addition, violations of this Code of Conduct outside these spaces may affect a person's ability to participate within them. Representation of a project may be further defined and clarified by project maintainers. -## COMMUNITY RESPONSIBILITIES +## Community Responsibilities Everyone in the community is empowered to respond to people who are showing unacceptable behavior. They can talk to them privately or publicly. Anyone requested to stop unacceptable behavior is expected to comply immediately. If the behavior continues concerns may be brought to the project administrators or to any other party listed in the Reporting section below. -## PROJECT ADMINISTRATOR RESPONSIBILITIES +## Project Administrator Responsibilities Project administrators are responsible for clarifying the standards of acceptable behavior and are encouraged to model appropriate behavior and provide support when people in the community point out inappropriate behavior. Project administrator(s) are normally the ones that would be tasked to carry out the actions in the Consequences section below. -## REPORTING +## Reporting Instances of unacceptable behavior can be brought to the attention of the project administrator(s) who may take any action as outlined in the Consequences section below. -## CONSEQUENCES +## Consequences Upon receipt of a complaint, the project administrator(s) may take any action deemed necessary and appropriate under the circumstances. Such action can include things such as: removing, editing, or rejecting comments, commits, code, wiki edits, email, issues, and other contributions that are not aligned to this Code of Conduct, or banning temporarily or permanently any contributor for other behaviors that are deemed inappropriate, threatening, offensive, or harmful. Project administrators also have the right to report violations to UCAR HR and/or UCAR’s Office of Diversity, Equity and Inclusion (ODEI), as well as a participant’s home institution and/or law enforcement. In the event an incident is reported to UCAR, UCAR will follow its Harassment Reporting and Complaint Procedure. -## ATTRIBUTION +## Attribution -This Code of Conduct was originally adapted from the Contributor Covenant, version 1.4. We then aligned it with the UCAR Participant Code of Conduct, which also borrows from the American Geophysical Union (AGU) Code of Conduct. The UCAR Participant Code of Conduct applies to both UCAR employees as well as participants in activities run by UCAR. The original version of this for all software projects that have strong management from UCAR or UCAR staff is available on the UCAR website at https://doi.org/10.5065/6w2c-a132. The date that it was adopted by this project was 20 December 2020. When responding to complaints, UCAR HR and ODEI will do so based on the latest published version. Therefore, any project-specific changes should follow the Process for Changes section above. +This Code of Conduct was originally adapted from the Contributor Covenant, version 1.4. We then aligned it with the UCAR Participant Code of Conduct, which also borrows from the American Geophysical Union (AGU) Code of Conduct. The UCAR Participant Code of Conduct applies to both UCAR employees as well as participants in activities run by UCAR. The original version of this for all software projects that have strong management from UCAR or UCAR staff is available on the UCAR website at [https://doi.org/10.5065/6w2c-a132](https://doi.org/10.5065/6w2c-a132). The date that it was adopted by this project was 20 December 2020. When responding to complaints, UCAR HR and ODEI will do so based on the latest published version. Therefore, any project-specific changes should follow the Process for Changes section above. diff --git a/portal/Makefile b/portal/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/portal/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/portal/_extensions/pythia.py b/portal/_extensions/pythia.py new file mode 100644 index 00000000..8c81d9bf --- /dev/null +++ b/portal/_extensions/pythia.py @@ -0,0 +1,51 @@ +from bs4 import BeautifulSoup as bs +from sphinx.application import Sphinx + + +def add_functions_to_context(app, pagename, templatename, context, doctree): + def denest_sections(html): + soup = bs(html, 'html.parser') + + sections = [] + for h1 in soup.find_all(['h1']): + sections.append(h1.parent) + for child in h1.parent.children: + if (child.name == 'section') or (child.name == 'div' and 'section' in child['class']): + sections.append(child.extract()) + + return '\n'.join(str(s) for s in sections) + + def bootstrapify(html): + soup = bs(html, 'html.parser') + + for s in soup.select('section,div.section'): + h = s.find(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) + if not h: + continue + + i = h.name[-1] + + h['class'] = [f'display-{i}'] + h.get('class', []) + + if h.name in ['h1', 'h2']: + s.wrap(soup.new_tag('div', **{'class': f'container-fluid sectionwrapper-{i}'})) + s.wrap(soup.new_tag('div', **{'class': f'container section-{i}'})) + + if h.name == 'h2': + h.wrap(soup.new_tag('div', **{'class': 'section-title-wrapper'})) + h.wrap(soup.new_tag('div', **{'class': 'section-title'})) + + return str(soup) + + context['bootstrapify'] = bootstrapify + context['denest_sections'] = denest_sections + + +def setup(app: Sphinx): + app.require_sphinx('3.5') + app.connect('html-page-context', add_functions_to_context) + + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/portal/_extensions/yaml_gallery_generator.py b/portal/_extensions/yaml_gallery_generator.py new file mode 100644 index 00000000..ddd5c159 --- /dev/null +++ b/portal/_extensions/yaml_gallery_generator.py @@ -0,0 +1,202 @@ +import itertools +import pathlib +from textwrap import dedent + +import yaml + + +def _tag_in_item(item, tag_str=None): + if tag_str is None: + return True + all_tags = sorted(itertools.chain(*item['tags'].values())) + return tag_str in all_tags + + +def _generate_sorted_tag_keys(all_items): + + key_set = set(itertools.chain(*[item['tags'].keys() for item in all_items])) + return sorted(key_set) + + +def _generate_tag_set(all_items, tag_key=None): + + tag_set = set() + for item in all_items: + for k, e in item['tags'].items(): + if tag_key and k != tag_key: + continue + for t in e: + tag_set.add(t) + + return tag_set + + +def _generate_tag_menu(all_items, tag_key): + + tag_set = _generate_tag_set(all_items, tag_key) + tag_list = sorted(tag_set) + + options = ''.join( + f'
  • {tag.title()}
  • \n' + for tag in tag_list + ) + + return f""" + +""" + + +def _generate_menu(all_items, flt=None): + + key_list = _generate_sorted_tag_keys(all_items) + + menu_html = '
    \n' + for tag_key in key_list: + menu_html += _generate_tag_menu(all_items, tag_key) + '\n' + if flt: + menu_html += '
    Return to Full Gallery
    \n' + menu_html += '
    Submit a new resource
    \n' + menu_html += '
    \n' + menu_html += '\n' + return menu_html + + +def build_from_items(items, filename, title='Gallery', subtitle=None, menu_html='', max_descr_len=300): + + # Build the gallery file + panels_body = [] + for item in items: + if not item.get('thumbnail'): + item['thumbnail'] = '/_static/images/ebp-logo.png' + thumbnail = item['thumbnail'] + tag_list = sorted((itertools.chain(*item['tags'].values()))) + tags = [ + f'{tag}' + for tag in tag_list + ] + tags = '\n'.join(tags) + + author_strs = set() + affiliation_strs = set() + for a in item['authors']: + author_name = a.get('name', 'Anonymous') + author_email = a.get('email', None) + if author_email: + _str = f'{author_name}' + else: + _str = author_name + author_strs.add(_str) + + affiliation_name = a.get('affiliation', None) + if affiliation_name: + affiliation_url = a.get('affiliation_url', None) + if affiliation_url: + _str = f'{affiliation_name}' + else: + _str = affiliation_name + affiliation_strs.add(_str) + + authors_str = f"Author: {', '.join(author_strs)}" + if affiliation_strs: + affiliations_str = f"Affiliation: {' '.join(affiliation_strs)}" + else: + affiliations_str = '' + + if len(item['description']) < max_descr_len: + short_description = item['description'] + modal_str = '' + else: + short_description = item['description'][:max_descr_len] + ' ...more' + modal_str = f""" + +""" + + panels_body.append( + f"""\ +--- + +
    + +
    +

    {item["title"]}

    +

    {authors_str}
    {affiliations_str}

    +

    {short_description}

    +
    +
    +{modal_str} + ++++ + +{tags} + +""" + ) + + panels_body = '\n'.join(panels_body) + + if subtitle: + stitle = f'Displaying "{subtitle}" tags' + else: + stitle = '' + + panels = f""" +# {title} + +{stitle} + +{menu_html} + +````{{panels}} +:column: col-12 +:card: +mb-4 w-100 +:header: d-none +:body: p-3 m-0 +:footer: p-1 + +{dedent(panels_body)} +```` + + + +""" + + pathlib.Path(f'{filename}.md').write_text(panels) + + +def main(app): + + with open('gallery.yaml') as fid: + all_items = yaml.safe_load(fid) + + title = 'Pythia Resource Gallery' + menu_html = _generate_menu(all_items) + build_from_items(all_items, 'gallery', title=title, menu_html=menu_html) + + menu_html_flt = _generate_menu(all_items, flt=True) + tag_set = _generate_tag_set(all_items) + + for tag in tag_set: + items = [item for item in all_items if _tag_in_item(item, tag)] + build_from_items(items, f'gallery/{tag.replace(" ", "-")}', title=title, subtitle=tag, menu_html=menu_html_flt) + + +def setup(app): + app.connect('builder-inited', main) diff --git a/portal/_static/custom.css b/portal/_static/custom.css new file mode 100644 index 00000000..15875d52 --- /dev/null +++ b/portal/_static/custom.css @@ -0,0 +1,47 @@ +.modal { + display: none; + position: fixed; + background: #f8f9fa; + border-radius: 5px; + padding: 3rem; + width: 60%; + height: auto !important; + top: 20%; + left: 20%; + z-index: 20001; +} + +.modal-backdrop { + display: none; + position: fixed; + background: rgba(0, 0, 0, 0.5); + top: 0; + left: 0; + height: 100vh; + width: 100vw; + z-index: 20000; +} + +.modal-btn { + color: #1a658f; + text-decoration: none; +} + +.modal-img { + float: right; + margin: 0 0 2rem 2rem; + max-width: 300px; + max-height: 300px; +} + +.gallery-thumbnail { + display: block; + float: left; + margin: 0 0 auto 0; + padding: 0; + max-width: 160px; +} + +.card-subtitle { + font-size: 0.8rem; +} diff --git a/portal/_static/custom.js b/portal/_static/custom.js new file mode 100644 index 00000000..1dce468c --- /dev/null +++ b/portal/_static/custom.js @@ -0,0 +1,32 @@ +var buttons = document.querySelectorAll('.modal-btn') +var backdrop = document.querySelector('.modal-backdrop') +var modals = document.querySelectorAll('.modal') + +function openModal(i) { + backdrop.style.display = 'block' + modals[i].style.display = 'block' +} + +function closeModal(i) { + backdrop.style.display = 'none' + modals[i].style.display = 'none' +} + +for (i = 0; i < buttons.length; i++) { + buttons[i].addEventListener( + 'click', + (function (j) { + return function () { + openModal(j) + } + })(i) + ) + backdrop.addEventListener( + 'click', + (function (j) { + return function () { + closeModal(j) + } + })(i) + ) +} diff --git a/portal/_static/images/ReadtheDocsAutobuild.png b/portal/_static/images/ReadtheDocsAutobuild.png new file mode 100644 index 00000000..25eec582 Binary files /dev/null and b/portal/_static/images/ReadtheDocsAutobuild.png differ diff --git a/portal/_static/images/backgrounds/pexels-jeff-stapleton-5792818.jpg b/portal/_static/images/backgrounds/pexels-jeff-stapleton-5792818.jpg new file mode 100644 index 00000000..d8d50201 Binary files /dev/null and b/portal/_static/images/backgrounds/pexels-jeff-stapleton-5792818.jpg differ diff --git a/portal/_static/images/ebp-logo.png b/portal/_static/images/ebp-logo.png new file mode 100644 index 00000000..454dbda3 Binary files /dev/null and b/portal/_static/images/ebp-logo.png differ diff --git a/portal/_static/images/icons/favicon.ico b/portal/_static/images/icons/favicon.ico new file mode 100644 index 00000000..da6ac735 Binary files /dev/null and b/portal/_static/images/icons/favicon.ico differ diff --git a/portal/_static/images/logos/GeoCAT_Final_Logos-02.svg b/portal/_static/images/logos/GeoCAT_Final_Logos-02.svg new file mode 100644 index 00000000..15138383 --- /dev/null +++ b/portal/_static/images/logos/GeoCAT_Final_Logos-02.svg @@ -0,0 +1 @@ + diff --git a/portal/_static/images/logos/NCAR-contemp-logo-blue.svg b/portal/_static/images/logos/NCAR-contemp-logo-blue.svg new file mode 100644 index 00000000..3bcda635 --- /dev/null +++ b/portal/_static/images/logos/NCAR-contemp-logo-blue.svg @@ -0,0 +1 @@ +NCAR-contemp-logo-blue.a diff --git a/portal/_static/images/logos/UAlbany-A2-logo-purple-gold.svg b/portal/_static/images/logos/UAlbany-A2-logo-purple-gold.svg new file mode 100644 index 00000000..4fdfe3a8 --- /dev/null +++ b/portal/_static/images/logos/UAlbany-A2-logo-purple-gold.svg @@ -0,0 +1,1125 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/portal/_static/images/logos/Unidata_logo_horizontal_1200x300.svg b/portal/_static/images/logos/Unidata_logo_horizontal_1200x300.svg new file mode 100644 index 00000000..0d9fd70f --- /dev/null +++ b/portal/_static/images/logos/Unidata_logo_horizontal_1200x300.svg @@ -0,0 +1,891 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/portal/_static/images/logos/footer-logo-nsf.png b/portal/_static/images/logos/footer-logo-nsf.png new file mode 100644 index 00000000..11c788f2 Binary files /dev/null and b/portal/_static/images/logos/footer-logo-nsf.png differ diff --git a/portal/_static/images/logos/pangeo_simple_logo.png b/portal/_static/images/logos/pangeo_simple_logo.png new file mode 100644 index 00000000..35e81bba Binary files /dev/null and b/portal/_static/images/logos/pangeo_simple_logo.png differ diff --git a/portal/_static/images/logos/pythia_logo-white-notext.png b/portal/_static/images/logos/pythia_logo-white-notext.png new file mode 100644 index 00000000..5fa29d09 Binary files /dev/null and b/portal/_static/images/logos/pythia_logo-white-notext.png differ diff --git a/portal/_static/images/logos/pythia_logo-white-notext.svg b/portal/_static/images/logos/pythia_logo-white-notext.svg new file mode 100644 index 00000000..73e2dfeb --- /dev/null +++ b/portal/_static/images/logos/pythia_logo-white-notext.svg @@ -0,0 +1,128 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/portal/_static/images/logos/pythia_logo-white-rtext.svg b/portal/_static/images/logos/pythia_logo-white-rtext.svg new file mode 100644 index 00000000..fa2a5c6c --- /dev/null +++ b/portal/_static/images/logos/pythia_logo-white-rtext.svg @@ -0,0 +1,225 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/portal/_static/images/logos/pythia_logo-white.svg b/portal/_static/images/logos/pythia_logo-white.svg new file mode 100644 index 00000000..c92dc99d --- /dev/null +++ b/portal/_static/images/logos/pythia_logo-white.svg @@ -0,0 +1,174 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/portal/_static/images/pangeo_simple_logo.png b/portal/_static/images/pangeo_simple_logo.png new file mode 100644 index 00000000..35e81bba Binary files /dev/null and b/portal/_static/images/pangeo_simple_logo.png differ diff --git a/portal/_static/images/pexels-brett-sayles-1431822.jpg b/portal/_static/images/pexels-brett-sayles-1431822.jpg new file mode 100644 index 00000000..bc4aa3a9 Binary files /dev/null and b/portal/_static/images/pexels-brett-sayles-1431822.jpg differ diff --git a/portal/_static/images/pexels-pixabay-209831.jpg b/portal/_static/images/pexels-pixabay-209831.jpg new file mode 100644 index 00000000..6493442b Binary files /dev/null and b/portal/_static/images/pexels-pixabay-209831.jpg differ diff --git a/portal/_static/images/pexels-pixabay-531756.jpg b/portal/_static/images/pexels-pixabay-531756.jpg new file mode 100644 index 00000000..96dd1eb4 Binary files /dev/null and b/portal/_static/images/pexels-pixabay-531756.jpg differ diff --git a/portal/_static/images/placeholder.png b/portal/_static/images/placeholder.png new file mode 100644 index 00000000..304b4d83 Binary files /dev/null and b/portal/_static/images/placeholder.png differ diff --git a/portal/_static/images/sphinx-logo.png b/portal/_static/images/sphinx-logo.png new file mode 100644 index 00000000..d9e28555 Binary files /dev/null and b/portal/_static/images/sphinx-logo.png differ diff --git a/portal/_static/images/unidata_150x150.png b/portal/_static/images/unidata_150x150.png new file mode 100644 index 00000000..9ddd2bea Binary files /dev/null and b/portal/_static/images/unidata_150x150.png differ diff --git a/portal/_static/images/xarray-logo.png b/portal/_static/images/xarray-logo.png new file mode 100644 index 00000000..dab01949 Binary files /dev/null and b/portal/_static/images/xarray-logo.png differ diff --git a/portal/_static/thumbnails/DC_logo_vision.png b/portal/_static/thumbnails/DC_logo_vision.png new file mode 100644 index 00000000..e6b2f3cd Binary files /dev/null and b/portal/_static/thumbnails/DC_logo_vision.png differ diff --git a/portal/_static/thumbnails/Enthought.png b/portal/_static/thumbnails/Enthought.png new file mode 100644 index 00000000..552ef1ef Binary files /dev/null and b/portal/_static/thumbnails/Enthought.png differ diff --git a/portal/_static/thumbnails/Xdev.png b/portal/_static/thumbnails/Xdev.png new file mode 100644 index 00000000..9d9a7960 Binary files /dev/null and b/portal/_static/thumbnails/Xdev.png differ diff --git a/portal/_static/thumbnails/british-columbia.jpg b/portal/_static/thumbnails/british-columbia.jpg new file mode 100644 index 00000000..27c1883c Binary files /dev/null and b/portal/_static/thumbnails/british-columbia.jpg differ diff --git a/portal/_static/thumbnails/cartopy.png b/portal/_static/thumbnails/cartopy.png new file mode 100644 index 00000000..08b5f618 Binary files /dev/null and b/portal/_static/thumbnails/cartopy.png differ diff --git a/portal/_static/thumbnails/climlablogo.png b/portal/_static/thumbnails/climlablogo.png new file mode 100644 index 00000000..eb2cf42e Binary files /dev/null and b/portal/_static/thumbnails/climlablogo.png differ diff --git a/portal/_static/thumbnails/dask.png b/portal/_static/thumbnails/dask.png new file mode 100644 index 00000000..06e61e6f Binary files /dev/null and b/portal/_static/thumbnails/dask.png differ diff --git a/portal/_static/thumbnails/eScience_Logo_HR.png b/portal/_static/thumbnails/eScience_Logo_HR.png new file mode 100644 index 00000000..f3359779 Binary files /dev/null and b/portal/_static/thumbnails/eScience_Logo_HR.png differ diff --git a/portal/_static/thumbnails/earth-lab-logo.png b/portal/_static/thumbnails/earth-lab-logo.png new file mode 100644 index 00000000..45365848 Binary files /dev/null and b/portal/_static/thumbnails/earth-lab-logo.png differ diff --git a/portal/_static/thumbnails/earth_env_data_science.png b/portal/_static/thumbnails/earth_env_data_science.png new file mode 100644 index 00000000..78fdf0dc Binary files /dev/null and b/portal/_static/thumbnails/earth_env_data_science.png differ diff --git a/portal/_static/thumbnails/geocat.png b/portal/_static/thumbnails/geocat.png new file mode 100644 index 00000000..81552571 Binary files /dev/null and b/portal/_static/thumbnails/geocat.png differ diff --git a/portal/_static/thumbnails/geopandas_icon.png b/portal/_static/thumbnails/geopandas_icon.png new file mode 100644 index 00000000..234ea954 Binary files /dev/null and b/portal/_static/thumbnails/geopandas_icon.png differ diff --git a/portal/_static/thumbnails/hvplot-wm.png b/portal/_static/thumbnails/hvplot-wm.png new file mode 100644 index 00000000..9add7d77 Binary files /dev/null and b/portal/_static/thumbnails/hvplot-wm.png differ diff --git a/portal/_static/thumbnails/matplotlib.svg b/portal/_static/thumbnails/matplotlib.svg new file mode 100644 index 00000000..6e4f4f49 --- /dev/null +++ b/portal/_static/thumbnails/matplotlib.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/portal/_static/thumbnails/metpy-mondays.jpeg b/portal/_static/thumbnails/metpy-mondays.jpeg new file mode 100644 index 00000000..2c76421c Binary files /dev/null and b/portal/_static/thumbnails/metpy-mondays.jpeg differ diff --git a/portal/_static/thumbnails/metpy.jpg b/portal/_static/thumbnails/metpy.jpg new file mode 100644 index 00000000..f570c8fd Binary files /dev/null and b/portal/_static/thumbnails/metpy.jpg differ diff --git a/portal/_static/thumbnails/numpy.png b/portal/_static/thumbnails/numpy.png new file mode 100644 index 00000000..3bef101f Binary files /dev/null and b/portal/_static/thumbnails/numpy.png differ diff --git a/portal/_static/thumbnails/pandas.png b/portal/_static/thumbnails/pandas.png new file mode 100644 index 00000000..46ec0f65 Binary files /dev/null and b/portal/_static/thumbnails/pandas.png differ diff --git a/portal/_static/thumbnails/portland-state.png b/portal/_static/thumbnails/portland-state.png new file mode 100644 index 00000000..da6308b1 Binary files /dev/null and b/portal/_static/thumbnails/portland-state.png differ diff --git a/portal/_static/thumbnails/rasterio-tutorial.png b/portal/_static/thumbnails/rasterio-tutorial.png new file mode 100644 index 00000000..6d2c2b49 Binary files /dev/null and b/portal/_static/thumbnails/rasterio-tutorial.png differ diff --git a/portal/_static/thumbnails/siphon.png b/portal/_static/thumbnails/siphon.png new file mode 100644 index 00000000..b66d071a Binary files /dev/null and b/portal/_static/thumbnails/siphon.png differ diff --git a/portal/_static/thumbnails/unidata_150x150.png b/portal/_static/thumbnails/unidata_150x150.png new file mode 100644 index 00000000..9ddd2bea Binary files /dev/null and b/portal/_static/thumbnails/unidata_150x150.png differ diff --git a/portal/_static/thumbnails/xarray.png b/portal/_static/thumbnails/xarray.png new file mode 100644 index 00000000..a38fcdbb Binary files /dev/null and b/portal/_static/thumbnails/xarray.png differ diff --git a/portal/_static/thumbnails/zero-to-pandas.png b/portal/_static/thumbnails/zero-to-pandas.png new file mode 100644 index 00000000..15afc97f Binary files /dev/null and b/portal/_static/thumbnails/zero-to-pandas.png differ diff --git a/portal/about.md b/portal/about.md new file mode 100644 index 00000000..e7069877 --- /dev/null +++ b/portal/about.md @@ -0,0 +1,60 @@ +# About Project Pythia + +Pythia is a community educational resource for helping students, scientists, +and educators learn how to analyze and visualize geosciences data using +the Scientific Python Ecosystem. + +## Project Pythia Goals + +1. _The Pythia Portal:_ A searchable online portal that + provides scientists at any point in their career with educational + content and real-world examples needed to learn how to navigate and + integrate the myriad packages within the Python ecosystem for the + geosciences. + +2. _Cloud-Deployable Pythia Platforms:_ A light-weight, + Binder-based platform that will make it possible to launch portal + content in customizable executable environments in the Cloud with + only a “single click.” + +## Content + +Project Pythia educational resources are intended to support +geoscientists with all levels of Python experience from 0 to 100: +introductory resources for those just getting started with Python, +through advanced scientific workflow development. + +### Introductory topics + +- Setting up your Python environment with Conda +- Beginning Python programming +- NumPy +- Jupyter Notebooks + +### Geoscience focused packages + +- Xarray +- MetPy +- GeoCAT + +### Scalable workflows + +- Parallel computing with Dask +- Migrating workflows to the Cloud + +## Training material + +Project Pythia will offer a full gamut of training materials: + +- Example Jupyter Notebooks & scripts +- Sample data +- Tutorials (interactive and pre-recorded) +- Communication forums + +## AMS 2021 Project Pythia Presentation + +Watch this recorded video from AMS 2021 to learn more about Project Pythia! + +
    + +
    diff --git a/portal/conf.py b/portal/conf.py new file mode 100644 index 00000000..ccca35cb --- /dev/null +++ b/portal/conf.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import datetime +import os +import shutil +import sys + +sys.path.insert(0, os.path.abspath('_extensions')) + + +# -- Project information ----------------------------------------------------- + +project = 'Project Pythia' +author = 'Project Pythia Developers & Contributors' +copyright = f'2020-{datetime.datetime.now().year}, {author}' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'myst_nb', + 'sphinx_panels', + 'pythia', + 'yaml_gallery_generator', +] + +# Define what extensions will parse which kind of source file +source_suffix = { + '.ipynb': 'myst-nb', + '.myst': 'myst-nb', +} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_pythia_theme' +html_theme_path = ['..'] +html_last_updated_fmt = '%d %B %Y' + +# Logo & Title +html_logo = '_static/images/logos/pythia_logo-white-rtext.svg' +html_title = '' + +# Favicon +html_favicon = '_static/images/icons/favicon.ico' + +# Permalinks Icon +html_permalinks_icon = '' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['custom.css'] +# html_js_files = ['custom.js'] + +# HTML Theme-specific Options +html_theme_options = { + 'onepagers': [ + 'index', + ], + 'logos_bar': { + 'NCAR': '/_static/images/logos/NCAR-contemp-logo-blue.svg', + 'Unidata': '/_static/images/logos/Unidata_logo_horizontal_1200x300.svg', + 'UAlbany': '/_static/images/logos/UAlbany-A2-logo-purple-gold.svg', + }, + 'sponsor_text': 'This material is based upon work supported by the National Science Foundation under Grant Nos. 2026863 and 2026899. Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation.', + 'sponsor_logo': '/_static/images/logos/footer-logo-nsf.png', +} + +# Disable sidebars on all Portal Pages +html_sidebars = { + '**': [], +} + +# Panels config +panels_add_bootstrap_css = False + +# MyST config +myst_enable_extensions = ['amsmath', 'colon_fence', 'deflist', 'html_image'] +myst_url_schemes = ('http', 'https', 'mailto') +jupyter_execute_notebooks = 'off' + +# CUSTOM SCRIPTS ============================================================== + +# Copy root files into content pages ------------------------------------------ + +shutil.copyfile('../CODEOFCONDUCT.md', 'code_of_conduct.md') diff --git a/portal/contributing.md b/portal/contributing.md new file mode 100644 index 00000000..8ce75c4c --- /dev/null +++ b/portal/contributing.md @@ -0,0 +1,475 @@ +# Contributor's Guide + +## Overview + +Welcome! This is the main contributors guide for Project Pythia. +Project Pythia is an open community, and all contributions are +welcome following our [Code of +Conduct](https://projectpythia.org/pages/code_of_conduct.html). All +of the content for Project Pythia is hosted on GitHub in a number +of different public repositories. From this document you can learn +about the many ways that you can contribute to this community +project, and where you can find additional information. In many +cases pertinent details may be found in repository-specific +contributors guides **that should always be consulted in addition +to this guide**. More on this topic later. + +## The many ways to contribute + +### Starting a conversation + +One of the easiest ways to contribute is to communicate with the +Project Pythia community. You might, for example, suggest changes +to content on the site, ask a clarifying question, or even respond +to another community member’s question. There are a number of ways +to have a dialogue with the Pythia community, such as by opening a +GitHub issue, but the easiest method is to simply create (or respond +to) a post on our [discussion +forum](https://github.com/ProjectPythia/projectpythia.github.io/discussions). + +### Add content to the External Links Gallery + +The Project [Pythia External Links +Gallery](https://projectpythia.org/pages/links.html) contains a +collection of links to useful resources that were created and are +hosted outside of Project Pythia. Some examples include: documentation +and tutorials for iconic packages such as Matplotlib, Cartopy, and +Xarray; on-line courses from universities and other educational +institutions; and Jupyter Notebook galleries assembled and maintained +by a variety of other sites. Project Pythia makes it possible to +filter and search the External Links Gallery in a number of ways +to ease finding relevant content. We encourage the community to +consider submitting your own geoscience education material links +to Project Pythia. + +Contributing a new link is easy with these three simple steps: + +1. Navigate your web browser to the main Project Pythia repo's “issue” page [here](https://github.com/ProjectPythia/projectpythia.github.io/issues). +1. Click on the button that says “New issue”. +1. Click on the “Get started” button in the row labeled “Update external links gallery ”, and follow the instructions presented. + +Alternatively, you can simply do: + +1. Navigate to the External Links Gallery. +1. Click the `Submit a Link` button, which will redirect you to a new PR template as described in step (3) above. + +That’s all you need to do. Your request will be reviewed, and you +will be notified once your content has been accepted or if changes +are requested. + +### Add a new Jupyter Notebook to Pythia Foundations + +[Project Pythia Foundations](https://foundations.projectpythia.org) +is a collection of material that the Pythia team believes is essential +knowledge for geoscientists to effectively use the Scientific Python +Ecosystem. The Pythia Foundations content is hosted on a separate +[GitHub repo](https://github.com/ProjectPythia/pythia-foundations), +and contributors should consult the contributor’s guide there for +information specific to Foundations. However, adding new, or changing +existing Foundations content requires contributors to be familiar +with a few technologies and workflows, described in Advanced +Contributions below. + +### Pythia Portal + +The Pythia Portal contains most of the infrastructure for supporting +Project Pythia. It is not expected that external contributors will +want to make contributions directly to the Pythia Portal repository. +Nevertheless, detailed information on how to contribute to the main +Project Pythia repository can be found in the `CONTRIBUTING.md` +file located in the root directory of the [Pythia Portal +GitHub](https://github.com/ProjectPythia/projectpythia.github.io) +repository. + +### Advanced Contributions + +Some contributions, such as adding a new Jupyter Notebook, or making +changes to an existing one, require operating directly on the GitHub +repository that maintains the desired source material. In the +parlance of GitHub, contributors are required to “fork a repo”, and +“submit a pull request”. This process, though widely used by open +development projects, is unfortunately complex and somewhat varied +from one project to another. Below, we describe in great detail the +process of setting up GitHub/Git, installing and configuring conda, +and submitting a PR. Note, while this information is common to all +Pythia repositories, repo-specific information might be required. + +In all cases contributors should consult the repo-specific contributor’s +guide for their target repository. + +Repo-specific guides can be found in the file named `CONTRIBUTING.md`, located in the top level directory of each repository, or by clicking on the menu item labeled “Contributor’s Guide” found in the rendered content generated by each repository. + +Lastly, much of this information has been co-opted from the [GeoCAT +project](https://geocat.ucar.edu/pages/contributing.html). + +## Ready, set, fork! + +As noted above contributing directly to a GitHub repository that +is not owned by you is a somewhat complicated process that involves +a number of technologies. In the paragraphs below we describe the +process of "forking" an external repository, making changes, and +submitting your changes back to the owners of the external repository. +But first we discuss how to configure your Python environment with the +conda (anaconda) package manager, and how to configure Git and GitHub. These +are one-time steps that you should not need to perform again. + +It's a long journey, but the steps we describe below are common to many, many +open source projects hosted on GitHub. + +### Getting started with GitHub and Git + +Contributing to one of Pythia’s repos requires using GitHub, as +already mentioned, and also Git. The latter, Git, is an open source, +command line tool for collaborative software version control, while +GitHub is an online, web-accessible service that greatly simplifies +using the powerful, yet often complex, Git. + +```{Note} +GitHub operates entirely within a web browser. You do not +need to install anything, but you will need to set up a free GitHub +account. Git is a command line tool that is most likely already +installed on your machine, and will need to be run from a “terminal” window, AKA +a “shell”. +``` + +Using, and even just configuring, Git and GitHub are often the most +daunting aspects of contributing to a GitHub hosted project. Here +are the basic steps for Git/GitHub configuration, all of which must +be performed before the next subsection, forking a repo. + +#### GitHub Setup + +Create a free GitHub account [here](https://github.com/). Note +GitHub offers free personal use and paid enterprise accounts. The +free account is all that is needed. + +#### Git Setup + +If not already installed on your machine, download and install the +[latest version of Git](https://git-scm.com/downloads) . Set up +Git with a user name and your email using the steps below. Note, +it is advisable that you use the same user name/email as you did +when setting up your GitHub account, though technically this may +not be necessary. Once git is installed you will need to open a +terminal/shell and type the following commands to configure git: + +``` +$ git config --global user.name "Your name here" +$ git config --global user.email "your_email@example.com" +``` + +Don’t type the \$. This simply indicates the command line prompt. + +#### Configure your environment to authenticate with GitHub from Git + +This is a complicated process and there are two authentication +protocols supported: HTTP or SSH. Either will work fine, but we +find HTTP to be the easiest to set up. Both processes are described +in detail on the GitHub site [here](https://docs.github.com/en/github/getting-started-with-github/set-up-git#next-steps-authenticating-with-github-from-git). + +For further reading see the [GitHub Getting Started +Guide](https://docs.github.com/en/github/getting-started-with-github). + +### Creating a Python environment that will work with Pythia + +Before starting any development, you’ll need to create an isolated +Python environment that will work for Pythia. When we use the term +“Python environment” here we are referring to the Python programming +language plus the myriad packages that go along with it. Because +there are so many Python packages available, maintaining interoperability +between them is a huge challenge. To overcome some of these +difficulties the use of Anaconda or miniconda is required to manage +your Python ecosystem. These package managers allow you to create +a separate, custom Python environment for each specific Python set +of tools. Yes, this unfortunately results in multiple copies of +Python on your system, but it greatly reduces breaking toolchains +whenever a change is made to your Python environment (and is more +reliable than any other solution we’ve encountered). Also, the use +of Anaconda/Miniconda is standard practice for working with Python +in general, not simply for using Pythia. + +The steps: + +1. Install either Anaconda or miniconda +1. Make sure your conda is up to date by running this command from the terminal: + +``` +conda update conda +``` + +At this point you have a current version of conda available on your +desktop or laptop. Before using your conda environment to work on +Pythia content, you'll need to perform an addtional one-time setup +that is specific to each Pythia repo. After the one-time configuration is +complete you will need to "activate" a repo-specific environment whenever +you wish to use it. Consult the repo-specific contributor’s guide +for information on “Building the site”, and +follow the steps described therein. + +```{Note} +Repository-specific contributor's +information can always be accessed by navigating your web browser +to the appropriate Project Pythia GitHub repository, +[here](https://github.com/ProjectPythia/pythia-foundations) for +example, and clicking on the file named `CONTRIBUTING.md` +``` + +More information on installing and using conda may be found +[here](https://foundations.projectpythia.org/foundations/conda.html). + +### Forking a repo + +With Git, GitHub, and conda properly installed and configured, we are ready to +"fork" a repository so +that you can safely make changes to the repository contents without +changing the Pythia repos until you are ready. Forking a repository +as described below creates a clone of the Pythia repo under your +own account on GitHub. Any changes you make to your repository will +only be seen by you until you are ready to share them with others, +and hopefully “merge” your changes into one of the official Pythia +repositories. + +Note that the Pythia maintainers employ a version of the “Forking Workflow” +to support contributions from the outside world. This workflow is +summarized below, and described in detail +[here](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow). + +The steps: + +1. Navigate your web browser to the Pythia repository that you wish + to contribute to. For example, [here](https://github.com/ProjectPythia/pythia-foundations). +1. Click on the “Fork” icon (upper right). This will create a copy of the Pythia repository + on the GitHub server under **your** account name. You may be prompted + to sign in. If so, use the GitHub (not Git) account name and password + that you created when you created your GitHub account above. +1. After successfully forking a Pythia repo you should have a copy + of that repository on the GitHub server under your account name. + To verify this you can navigate to the GitHub [home page](https://github.com/), sign in if you are not + already, and click on “your repositories” under the pull down menu + in the top right corner of the page. You should see the Pythia + repository you just cloned listed. Click on it. This is a remote + clone of the Pythia repo. Changes you make to your copy will not + impact the contents of the Pythia repo. The next step is to make a + local copy (clone) of the just-cloned GitHub repository on your + laptop or workstation. + +That’s right. After this final step you will now have **two** copies +of the repo, one local and one remote. From a terminal window type: + +``` +$ git clone https://github.com/YOUR_USER_NAME/PYTHIA_REPO_NAME.git +$ cd PYTHIA_REPO_NAME +``` + +where `YOUR_USER_NAME` is your GitHub user name, and `PYTHIA_REPO_NAME` +is the name of the Pythia repository that you wish to copy, for +example, **pythia-foundations**. + +The git command above does two things, and it is important to +understand them. Firstly, it creates a local repository inside of +the hidden directory `PYTHIA_REPO_NAME/.git`, that is populated with +the contents of the repository you are cloning. You should never +need to operate directly on the contents of the .git directory. +Secondly, it creates a copy of the repo’s assets (e.g. Python files, +documentation, etc.) in the local directory `PYTHIA_REPO_NAME`. The files in this latter directory are the ones that you will edit. + +Remember: you now essentially have two clones of the `PYTHIA_REPO_NAME` repository, one +on the GitHub server under your account, and one on your local +workstation or laptop. + +Next, connect your local copy of the repository to the “upstream” (remote) Pythia repository: + +``` +$ git remote add upstream https://github.com/ProjectPythia/PYTHIA_REPO_NAME.git +``` + +Finally, create a new branch in your local repository: + +``` +$ git checkout -b YOUR_BRANCH_NAME +``` + +Where `YOUR_BRANCH_NAME` is the name that you want to give your local +branch. What name should you choose? If the work that you are doing +is associated with a GitHub issue you should follow the convention: + +_issue_XXX_ + +Where _XXX_ is the GitHub issue number. If it is not associated with a Pythia GitHub issue, pick something short and meaningful, e.g. “documentation_cleanup”. + +You can now make changes to your local copy of the Pythia repo +without having those changes affect either the remote Pythia GitHub +repo, your remote, personal GitHub repo, or your local repo in .git, +until you are ready to merge your local changes upstream, first to +your .git local repo, then to your remote GitHub repo, and then +ultimately to the remote Pythia GitHub repo. Simple, right? More +on this later. + +For further information see the [GitHub docs on forking a repo](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo). + +```{Note} +At this point you should have a local copy of the repository +in your current working directory. You can safely make changes to +any of the contents. Once you are ready to contribute your changes +back to the Pythia repository you will need to submit a Pull Request +(PR), described later. +``` + +### Make your local changes + +At this point you should be able to make your desired changes to +the local copies of your files. **Always consult the repo-specific contributor’s +guide for information specific to the repo you are working on.** + +### Submit a Pull Request (PR) + +Once you have completed making changes to your local copy of a +Pythia repository and are ready to have your changes merged with a +Pythia repository on GitHub, you need to essentially perform the +reverse process used to acquire a copy of the Pythia repo, and +submit a PR asking the Pythia maintainers to consider your merge +request. The merge will occur between your personal GitHub repository +and the Pythia GitHub repository, so you first need to merge any +changes you’ve made in your local copy into your local .git repo. +Next, you need to merge these local changes with your personal +remote repo on GitHub. Finally, you need to submit a request to +merge your personal GitHub repo with the Pythia GitHub repo. + +Git has lots and lots of commands, each with lots and lots of +options. Here we only cover the very basics. Detailed information +about Git can be found [here](https://git-scm.com/), but your best +friend for figuring out to do things with Git may be Google, and +in particular [StackOverflow](https://stackoverflow.com/). + +#### Committing Your Code Locally with Git + +Changes you’ve made to your local copy of a repository must be +“committed” (merged) to your local repository (the .git subdirectory) +using Git. You can see any uncommitted changes you’ve made to your +local copy of the repository by running the following command from +anywhere (any directory) within the directory where you ran git +checkout: + +``` +$ git status +``` + +If you have added any new files you will need to explicitly add +them to the local repo with: + +``` +$ git add PATH_TO_NEW_FILE +``` + +Where `PATH_TO_NEW_FILE` is the path name of the newly created file. + +To commit changed files, including new files just added with the above command, run the following command from the root of your local copy: + +``` +$ git commit PATH_TO_NEW_FILE +``` + +Which will prompt you for a log message. Please provide something informative. If you make lots of changes, it is best to make multiple commits, broken up into related chunks. E.g. “fixed x”, “added documentation”, “added testing”. + +```{Note} +When executing `git commit` after `git add PATH_TO_NEW_FILE`, +specifying the path to the new file isn't stricly necessary. However, +in other instances the file path argument is required. We include it +here to keep things simple. +``` + +Depending on which repo you are making changes to, a `pre-commit` +[hook](https://www.atlassian.com/git/tutorials/git-hooks) +may be enabled that will validate your changes and even make changes +on its own (such as cleaning up code formatting). If the _hook_ makes +any changes you may need to run `git commit PATH_TO_NEW_FILE` a second time to commit the +changes made by the _hook_, +or possibly make manual changes yourself. A good practice is to run + +``` +$ git status +``` + +after your `commit` to verify everything looks as expected. + +```{Note} +`pre-commit` _hooks_ can sometimes be difficult to satisfy. You +can always tell **git** not to run the _hook_ by +running `git commit --no-verify`. +This will allow you to submit your changes (see steps) below, and get help +later from a Project Pythia maintainer. +``` + +#### Pushing Your Changes to Your Personal GitHub Repository + +Once all of your changes have been committed to your local .git +repository you are ready to “push” (merge) them with your personal +GitHub repository. To push your .git repository run the following +command from anywhere within your local copy of the repo: + +``` +$ git push origin FEATURE_NAME +``` + +Where `FEATURE_NAME` is the name you gave your branch when you checked +it out before starting to make your changes. Typically, if you are +submitting a PR for a change that addresses an open Pythia issue, +the name should be _issue_XXX_ where _XXX_ is the issue number. + +After successfully running this command your changes will now be +on GitHub under your personal account, but they are not yet part +of the Pythia repo. For that to happen one more step is required: +you must **Make the PR**. + +But first: + +#### Review your Code + +Before you make the actual PR, it is a good idea to review the +changes that you’ve made and to have followed all guidelines in +this document, and any repo-specific guidelines. + +To review your changes against the official Pythia repository do the following: + +1. Navigate your web browser to your GitHub repository. E.g. + https://github.com/YOUR_USER_NAME/pythia-foundations +1. Click on `Compare` +1. Check the `head repository` and `compare` branches are set correctly. + These should be `YOUR_NAME/PYTHIA_REPO_NAME`, and `BRANCH_NAME`, + respectively, where `BRANCH_NAME` is the name you gave your branch + when you pushed your changes to your remote repository on GitHub. + +Select the “base repository” and “base”. For “base repository” this +should be the Pythia repository, for example `ProjectPythia/pythia-foundations`. +For “base” this should be the branch on the Pythia repository that +you wish to compare against (and subsequently merge with). + +At this point you should be able to review changes between your +repositories and the GitHub repository. + +#### Make the PR + +At long last you are ready to make the actual PR, requesting the +Pythia community to review your code, make possible suggestions for +changes, and ultimately merge your repo with Pythia. To submit a +pull request: + +Navigate your web browser to your GitHub repository. E.g. https://github.com/YOUR_USER_NAME/pythia-foundations + +Click on the "Pull Request" button + +Write a description of your changes in the “Preview Discussion” tab. Give an overview of what this PR does, and be sure to indicate any Pythia issues that this PR addresses by number. + +Click "Send Pull Request" + +This request then goes to the repository maintainers, and they will +review the code. If you need to make more changes, you can make +them in your branch, add them to a new commit, push them to GitHub, +and the pull request will be automatically updated. Pushing them +to GitHub again is done with the command: + +``` +$ git push origin FEATURE_NAME +``` + +Congratulations!!! You've submitted a PR! diff --git a/portal/discussion.md b/portal/discussion.md new file mode 100644 index 00000000..5c57967d --- /dev/null +++ b/portal/discussion.md @@ -0,0 +1,4 @@ +# Talk to us! + +If you have questions or want to share anything with the [Project Pythia Team](people.md), +please reach out to us on our [GitHub Discussions page](https://github.com/ProjectPythia/projectpythia.github.io/discussions). diff --git a/portal/foundations.md b/portal/foundations.md new file mode 100644 index 00000000..8d1b1b15 --- /dev/null +++ b/portal/foundations.md @@ -0,0 +1,5 @@ +# Project Pythia Foundations + +We are currently developing a **comprehensive set of tutorials** covering the **foundational skills** everyone needs to get started with **scientific computing in the open-source Python ecosystem**. These foundational tutorials will serve as **common references** for more advanced and domain-specific content to be housed here in the Pythia Portal. + +You can find the _under-construction_ Foundations content at . diff --git a/portal/gallery.yaml b/portal/gallery.yaml new file mode 100644 index 00000000..e3ec4236 --- /dev/null +++ b/portal/gallery.yaml @@ -0,0 +1,796 @@ +- title: Your First Python Tutorial + url: https://ncar.github.io/python-tutorial/index.html + description: | + A tutorial for getting started with Python aimed at scientists with experience in at least one other coding language. Designed to teach you Python, not package specific syntax. + authors: + - name: Xdev Team + email: xdev@ucar.edu + url: https://ncar.github.io/xdev/ + affiliation: NCAR + affiliation_url: https://ncar.ucar.edu/ + thumbnail: /_static/thumbnails/Xdev.png + tags: + packages: + - pure python + formats: + - video + +- title: Unidata Python Training + url: https://unidata.github.io/python-training/python/intro-to-python/ + description: | + Introduction to Python for Atmospheric Science & Meteorology. Unidata is working to create a collection of online training materials focused on the use of Python in the atmospheric sciences. While our examples and scenarios may feature Unidata tools and data technologies, our aim is to present a generic set of freely available tools that are generally useful to scientists, educators, and students in the geosciences, broadly defined. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/unidata_150x150.png + tags: + formats: + - course + +- title: Unidata Python Workshop - Jupyter Notebooks Introduction + url: https://unidata.github.io/python-training/workshop/Jupyter_Notebooks/jupyter-notebooks-introduction/ + description: | + Jupyter notebooks are a great way to have code, output, images, video, and other information in one place. Notebooks are an ideal tool for the student, research scientist, and even software developer. In this lesson we will go over the basic features of Jupyter notebooks and how to use them. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/unidata_150x150.png + tags: + packages: + - jupyter + +- title: An Introduction to Earth and Environmental Data Science + url: https://earth-env-data-science.github.io/intro + description: | + This book grew out of a course developed at Columbia University called Research Computing in Earth Science. It was written mostly by Ryan Abernathey, with significant contributions from Kerry Key. By separating the book from the class, we hope to create an open-source community resource for python education in the Earth and Environmental Sciences. + authors: + - name: Ryan Abernathey + affiliation: Lamont-Doherty Earth Observatory + - name: Kerry Key + affiliation: Lamont-Doherty Earth Observatory + thumbnail: /_static/thumbnails/earth_env_data_science.png + tags: + formats: + - course + +- title: The Climate Laboratory + url: https://brian-rose.github.io/ClimateLaboratoryBook/home + description: | + A hands on approach to climate physics and climate modeling. Fundamental climate processes are introduced through interactive and reproducible Python-based modeling exercises. This JupyterBook serves as a course textbook at the University of Albany. + authors: + - name: Brian Rose + url: http://www.atmos.albany.edu/facstaff/brose/ + affiliation: University of Albany + thumbnail: /_static/thumbnails/climlablogo.png + tags: + formats: + - course + - book + domains: + - climate science + - atmospheric science + packages: + - climlab + +- title: Earth Analytics Python Course + url: https://www.earthdatascience.org/courses/earth-analytics-python/ + description: | + Earth analytics is an intermediate, multidisciplinary course that addresses major questions in Earth science and teaches students to use the analytical tools necessary to undertake exploration of heterogeneous ‘big scientific data’. This course is designed for graduate students and students participating in the Earth Data Analytics Professional Certificate. + authors: + - name: Earth Lab + url: https://www.earthdatascience.org/ + affiliation: University of Colorado Boulder + thumbnail: /_static/thumbnails/earth-lab-logo.png + tags: + formats: + - course + +- title: Earth Data Science + url: https://www.earthdatascience.org/ + description: | + This site contains open, tutorials and course materials covering topics including data integration, GIS and data intensive science. + authors: + - name: Earth Lab + affiliation: University of Colorado Boulder + thumbnail: /_static/thumbnails/earth-lab-logo.png + tags: + formats: + - course + +- title: Geohackweek 2019 + url: https://geohackweek.github.io/ + description: | + Geohackweek is a 5-day hackweek to be held at the University of Washington eScience Institute. Tutorials from the hackweek are available for everyone to follow (participants and non-participants alike). + authors: + - name: eScience Institute + url: https://escience.washington.edu/ + affiliation: University of Washington + thumbnail: /_static/thumbnails/eScience_Logo_HR.png + tags: + formats: + - course + +- title: Research Software Engineering with Python + url: https://merely-useful.github.io/py-rse/ + description: | + We believe every researcher should know how to write short programs that clean and analyze data in a reproducible way and how to use version control to keep track of what they have done. But just as some astronomers spend their careers designing telescopes, some researchers focus on building the software that makes research possible. People who do this are called research software engineers; the aim of this book is to get you ready for this role by helping you go from writing code for yourself to creating tools that help your entire field advance. + authors: + - name: Damien Irving, et al. + thumbnail: + tags: + formats: + - course + +- title: Data Analysis with Python- Zero to Pandas + url: https://jovian.ai/learn/data-analysis-with-python-zero-to-pandas + description: | + "Data Analysis with Python: Zero to Pandas" is a practical and beginner-friendly introduction to data analysis covering the basics of Python, Numpy, Pandas, Data Visualization, and Exploratory Data Analysis. + authors: + - name: Jovian.ai + url: https://www.jovian.ai/ + thumbnail: /_static/thumbnails/zero-to-pandas.png + tags: + formats: + - course + +- title: MTH271- Mathematical Computing with Data + url: http://web.pdx.edu/~gjay/teaching/mth271_2020/html/_CONTENTS.html + description: | + In this course, we will have multiple occasions to procure, analyze, and visualize data. We will study mathematical and statistical techniques to discern patterns in complex data. We shall do so in an ecosystem of python computing modules developed by open-source enthusiasts worldwide. + authors: + - name: Jay Gopalakrishnan + url: http://web.pdx.edu/~gjay/ + affiliation: Portland State University + thumbnail: /_static/thumbnails/portland-state.png + tags: + formats: + - course + +- title: ATSC301- Atmospheric Radiation and Remote Sensing + url: https://clouds.eos.ubc.ca/~phil/courses/atsc301/ + description: | + This course teaches radiation and remote sensing, but also covers: how to write clear, documented and tested code that can ingest, manipulate and display data, and how to turn equations into computer algorithms in Python. + authors: + - name: Philip Austin + email: paustin@eos.ubc.ca + affiliation: University of British Columbia + thumbnail: /_static/thumbnails/british-columbia.jpg + tags: + formats: + - course + domains: + - remote sensing + +- title: Introduction to Geospatial Concepts + url: https://datacarpentry.org/organization-geospatial/ + description: | + The goal of this lesson is to provide an introduction to core geospatial data concepts. It is intended for learners who have no prior experience working with geospatial data, and as a pre-requisite for the R for Raster and Vector Data lesson . This lesson can be taught in approximately 75 minutes and covers the following topics: Introduction to raster and vector data format and attributes, examples of data types commonly stored in raster vs vector format, an introduction to categorical vs continuous raster data and multi-layer rasters, an introduction to the file types and R packages used in the remainder of this workshop, an introduction to coordinate reference systems and the PROJ4 format, and an overview of commonly used programs and applications for working with geospatial data. + authors: + - name: The Carpentries + url: https://carpentries.org/ + thumbnail: /_static/thumbnails/DC_logo_vision.png + tags: + formats: + - course + +- title: Dani Arribas-Bel Course Repositories + url: http://darribas.org/materials.html + description: | + A collection of courework repositories for various data science classes taught by Dani Arribas-Bel. + authors: + - name: Dani Arribas-Bel + affiliation: University of Liverpool Department of Geography and Planning + affiliation_url: https://www.liverpool.ac.uk/geography-and-planning/ + thumbnail: + tags: + formats: + - course + domains: + - data science + +- title: Cartopy Documentation + url: https://scitools.org.uk/cartopy/docs/latest/ + description: | + Cartopy is a Python package designed for geospatial data processing in order to produce maps and other geospatial data analyses. + authors: + - name: UK Met Office + thumbnail: /_static/thumbnails/cartopy.png + tags: + packages: + - cartopy + formats: + - documentation + +- title: Cartopy Gallery + url: https://scitools.org.uk/cartopy/docs/latest/gallery/index.html + description: | + Visual examples demonstrating some of the functionality of Cartopy, particularly its matplotlib interface. + authors: + - name: UK Met Office + thumbnail: /_static/thumbnails/cartopy.png + tags: + packages: + - cartopy + formats: + - gallery + +- title: Contextily Documentation + url: https://contextily.readthedocs.io + description: | + contextily is a small Python 3 (3.6 and above) package to retrieve tile maps from the internet. It can add those tiles as basemap to matplotlib figures or write tile maps to disk into geospatial raster files. Bounding boxes can be passed in both WGS84 (EPSG:4326) and Spheric Mercator (EPSG:3857). + authors: + - name: Dani Arribas-Bel & Contexily Contributors + thumbnail: + tags: + packages: + - contextily + formats: + - documentation + - gallery + +- title: Contextily Tutorial + url: https://contextily.readthedocs.io/en/latest/intro_guide.html + description: | + Welcome to the taster guide for contextily, the package for contextual tiles in Python. In this notebook, we will show the basic functionality available in contextily, a package to work with web-tiles for background maps. To do that, we will use additional data to illustrate contextily can be integrated with other libraries such as geopandas and rasterio. + authors: + - name: Dani Arribas-Bel & Contexily Contributors + thumbnail: + tags: + packages: + - contextily + formats: + - tutorial + +- title: Dask + url: https://dask.org + description: | + Dask provides advanced parallelism for analytics, enabling performance at scale for the tools you love. + authors: + - name: Dask core developers + thumbnail: /_static/thumbnails/dask.png + tags: + packages: + - dask + formats: + - documentation + +- title: Dask Tutorial + url: https://tutorial.dask.org/ + description: | + Dask is a parallel computing library that scales the existing Python ecosystem. This tutorial will introduce Dask and parallel data analysis more generally. + authors: + - name: Dask Developers + thumbnail: /_static/thumbnails/dask.png + tags: + packages: + - dask + formats: + - tutorial + +- title: GeoCAT Tutorial + url: https://geocat-comp.readthedocs.io/en/latest/examples.html + description: | + The examples below show GeoCAT-comp functions being utilized in real-world use cases. They also demonstrate how GeoCAT-comp can be used to make plots with Matplotlib (using Cartopy) and PyNGL (work in progress). + authors: + - name: GeoCat + url: https://geocat.ucar.edu/ + affiliation: NCAR + affiliation_url: https://ncar.ucar.edu/ + thumbnail: /_static/thumbnails/geocat.png + tags: + packages: + - geocat-comp + formats: + - tutorial + +- title: GeoCAT Gallery + url: https://geocat-examples.readthedocs.io/ + description: | + A gallery of plotting examples from GeoCat. + authors: + - name: GeoCAT + url: https://geocat.ucar.edu/ + affiliation: NCAR + affiliation_url: https://ncar.ucar.edu/ + thumbnail: /_static/thumbnails/geocat.png + tags: + packages: + - geocat-comp + - geocat-viz + formats: + - gallery + +- title: GeoPandas Documentation + url: https://geopandas.org + description: | + GeoPandas is an open source project to make working with geospatial data in python easier. GeoPandas extends the datatypes used by pandas to allow spatial operations on geometric types. Geometric operations are performed by shapely. Geopandas further depends on fiona for file access and matplotlib for plotting. + authors: + - name: GeoPandas developers + thumbnail: /_static/thumbnails/geopandas_icon.png + tags: + packages: + - geopandas + formats: + - documentation + +- title: GeoPandas Gallery + url: https://geopandas.org/gallery/index.html + description: | + Examples that show off the functionality in GeoPandas. They highlight many of the things you can do with this package, and show off some best-practices. + authors: + - name: GeoPandas developers + thumbnail: /_static/thumbnails/geopandas_icon.png + tags: + packages: + - geopandas + formats: + - gallery + +- title: hvPlot + url: https://hvplot.holoviz.org/ + description: | + hvPlot provides a high-level plotting API built on HoloViews that provides a general and consistent API for plotting data in all the abovementioned formats. hvPlot can integrate neatly with the individual libraries if an extension mechanism for the native plot APIs is offered, or it can be used as a standalone component. + authors: + - name: HoloViz developers + url: https://holoviz.org/ + thumbnail: /_static/thumbnails/hvplot-wm.png + tags: + packages: + - hvPlot + formats: + - documentation + +- title: hvPlot Tutorial + url: https://hvplot.holoviz.org/user_guide/index.html + description: | + The user guide provides a detailed introduction to the API and features of hvPlot. In the Introduction you will learn how to activate the plotting API and start using it. Next you will learn to use the API for tabular data and get an overview of the types of plots you can generate and how to customize them; including how to customize interactivity using widgets. Next is an overview on how to display and save plots in the notebook, on the commandline, and from a script. Another section will introduce you to generating subplots from your data. Once the basics are covered you can learn how to use the plotting API for specific types of data including streaming data, gridded data network graphs, geographic data, and timeseries data. + authors: + - name: HoloViz developers + url: https://holoviz.org/ + thumbnail: /_static/thumbnails/hvplot-wm.png + tags: + packages: + - hvPlot + formats: + - tutorial + +- title: hvPlot Gallery + url: https://hvplot.holoviz.org/reference/index.html + description: | + Incomplete Reference Gallery containing some small examples of different plot types using hvPlot. + authors: + - name: HoloViz developers + url: https://holoviz.org/ + thumbnail: /_static/thumbnails/hvplot-wm.png + tags: + packages: + - hvPlot + formats: + - gallery + +- title: Ipyleaflet + url: https://ipyleaflet.readthedocs.io + description: | + Interactive maps in the Jupyter notebook. + authors: + - name: The Jupyter development team + thumbnail: + tags: + packages: + - ipyleaflet + formats: + - documentation + +- title: Matplotlib + url: https://matplotlib.org/ + description: | + Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. + authors: + - name: the Matplotlib development team + thumbnail: /_static/thumbnails/matplotlib.svg + tags: + packages: + - matplotlib + formats: + - documentation + +- title: Matplotlib Tutorial + url: https://matplotlib.org/stable/tutorials/index.html + description: | + This page contains more in-depth guides for using Matplotlib. It is broken up into beginner, intermediate, and advanced sections, as well as sections covering specific topics. + authors: + - name: the Matplotlib development team + thumbnail: /_static/thumbnails/matplotlib.svg + tags: + packages: + - matplotlib + formats: + - tutorial + +- title: Matplotlib Gallery + url: https://matplotlib.org/stable/gallery/index.html + description: | + This gallery contains examples of the many things you can do with Matplotlib. + authors: + - name: the Matplotlib development team + thumbnail: /_static/thumbnails/matplotlib.svg + tags: + packages: + - matplotlib + formats: + - gallery + +- title: MetPy + url: https://unidata.github.io/MetPy/latest/index.html + description: | + MetPy is a collection of tools in Python for reading, visualizing, and performing calculations with weather data. + authors: + - name: MetPy developers + affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/metpy.jpg + tags: + packages: + - metpy + formats: + - documentation + +- title: MetPy Tutorial + url: https://unidata.github.io/MetPy/latest/tutorials/index.html + description: | + This collection of tutorials (under development) demonstrates the use of MetPy to perform common meteorological tasks. + authors: + - name: MetPy developers + affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/metpy.jpg + tags: + packages: + - metpy + formats: + - tutorial + +- title: Unidata Python Workshop- MetPy + url: https://unidata.github.io/python-training/workshop/Metpy_Introduction/introduction-to-metpy/ + description: | + MetPy is a modern meteorological open-source toolkit for Python. It is a maintained project of Unidata to serve the academic meteorological community. MetPy consists of three major areas of functionality: plots, calculations, and file i/o. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/unidata_150x150.png + tags: + packages: + - metpy + formats: + - tutorial + +- title: MetPy Gallery + url: https://unidata.github.io/MetPy/latest/examples/index.html + description: | + Examples of using a variety of MetPy’s functionality together. + authors: + - name: MetPy Developers + affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/metpy.jpg + tags: + packages: + - metpy + formats: + - gallery + +- title: Unidata Gallery + url: https://unidata.github.io/python-training/gallery/gallery-home/ + description: | + Check out detailed examples for atmospheric science and meteorology, from data analysis to publication-quality figures. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/unidata_150x150.png + tags: + domains: + - atmospheric science + formats: + - gallery + +- title: Unidata MetPy Mondays + url: https://www.youtube.com/playlist?list=PLQut5OXpV-0ir4IdllSt1iEZKTwFBa7kO + description: | + A weekly video series showing how to use MetPy or other Python libraries to solve problems relevant to geoscience applications. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/metpy-mondays.jpeg + tags: + packages: + - metpy + formats: + - video + +- title: Numpy + url: https://numpy.org + description: | + The fundamental package for scientific computing with Python. + authors: + - name: NumPy + thumbnail: /_static/thumbnails/numpy.png + tags: + packages: + - numpy + formats: + - documentation + +- title: Numpy Tutorials + url: https://numpy.org/learn/ + description: | + A curated collection of external resources teaching numpy from beginner to advanced uses. + authors: + - name: NumPy + thumbnail: /_static/thumbnails/numpy.png + tags: + packages: + - numpy + +- title: Unidata Numpy Workshop + url: https://unidata.github.io/python-training/workshop/NumPy/numpy-basics/ + description: | + Unidata Numpy tutorial that covers how to create an array of ‘data’, perform basic calculations on this data using python math functions, and slice and index the array. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/unidata_150x150.png + tags: + packages: + - numpy + formats: + - tutorial + +- title: Intro to Numerical Computing with NumPy + url: https://youtu.be/ZB7BZMhfPgk + description: | + NumPy provides Python with a powerful array processing library and an elegant syntax that is well suited to expressing computational algorithms clearly and efficiently. We'll introduce basic array syntax and array indexing, review some of the available mathematical functions in NumPy, and discuss how to write your own routines. Along the way, we'll learn just enough about matplotlib to display results from our examples. + authors: + - name: A. Chabot-LeClerc + affiliation: Enthought + affiliation_url: https://www.enthought.com/ + thumbnail: /_static/thumbnails/Enthought.png + tags: + packages: + - numpy + formats: + - video + +- title: Pandas + url: https://pandas.pydata.org/ + description: | + Pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language. + authors: + - name: Pandas Development Team + thumbnail: /_static/thumbnails/pandas.png + tags: + packages: + - pandas + formats: + - documentation + +- title: Pandas Tutorials + url: https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html + description: | + Tutorial for getting started with pandas. + authors: + - name: Pandas Development Team + thumbnail: /_static/thumbnails/pandas.png + tags: + packages: + - pandas + formats: + - tutorial + +- title: Pandas Gallery + url: https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html + description: | + A gallery of example pandas functionality. + authors: + - name: Pandas Development Team + thumbnail: /_static/thumbnails/pandas.png + tags: + packages: + - pandas + formats: + - gallery + +- title: Rasterio + url: https://rasterio.readthedocs.io + description: | + Geographic information systems use GeoTIFF and other formats to organize and store gridded raster datasets such as satellite imagery and terrain models. Rasterio reads and writes these formats and provides a Python API based on Numpy N-dimensional arrays and GeoJSON. + authors: + - name: MapBox + thumbnail: + tags: + packages: + - rasterio + formats: + - documentation + +- title: Rasterio Tutorial + url: https://rasterio.readthedocs.io/en/latest/quickstart.html + description: | + This document explains how to use Rasterio to read existing files and to create new files. Some advanced topics are glossed over to be covered in more detail elsewhere in Rasterio’s documentation. + authors: + - name: MapBox + thumbnail: /_static/thumbnails/rasterio-tutorial.png + tags: + packages: + - rasterio + formats: + - tutorial + +- title: Siphon + url: https://unidata.github.io/siphon + description: | + Siphon is a collection of Python utilities for downloading data from remote data services. Much of Siphon’s current functionality focuses on access to data hosted on a THREDDS Data Server. It also provides clients to a variety of simple web services. + authors: + - name: Siphon Contributors + affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/siphon.png + tags: + packages: + - siphon + formats: + - documentation + +- title: Siphon Tutorial + url: https://unidata.github.io/python-training/workshop/Siphon/siphon-overview/ + description: | + An overview on Siphon from the Unidata Python Workshop that: uses Siphon to access a THREDDS catalog, filters data, and uses Siphon to perform remote data access. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/siphon.png + tags: + packages: + - siphon + formats: + - tutorial + +- title: Siphon Gallery + url: https://unidata.github.io/siphon/latest/examples/index.html + description: | + Examples of using Siphon’s functionality. + authors: + - name: Siphon Contributors + affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/siphon.png + tags: + packages: + - siphon + formats: + - gallery + +- title: WRF-Python + url: https://wrf-python.readthedocs.io + description: | + A collection of diagnostic and interpolation routines for use with output from the Weather Research and Forecasting (WRF-ARW) Model. + authors: + - affiliation: NCAR + affiliation_url: https://ncar.ucar.edu/ + thumbnail: + tags: + packages: + - wrf-python + formats: + - documentation + +- title: WRF-Python Gallery + url: https://wrf-python.readthedocs.io/en/latest/plot.html + description: | + Examples of how wrf-python can be used to make plots with matplotlib (with basemap and cartopy) and PyNGL. None of these examples make use of xarray’s builtin plotting functions, since additional work is most likely needed to extend xarray in order to work correctly. + authors: + - affiliation: NCAR + affiliation_url: https://ncar.ucar.edu/ + thumbnail: + tags: + packages: + - wrf-python + formats: + - gallery + +- title: Xarray + url: http://xarray.pydata.org/ + description: | + xarray (formerly xray) is an open source project and Python package that makes working with labelled multi-dimensional arrays simple, efficient, and fun! + + Xarray introduces labels in the form of dimensions, coordinates and attributes on top of raw NumPy-like arrays, which allows for a more intuitive, more concise, and less error-prone developer experience. The package includes a large and growing library of domain-agnostic functions for advanced analytics and visualization with these data structures. + + Xarray is inspired by and borrows heavily from pandas, the popular data analysis package focused on labelled tabular data. It is particularly tailored to working with netCDF files, which were the source of xarray’s data model, and integrates tightly with dask for parallel computing. + authors: + - name: Xarray Developers + thumbnail: /_static/thumbnails/xarray.png + tags: + packages: + - xarray + formats: + - documentation + +- title: Unidata Xarray Workshop + url: https://unidata.github.io/python-training/workshop/XArray/xarray-introduction/ + description: | + An introduction to Xarray through the Unidata Python Workshop that asks, "What is XArray and how does XArray fit in with Numpy and Pandas?"" by creating a DataArray, openning netCDF data using XArray, and subsetting the data. + authors: + - affiliation: Unidata + affiliation_url: https://www.unidata.ucar.edu/ + thumbnail: /_static/thumbnails/xarray.png + tags: + packages: + - xarray + formats: + - tutorial + +- title: Xarray Tutorial + url: https://xarray-contrib.github.io/xarray-tutorial/ + description: | + A collection of tutorials provided by the Xarray developers. + authors: + - name: Xarray Developers + thumbnail: /_static/thumbnails/xarray.png + tags: + packages: + - xarray + formats: + - tutorial +- title: Python Programming for Earth Science Students + description: Python Programming for Earth Science Students + url: https://nbviewer.jupyter.org/github/ltauxe/Python-for-Earth-Science-Students/tree/master/ + thumbnail: '' + authors: + - name: Lisa Tauxe + affiliation: Scripps Institution of Oceanography + affiliation_url: https://scripps.ucsd.edu/ + email: ltauxe@ucsd.edu + - name: Hanna Asefaw + affiliation: '' + affiliation_url: '' + email: hasefaw@ucsd.edu + - name: Brendan Cych + affiliation: '' + affiliation_url: '' + email: bcych@ucsd.edu + tags: + formats: + - tutorial + packages: + - pure python + - pandas + - scipy + - numpy + - matplotlib +- title: Pangeo Gallery + description: A gallery of different Pangeo use cases + url: http://gallery.pangeo.io + thumbnail: https://github.com/pangeo-data/pangeo/raw/master/docs/_static/pangeo_simple_logo.png + authors: + - name: Pangeo Community + affiliation: Pangeo + affiliation_url: http://pangeo.io/ + email: '' + tags: + packages: + - jupyter + - xarray + - dask + - matplotlib + - intake + - xgcm + - holoviews + - pandas + - numpy + formats: + - gallery + - tutorial + domains: + - glaciology + - remote sensing + - physical oceanography + - hydrology diff --git a/portal/gallery/.keep b/portal/gallery/.keep new file mode 100644 index 00000000..3c361d6c --- /dev/null +++ b/portal/gallery/.keep @@ -0,0 +1 @@ +# Page to force GitHub to recognize pages/links folder diff --git a/portal/index.md b/portal/index.md new file mode 100644 index 00000000..4f84ad08 --- /dev/null +++ b/portal/index.md @@ -0,0 +1,289 @@ +# Project Pythia + +Scientists working in a multitude of disciplines rely heavily on +computing technologies for their research. Numerical simulations +run on supercomputers are used in the study of climate, weather, +atmospheric chemistry, wildfires, space weather, and more. Similarly, +a tremendous volume of digital data produced by numerical simulations, +or observations made with instruments, are analyzed with the help +of powerful computers and software. Thus, today’s scientists require +not only expertise in their scientific discipline, but also require +high-level technical skills to effectively analyze, manipulate, and +make sense of potentially vast volumes of data. Computing environments +change rapidly, and two technologies that have emerged and are being +adopted by scientific communities relatively recently are Cloud +Computing platforms and a software ecosystem of scientific tools +built around the open source programming language called Python. +Project Pythia will provide a public, web-accessible training +resource that will help educate current, and aspiring, earth +scientists to more effectively use both the Scientific Python +Ecosystem and Cloud Computing to make sense of huge volumes of +numerical scientific data. + + + + Read more about Project Pythia + + + +## Start Learning + +Project Pythia has two main resources for you to use to start learning how to use Python +and the technology in the Python ecosystem for the geosciences: the +[Pythia Foundations Book](#the-foundations-book) and the +[Pythia Resource Gallery](#the-resource-gallery). + +### The Foundations Book + +The [Pythia Foundations Book](https://foundations.projectpythia.org) is a +[Jupyter Book](https://jupyterbook.org/) that we are currently developing to +act as a **comprehensive set of tutorials** covering the **foundational skills** +everyone needs to get started with **computing in the open-source Python ecosystem**. +These foundational tutorials will serve as common references for more advanced and +domain-specific content to be housed here in the Pythia Portal. + + + + Read the Project Pythia Foundations Book + + + +### The Resource Gallery + +There is a wealth of educational resources out there on the internet for learning +Python and how to use it in the geosciences! We have attempted to gather together as +many of these resources as possible into our [Pythia Resource Gallery](/gallery). +Click the link below to see a hand-picked selection of resources for learning at +your own pace. + + + + Visit the Pythia Resource Gallery + + + + + +## Join us! + +If you have questions or want to share anything with the +[Project Pythia Team](#the-project-pythia-team), please reach out to us on our +[GitHub Discussions page](https://github.com/ProjectPythia/projectpythia.github.io/discussions) +or join us at our Weekly Working Group Meetings. + + + + Go to GitHub Discussions + + + +### Contributing + +Anyone can contribute to and participate in Project Pythia! +We conduct all of our work in the open, and all of our work is Open Source Licensed. +We welcome contributions from anyone in the community. +Please see our [Contributor’s Guide](/contributing) +for details on how you can get involved, and come see our work in the +[ProjectPythia GitHub Organization](https://github.com/ProjectPythia). + +
    + +
    + +### Weekly Working Group Meetings + +Project Pythia holds weekly public meetings every Thursday at 11:00AM Mountain (1:00PM Eastern) +on Zoom. Our meetings alternate focus between _Infrastructure_ and _Education_ content. +Please find links and information about how to join in the calendar below. These meetings +are open to anyone who wishes to participate. We publish +[weekly meeting notes here](https://docs.google.com/document/d/e/2PACX-1vQN5YFkZtCZPKVk2Rte2xoHuiqJuYz1KpynsSKmeCLwP-4glUsGuCPJbITwB4OJc8dOhUpHAMacdx59/pub). + +### Meeting & Event Calendar + +
    + +
    + +## The Project Pythia Team + +### Project Administrators + +```{panels} +:column: col-lg-4 col-md-4 col-sm-6 p-3 mx-auto +:body: text-center + + +
    +**John Clyne** +
    +[**NCAR**](https://ncar.ucar.edu) +
    +[@clyne](https://github.com/clyne) + +--- + + +
    +**Matthew C. Long** +
    +[**NCAR**](https://ncar.ucar.edu) +
    +[@matt-long](https://github.com/matt-long) + +--- + + +
    +**Ryan May** +
    +[**Unidata**](https://unidata.ucar.edu) +
    +[@dopplershift](https://github.com/dopplershift) + +--- + + +
    +**Kevin Paul** +
    +[**NCAR**](https://ncar.ucar.edu) +
    +[@kmpaul](https://github.com/kmpaul) + +--- + + +
    +**Brian E. J. Rose** +
    +[**University at Albany**](https://www.albany.edu/) +
    +[@brian-rose](https://github.com/brian-rose) + +--- + + +
    +**Kevin Tyle** +
    +[**University at Albany**](https://www.albany.edu/) +
    +[@ktyle](https://github.com/ktyle) + +``` + +### Project Members + +```{panels} +:column: col-lg-4 col-md-4 col-sm-6 p-3 mx-auto +:body: text-center + + +
    +**Anderson Banihirwe** +
    +[**NCAR**](https://ncar.ucar.edu) +
    +[@andersy005](https://github.com/andersy005) + +--- + + +
    +**Drew Camron** +
    +[**Unidata**](https://unidata.ucar.edu) +
    +[@dcamron](https://github.com/dcamron) + +--- + + +
    +**Orhan Eroglu** +
    +[**NCAR**](https://ncar.ucar.edu) +
    +[@erogluorhan](https://github.com/erogluorhan) + +--- + + +
    +**Julia Kent** +
    +[**NCAR**](https://ncar.ucar.edu) +
    +[@jukent](https://github.com/jukent) + +--- + + +
    +**Max Grover** +
    +[**NCAR**](https://ncar.ucar.edu) +
    +[@mgrover1](https://github.com/mgrover1) +``` + +```{toctree} +--- +hidden: True +maxdepth: 1 +--- +about.md +contributing.md +code_of_conduct.md +``` diff --git a/portal/make.bat b/portal/make.bat new file mode 100644 index 00000000..2119f510 --- /dev/null +++ b/portal/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/portal/meetings.md b/portal/meetings.md new file mode 100644 index 00000000..aa923d21 --- /dev/null +++ b/portal/meetings.md @@ -0,0 +1,14 @@ +# Meeting Schedule & Notes + +## Weekly Working Group Meetings + +Project Pythia holds weekly public meetings every Thursday at 11:00AM Mountain (1:00PM Eastern) on Zoom. Please find links and information about how to join in the calendar below. +These meetings are open to anyone who wishes to participate. +We publish [weekly meeting notes here](https://docs.google.com/document/d/e/2PACX-1vQN5YFkZtCZPKVk2Rte2xoHuiqJuYz1KpynsSKmeCLwP-4glUsGuCPJbITwB4OJc8dOhUpHAMacdx59/pub). + +## Meeting & Event Calendar + +A [Google Calendar](https://calendar.google.com/calendar/u/0?cid=Y180cXB2ZjMxNmFmZDltdjBjaTdkMnVpYWZvZ0Bncm91cC5jYWxlbmRhci5nb29nbGUuY29t) +has been created with these recurring meeting times. + + diff --git a/portal/people.md b/portal/people.md new file mode 100644 index 00000000..8cc39a15 --- /dev/null +++ b/portal/people.md @@ -0,0 +1,30 @@ +# Project Pythia Team + +## Project Administrators + +Project Pythia is adminstrated by the Principal Investigators of the +NSF EarthCube awards \#2026899 (UCAR) and \#2026863 (University at Albany). + +- John Clyne (NCAR) [[@clyne](https://github.com/clyne)] +- Matthew C. Long (NCAR) [[@matt-long](https://github.com/matt-long)] +- Ryan May (Unidata) [[@dopplershift](https://github.com/dopplershift)] +- Kevin Paul (NCAR) [[@kmpaul](https://github.com/kmpaul)] +- Brian E. J. Rose (University at Albany) [[@brian-rose](https://github.com/brian-rose)] +- Kevin Tyle (University at Albany) [[@ktyle](https://github.com/ktyle)] + +## Project Members + +In addition to the administration provided by the Principal Investigators, +a great deal of ongoing work is being conducted and led by: + +- Anderson Banihirwe (NCAR) [[@andersy005](https://github.com/andersy005)] +- Drew Camron (Unidata) [[@dcamron](https://github.com/dcamron)] +- Orhan Eroglu (NCAR) [[@erogluorhan](https://github.com/erogluorhan)] +- Julia Kent (NCAR) [[@jukent](https://github.com/jukent)] +- Max Grover (NCAR) [[@mgrover1](https://github.com/mgrover1)] + +## Project Contributors + +Anyone can contribute to and participate in Project Pythia! Please see our +[Contributor's Guide](contributing.md) for details on how _you_ can get +involved! diff --git a/setup.cfg b/setup.cfg index a4c2d378..379a7db2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,7 +7,7 @@ select = B,C,E,F,W,T4,B9 [isort] known_first_party= -known_third_party=frontmatter,markdown_it,matplotlib,pandas,pydantic,yaml +known_third_party=bs4,frontmatter,markdown_it,matplotlib,pandas,pydantic,sphinx,yaml multi_line_output=3 include_trailing_comma=True force_grid_wrap=0 diff --git a/sphinx_pythia_theme/footer.html b/sphinx_pythia_theme/footer.html new file mode 100644 index 00000000..e04e6857 --- /dev/null +++ b/sphinx_pythia_theme/footer.html @@ -0,0 +1,52 @@ + diff --git a/sphinx_pythia_theme/globaltoclink.html b/sphinx_pythia_theme/globaltoclink.html new file mode 100644 index 00000000..945f90cf --- /dev/null +++ b/sphinx_pythia_theme/globaltoclink.html @@ -0,0 +1,2 @@ +{# Sphinx sidebar template: link to global TOC #} +
    {{ _('Table of Contents') }}
    diff --git a/sphinx_pythia_theme/header.html b/sphinx_pythia_theme/header.html new file mode 100644 index 00000000..be649261 --- /dev/null +++ b/sphinx_pythia_theme/header.html @@ -0,0 +1,38 @@ + diff --git a/sphinx_pythia_theme/layout.html b/sphinx_pythia_theme/layout.html new file mode 100644 index 00000000..d437423f --- /dev/null +++ b/sphinx_pythia_theme/layout.html @@ -0,0 +1,129 @@ +{# + Master layout template for sphinx + + Modified from Sphinx's own basic/layout.html +#} +{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %} +{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %} +{%- set render_onepager = (pagename in theme_onepagers) %} +{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and + (sidebars != []) and (not render_onepager) %} +{%- set render_relations = (not render_onepager) %} +{%- set url_root = pathto('', 1) %} +{%- if url_root == '#' %}{% set url_root = '' %}{% endif %} +{%- if not embedded and docstitle %} + {%- set titlesuffix = " — "|safe + docstitle|e %} +{%- else %} + {%- set titlesuffix = "" %} +{%- endif %} + +{%- from "macros.html" import sidebar with context %} +{%- from "macros.html" import css with context %} +{%- from "macros.html" import script with context %} + +{%- block doctype -%} + {%- if html5_doctype -%} + + {%- else -%} + + {%- endif -%} +{%- endblock doctype -%} + +{%- if html_tag %} + {{- html_tag }} +{%- else %} + +{%- endif %} + +{%- if not html5_doctype and not skip_ua_compatible %} + +{%- endif %} +{%- if use_meta_charset or html5_doctype %} + +{%- else %} + +{%- endif %} + + {{ metatags }} +{%- block htmltitle %} + {{ title|striptags|e }} +{%- endblock htmltitle %} +{%- block css %} + {{ css() }} +{%- endblock css %} +{%- if not embedded %} + {%- block scripts %} + {{- script() }} + {%- endblock scripts %} + {%- if pageurl %} + + {%- endif %} + {%- if use_opensearch %} + + {%- endif %} + {%- if favicon %} + + {%- endif %} +{%- endif %} +{%- block linktags %} + {%- if hasdoc('about') %} + + {%- endif %} + {%- if hasdoc('genindex') %} + + {%- endif %} + {%- if hasdoc('search') %} + + {%- endif %} + {%- if hasdoc('copyright') %} + + {%- endif %} + {%- if next %} + + {%- endif %} + {%- if prev %} + + {%- endif %} +{%- endblock linktags %} +{%- block extrahead %}{% endblock extrahead %} + + + +{%- block header %}{% include "header.html" %}{% endblock header %} + +{%- block content %} + {%- block sidebar1 %}{% endblock sidebar1 %} + + {%- if render_onepager %} +
    + {%- else %} +
    + {%- endif %} + {%- block document %} + {%- if render_sidebar %} +
    + {%- endif %} +
    + {% block body %}{% endblock body %} +
    +
    + {%- if render_sidebar %} +
    + {%- endif %} + {%- endblock document %} + + {%- block sidebar2 %}{{ sidebar() }}{% endblock sidebar2 %} +
    +
    +{%- endblock content %} + +{% block footer %} +{% include "footer.html" %} +{%- endblock footer %} + + + + diff --git a/sphinx_pythia_theme/localtoc.html b/sphinx_pythia_theme/localtoc.html new file mode 100644 index 00000000..c1bd70e7 --- /dev/null +++ b/sphinx_pythia_theme/localtoc.html @@ -0,0 +1,10 @@ +{# + Sphinx sidebar template: local table of contents. + + Modified from + +#} +{%- if display_toc %} +
    {{ _('On this page') }}
    +{{ toc }} +{%- endif %} diff --git a/sphinx_pythia_theme/macros.html b/sphinx_pythia_theme/macros.html new file mode 100644 index 00000000..987c4665 --- /dev/null +++ b/sphinx_pythia_theme/macros.html @@ -0,0 +1,83 @@ +{# Common macros for Sphinx templating #} + +{%- macro sidebar() %} + {%- if render_sidebar %} + + {%- endif %} +{%- endmacro %} + +{%- macro script() %} + + + {%- for js in script_files %} + {{ js_tag(js) }} + {%- endfor %} +{%- endmacro %} + +{%- macro css() %} + + + + {%- for css in css_files %} + {%- if css|attr("filename") %} +{{ css_tag(css) }} + {%- else %} + + {%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/sphinx_pythia_theme/page.html b/sphinx_pythia_theme/page.html new file mode 100644 index 00000000..729f9bde --- /dev/null +++ b/sphinx_pythia_theme/page.html @@ -0,0 +1,5 @@ +{# Master template for simple pages. Modified from Sphinx basic/page.html #} +{%- extends "layout.html" %} +{%- block body %} +{{ bootstrapify(denest_sections(body)) }} +{%- endblock %} diff --git a/sphinx_pythia_theme/relations.html b/sphinx_pythia_theme/relations.html new file mode 100644 index 00000000..6c107b61 --- /dev/null +++ b/sphinx_pythia_theme/relations.html @@ -0,0 +1,21 @@ +{# + Sphinx sidebar template: relation links. + + Modified from basic/relations.html +#} +{%- if prev %} +
    {{ _('Previous page') }}
    +

    + {{ prev.title }} +

    +{%- endif %} +{%- if next %} +
    {{ _('Next page') }}
    +

    + {{ next.title }} +

    +{%- endif %} diff --git a/sphinx_pythia_theme/searchbox.html b/sphinx_pythia_theme/searchbox.html new file mode 100644 index 00000000..c6b010f1 --- /dev/null +++ b/sphinx_pythia_theme/searchbox.html @@ -0,0 +1,23 @@ +{# + Sphinx sidebar template: quick search box. + + Modified from basic/search.html +#} +{%- if pagename != "search" and builder != "singlehtml" %} + + +{%- endif %} diff --git a/sphinx_pythia_theme/static/bootstrap/js/bootstrap.bundle.min.js b/sphinx_pythia_theme/static/bootstrap/js/bootstrap.bundle.min.js new file mode 100644 index 00000000..597592f1 --- /dev/null +++ b/sphinx_pythia_theme/static/bootstrap/js/bootstrap.bundle.min.js @@ -0,0 +1,4429 @@ +/*! + * Bootstrap v5.0.0-beta2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!(function (t, e) { + 'object' == typeof exports && 'undefined' != typeof module + ? (module.exports = e()) + : 'function' == typeof define && define.amd + ? define(e) + : ((t = + 'undefined' != typeof globalThis + ? globalThis + : t || self).bootstrap = e()) +})(this, function () { + 'use strict' + function t(t, e) { + for (var n = 0; n < e.length; n++) { + var i = e[n] + ;(i.enumerable = i.enumerable || !1), + (i.configurable = !0), + 'value' in i && (i.writable = !0), + Object.defineProperty(t, i.key, i) + } + } + function e(e, n, i) { + return n && t(e.prototype, n), i && t(e, i), e + } + function n() { + return (n = + Object.assign || + function (t) { + for (var e = 1; e < arguments.length; e++) { + var n = arguments[e] + for (var i in n) + Object.prototype.hasOwnProperty.call(n, i) && (t[i] = n[i]) + } + return t + }).apply(this, arguments) + } + function i(t, e) { + var n, i + ;(t.prototype = Object.create(e.prototype)), + (t.prototype.constructor = t), + (n = t), + (i = e), + ( + Object.setPrototypeOf || + function (t, e) { + return (t.__proto__ = e), t + } + )(n, i) + } + var o, + r, + s = function (t) { + do { + t += Math.floor(1e6 * Math.random()) + } while (document.getElementById(t)) + return t + }, + a = function (t) { + var e = t.getAttribute('data-bs-target') + if (!e || '#' === e) { + var n = t.getAttribute('href') + if (!n || (!n.includes('#') && !n.startsWith('.'))) return null + n.includes('#') && !n.startsWith('#') && (n = '#' + n.split('#')[1]), + (e = n && '#' !== n ? n.trim() : null) + } + return e + }, + l = function (t) { + var e = a(t) + return e && document.querySelector(e) ? e : null + }, + c = function (t) { + var e = a(t) + return e ? document.querySelector(e) : null + }, + u = function (t) { + if (!t) return 0 + var e = window.getComputedStyle(t), + n = e.transitionDuration, + i = e.transitionDelay, + o = Number.parseFloat(n), + r = Number.parseFloat(i) + return o || r + ? ((n = n.split(',')[0]), + (i = i.split(',')[0]), + 1e3 * (Number.parseFloat(n) + Number.parseFloat(i))) + : 0 + }, + f = function (t) { + t.dispatchEvent(new Event('transitionend')) + }, + d = function (t) { + return (t[0] || t).nodeType + }, + h = function (t, e) { + var n = !1, + i = e + 5 + t.addEventListener('transitionend', function e() { + ;(n = !0), t.removeEventListener('transitionend', e) + }), + setTimeout(function () { + n || f(t) + }, i) + }, + p = function (t, e, n) { + Object.keys(n).forEach(function (i) { + var o, + r = n[i], + s = e[i], + a = + s && d(s) + ? 'element' + : null == (o = s) + ? '' + o + : {}.toString + .call(o) + .match(/\s([a-z]+)/i)[1] + .toLowerCase() + if (!new RegExp(r).test(a)) + throw new TypeError( + t.toUpperCase() + + ': Option "' + + i + + '" provided type "' + + a + + '" but expected type "' + + r + + '".' + ) + }) + }, + g = function (t) { + if (!t) return !1 + if (t.style && t.parentNode && t.parentNode.style) { + var e = getComputedStyle(t), + n = getComputedStyle(t.parentNode) + return ( + 'none' !== e.display && + 'none' !== n.display && + 'hidden' !== e.visibility + ) + } + return !1 + }, + m = function () { + return function () {} + }, + v = function (t) { + return t.offsetHeight + }, + _ = function () { + var t = window.jQuery + return t && !document.body.hasAttribute('data-bs-no-jquery') ? t : null + }, + b = 'rtl' === document.documentElement.dir, + y = function (t, e) { + var n + ;(n = function () { + var n = _() + if (n) { + var i = n.fn[t] + ;(n.fn[t] = e.jQueryInterface), + (n.fn[t].Constructor = e), + (n.fn[t].noConflict = function () { + return (n.fn[t] = i), e.jQueryInterface + }) + } + }), + 'loading' === document.readyState + ? document.addEventListener('DOMContentLoaded', n) + : n() + }, + w = + ((o = {}), + (r = 1), + { + set: function (t, e, n) { + void 0 === t.bsKey && ((t.bsKey = { key: e, id: r }), r++), + (o[t.bsKey.id] = n) + }, + get: function (t, e) { + if (!t || void 0 === t.bsKey) return null + var n = t.bsKey + return n.key === e ? o[n.id] : null + }, + delete: function (t, e) { + if (void 0 !== t.bsKey) { + var n = t.bsKey + n.key === e && (delete o[n.id], delete t.bsKey) + } + }, + }), + E = function (t, e, n) { + w.set(t, e, n) + }, + T = function (t, e) { + return w.get(t, e) + }, + k = /[^.]*(?=\..*)\.|.*/, + A = /\..*/, + L = /::\d+$/, + O = {}, + D = 1, + x = { mouseenter: 'mouseover', mouseleave: 'mouseout' }, + C = new Set([ + 'click', + 'dblclick', + 'mouseup', + 'mousedown', + 'contextmenu', + 'mousewheel', + 'DOMMouseScroll', + 'mouseover', + 'mouseout', + 'mousemove', + 'selectstart', + 'selectend', + 'keydown', + 'keypress', + 'keyup', + 'orientationchange', + 'touchstart', + 'touchmove', + 'touchend', + 'touchcancel', + 'pointerdown', + 'pointermove', + 'pointerup', + 'pointerleave', + 'pointercancel', + 'gesturestart', + 'gesturechange', + 'gestureend', + 'focus', + 'blur', + 'change', + 'reset', + 'select', + 'submit', + 'focusin', + 'focusout', + 'load', + 'unload', + 'beforeunload', + 'resize', + 'move', + 'DOMContentLoaded', + 'readystatechange', + 'error', + 'abort', + 'scroll', + ]) + function S(t, e) { + return (e && e + '::' + D++) || t.uidEvent || D++ + } + function j(t) { + var e = S(t) + return (t.uidEvent = e), (O[e] = O[e] || {}), O[e] + } + function N(t, e, n) { + void 0 === n && (n = null) + for (var i = Object.keys(t), o = 0, r = i.length; o < r; o++) { + var s = t[i[o]] + if (s.originalHandler === e && s.delegationSelector === n) return s + } + return null + } + function P(t, e, n) { + var i = 'string' == typeof e, + o = i ? n : e, + r = t.replace(A, ''), + s = x[r] + return s && (r = s), C.has(r) || (r = t), [i, o, r] + } + function I(t, e, n, i, o) { + if ('string' == typeof e && t) { + n || ((n = i), (i = null)) + var r = P(e, n, i), + s = r[0], + a = r[1], + l = r[2], + c = j(t), + u = c[l] || (c[l] = {}), + f = N(u, a, s ? n : null) + if (f) f.oneOff = f.oneOff && o + else { + var d = S(a, e.replace(k, '')), + h = s + ? (function (t, e, n) { + return function i(o) { + for ( + var r = t.querySelectorAll(e), s = o.target; + s && s !== this; + s = s.parentNode + ) + for (var a = r.length; a--; ) + if (r[a] === s) + return ( + (o.delegateTarget = s), + i.oneOff && B.off(t, o.type, n), + n.apply(s, [o]) + ) + return null + } + })(t, n, i) + : (function (t, e) { + return function n(i) { + return ( + (i.delegateTarget = t), + n.oneOff && B.off(t, i.type, e), + e.apply(t, [i]) + ) + } + })(t, n) + ;(h.delegationSelector = s ? n : null), + (h.originalHandler = a), + (h.oneOff = o), + (h.uidEvent = d), + (u[d] = h), + t.addEventListener(l, h, s) + } + } + } + function M(t, e, n, i, o) { + var r = N(e[n], i, o) + r && (t.removeEventListener(n, r, Boolean(o)), delete e[n][r.uidEvent]) + } + var B = { + on: function (t, e, n, i) { + I(t, e, n, i, !1) + }, + one: function (t, e, n, i) { + I(t, e, n, i, !0) + }, + off: function (t, e, n, i) { + if ('string' == typeof e && t) { + var o = P(e, n, i), + r = o[0], + s = o[1], + a = o[2], + l = a !== e, + c = j(t), + u = e.startsWith('.') + if (void 0 === s) { + u && + Object.keys(c).forEach(function (n) { + !(function (t, e, n, i) { + var o = e[n] || {} + Object.keys(o).forEach(function (r) { + if (r.includes(i)) { + var s = o[r] + M(t, e, n, s.originalHandler, s.delegationSelector) + } + }) + })(t, c, n, e.slice(1)) + }) + var f = c[a] || {} + Object.keys(f).forEach(function (n) { + var i = n.replace(L, '') + if (!l || e.includes(i)) { + var o = f[n] + M(t, c, a, o.originalHandler, o.delegationSelector) + } + }) + } else { + if (!c || !c[a]) return + M(t, c, a, s, r ? n : null) + } + } + }, + trigger: function (t, e, n) { + if ('string' != typeof e || !t) return null + var i, + o = _(), + r = e.replace(A, ''), + s = e !== r, + a = C.has(r), + l = !0, + c = !0, + u = !1, + f = null + return ( + s && + o && + ((i = o.Event(e, n)), + o(t).trigger(i), + (l = !i.isPropagationStopped()), + (c = !i.isImmediatePropagationStopped()), + (u = i.isDefaultPrevented())), + a + ? (f = document.createEvent('HTMLEvents')).initEvent(r, l, !0) + : (f = new CustomEvent(e, { bubbles: l, cancelable: !0 })), + void 0 !== n && + Object.keys(n).forEach(function (t) { + Object.defineProperty(f, t, { + get: function () { + return n[t] + }, + }) + }), + u && f.preventDefault(), + c && t.dispatchEvent(f), + f.defaultPrevented && void 0 !== i && i.preventDefault(), + f + ) + }, + }, + H = (function () { + function t(t) { + t && ((this._element = t), E(t, this.constructor.DATA_KEY, this)) + } + return ( + (t.prototype.dispose = function () { + var t, e + ;(t = this._element), + (e = this.constructor.DATA_KEY), + w.delete(t, e), + (this._element = null) + }), + (t.getInstance = function (t) { + return T(t, this.DATA_KEY) + }), + e(t, null, [ + { + key: 'VERSION', + get: function () { + return '5.0.0-beta2' + }, + }, + ]), + t + ) + })(), + R = (function (t) { + function n() { + return t.apply(this, arguments) || this + } + i(n, t) + var o = n.prototype + return ( + (o.close = function (t) { + var e = t ? this._getRootElement(t) : this._element, + n = this._triggerCloseEvent(e) + null === n || n.defaultPrevented || this._removeElement(e) + }), + (o._getRootElement = function (t) { + return c(t) || t.closest('.alert') + }), + (o._triggerCloseEvent = function (t) { + return B.trigger(t, 'close.bs.alert') + }), + (o._removeElement = function (t) { + var e = this + if ((t.classList.remove('show'), t.classList.contains('fade'))) { + var n = u(t) + B.one(t, 'transitionend', function () { + return e._destroyElement(t) + }), + h(t, n) + } else this._destroyElement(t) + }), + (o._destroyElement = function (t) { + t.parentNode && t.parentNode.removeChild(t), + B.trigger(t, 'closed.bs.alert') + }), + (n.jQueryInterface = function (t) { + return this.each(function () { + var e = T(this, 'bs.alert') + e || (e = new n(this)), 'close' === t && e[t](this) + }) + }), + (n.handleDismiss = function (t) { + return function (e) { + e && e.preventDefault(), t.close(this) + } + }), + e(n, null, [ + { + key: 'DATA_KEY', + get: function () { + return 'bs.alert' + }, + }, + ]), + n + ) + })(H) + B.on( + document, + 'click.bs.alert.data-api', + '[data-bs-dismiss="alert"]', + R.handleDismiss(new R()) + ), + y('alert', R) + var W = (function (t) { + function n() { + return t.apply(this, arguments) || this + } + return ( + i(n, t), + (n.prototype.toggle = function () { + this._element.setAttribute( + 'aria-pressed', + this._element.classList.toggle('active') + ) + }), + (n.jQueryInterface = function (t) { + return this.each(function () { + var e = T(this, 'bs.button') + e || (e = new n(this)), 'toggle' === t && e[t]() + }) + }), + e(n, null, [ + { + key: 'DATA_KEY', + get: function () { + return 'bs.button' + }, + }, + ]), + n + ) + })(H) + function K(t) { + return ( + 'true' === t || + ('false' !== t && + (t === Number(t).toString() + ? Number(t) + : '' === t || 'null' === t + ? null + : t)) + ) + } + function U(t) { + return t.replace(/[A-Z]/g, function (t) { + return '-' + t.toLowerCase() + }) + } + B.on( + document, + 'click.bs.button.data-api', + '[data-bs-toggle="button"]', + function (t) { + t.preventDefault() + var e = t.target.closest('[data-bs-toggle="button"]'), + n = T(e, 'bs.button') + n || (n = new W(e)), n.toggle() + } + ), + y('button', W) + var z = { + setDataAttribute: function (t, e, n) { + t.setAttribute('data-bs-' + U(e), n) + }, + removeDataAttribute: function (t, e) { + t.removeAttribute('data-bs-' + U(e)) + }, + getDataAttributes: function (t) { + if (!t) return {} + var e = {} + return ( + Object.keys(t.dataset) + .filter(function (t) { + return t.startsWith('bs') + }) + .forEach(function (n) { + var i = n.replace(/^bs/, '') + ;(i = i.charAt(0).toLowerCase() + i.slice(1, i.length)), + (e[i] = K(t.dataset[n])) + }), + e + ) + }, + getDataAttribute: function (t, e) { + return K(t.getAttribute('data-bs-' + U(e))) + }, + offset: function (t) { + var e = t.getBoundingClientRect() + return { + top: e.top + document.body.scrollTop, + left: e.left + document.body.scrollLeft, + } + }, + position: function (t) { + return { top: t.offsetTop, left: t.offsetLeft } + }, + }, + F = function (t, e) { + var n + return ( + void 0 === e && (e = document.documentElement), + (n = []).concat.apply(n, Element.prototype.querySelectorAll.call(e, t)) + ) + }, + Y = function (t, e) { + return ( + void 0 === e && (e = document.documentElement), + Element.prototype.querySelector.call(e, t) + ) + }, + q = function (t, e) { + var n + return (n = []).concat.apply(n, t.children).filter(function (t) { + return t.matches(e) + }) + }, + V = function (t, e) { + for (var n = t.previousElementSibling; n; ) { + if (n.matches(e)) return [n] + n = n.previousElementSibling + } + return [] + }, + X = { + interval: 5e3, + keyboard: !0, + slide: !1, + pause: 'hover', + wrap: !0, + touch: !0, + }, + Q = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean', + }, + $ = (function (t) { + function o(e, n) { + var i + return ( + ((i = t.call(this, e) || this)._items = null), + (i._interval = null), + (i._activeElement = null), + (i._isPaused = !1), + (i._isSliding = !1), + (i.touchTimeout = null), + (i.touchStartX = 0), + (i.touchDeltaX = 0), + (i._config = i._getConfig(n)), + (i._indicatorsElement = Y('.carousel-indicators', i._element)), + (i._touchSupported = + 'ontouchstart' in document.documentElement || + navigator.maxTouchPoints > 0), + (i._pointerEvent = Boolean(window.PointerEvent)), + i._addEventListeners(), + i + ) + } + i(o, t) + var r = o.prototype + return ( + (r.next = function () { + this._isSliding || this._slide('next') + }), + (r.nextWhenVisible = function () { + !document.hidden && g(this._element) && this.next() + }), + (r.prev = function () { + this._isSliding || this._slide('prev') + }), + (r.pause = function (t) { + t || (this._isPaused = !0), + Y('.carousel-item-next, .carousel-item-prev', this._element) && + (f(this._element), this.cycle(!0)), + clearInterval(this._interval), + (this._interval = null) + }), + (r.cycle = function (t) { + t || (this._isPaused = !1), + this._interval && + (clearInterval(this._interval), (this._interval = null)), + this._config && + this._config.interval && + !this._isPaused && + (this._updateInterval(), + (this._interval = setInterval( + (document.visibilityState + ? this.nextWhenVisible + : this.next + ).bind(this), + this._config.interval + ))) + }), + (r.to = function (t) { + var e = this + this._activeElement = Y('.active.carousel-item', this._element) + var n = this._getItemIndex(this._activeElement) + if (!(t > this._items.length - 1 || t < 0)) + if (this._isSliding) + B.one(this._element, 'slid.bs.carousel', function () { + return e.to(t) + }) + else { + if (n === t) return this.pause(), void this.cycle() + var i = t > n ? 'next' : 'prev' + this._slide(i, this._items[t]) + } + }), + (r.dispose = function () { + t.prototype.dispose.call(this), + B.off(this._element, '.bs.carousel'), + (this._items = null), + (this._config = null), + (this._interval = null), + (this._isPaused = null), + (this._isSliding = null), + (this._activeElement = null), + (this._indicatorsElement = null) + }), + (r._getConfig = function (t) { + return (t = n({}, X, t)), p('carousel', t, Q), t + }), + (r._handleSwipe = function () { + var t = Math.abs(this.touchDeltaX) + if (!(t <= 40)) { + var e = t / this.touchDeltaX + ;(this.touchDeltaX = 0), + e > 0 && (b ? this.next() : this.prev()), + e < 0 && (b ? this.prev() : this.next()) + } + }), + (r._addEventListeners = function () { + var t = this + this._config.keyboard && + B.on(this._element, 'keydown.bs.carousel', function (e) { + return t._keydown(e) + }), + 'hover' === this._config.pause && + (B.on(this._element, 'mouseenter.bs.carousel', function (e) { + return t.pause(e) + }), + B.on(this._element, 'mouseleave.bs.carousel', function (e) { + return t.cycle(e) + })), + this._config.touch && + this._touchSupported && + this._addTouchEventListeners() + }), + (r._addTouchEventListeners = function () { + var t = this, + e = function (e) { + !t._pointerEvent || + ('pen' !== e.pointerType && 'touch' !== e.pointerType) + ? t._pointerEvent || (t.touchStartX = e.touches[0].clientX) + : (t.touchStartX = e.clientX) + }, + n = function (e) { + !t._pointerEvent || + ('pen' !== e.pointerType && 'touch' !== e.pointerType) || + (t.touchDeltaX = e.clientX - t.touchStartX), + t._handleSwipe(), + 'hover' === t._config.pause && + (t.pause(), + t.touchTimeout && clearTimeout(t.touchTimeout), + (t.touchTimeout = setTimeout(function (e) { + return t.cycle(e) + }, 500 + t._config.interval))) + } + F('.carousel-item img', this._element).forEach(function (t) { + B.on(t, 'dragstart.bs.carousel', function (t) { + return t.preventDefault() + }) + }), + this._pointerEvent + ? (B.on(this._element, 'pointerdown.bs.carousel', function (t) { + return e(t) + }), + B.on(this._element, 'pointerup.bs.carousel', function (t) { + return n(t) + }), + this._element.classList.add('pointer-event')) + : (B.on(this._element, 'touchstart.bs.carousel', function (t) { + return e(t) + }), + B.on(this._element, 'touchmove.bs.carousel', function (e) { + return (function (e) { + e.touches && e.touches.length > 1 + ? (t.touchDeltaX = 0) + : (t.touchDeltaX = e.touches[0].clientX - t.touchStartX) + })(e) + }), + B.on(this._element, 'touchend.bs.carousel', function (t) { + return n(t) + })) + }), + (r._keydown = function (t) { + ;/input|textarea/i.test(t.target.tagName) || + ('ArrowLeft' === t.key + ? (t.preventDefault(), b ? this.next() : this.prev()) + : 'ArrowRight' === t.key && + (t.preventDefault(), b ? this.prev() : this.next())) + }), + (r._getItemIndex = function (t) { + return ( + (this._items = + t && t.parentNode ? F('.carousel-item', t.parentNode) : []), + this._items.indexOf(t) + ) + }), + (r._getItemByDirection = function (t, e) { + var n = 'next' === t, + i = 'prev' === t, + o = this._getItemIndex(e), + r = this._items.length - 1 + if (((i && 0 === o) || (n && o === r)) && !this._config.wrap) return e + var s = (o + ('prev' === t ? -1 : 1)) % this._items.length + return -1 === s ? this._items[this._items.length - 1] : this._items[s] + }), + (r._triggerSlideEvent = function (t, e) { + var n = this._getItemIndex(t), + i = this._getItemIndex(Y('.active.carousel-item', this._element)) + return B.trigger(this._element, 'slide.bs.carousel', { + relatedTarget: t, + direction: e, + from: i, + to: n, + }) + }), + (r._setActiveIndicatorElement = function (t) { + if (this._indicatorsElement) { + var e = Y('.active', this._indicatorsElement) + e.classList.remove('active'), e.removeAttribute('aria-current') + for ( + var n = F('[data-bs-target]', this._indicatorsElement), i = 0; + i < n.length; + i++ + ) + if ( + Number.parseInt(n[i].getAttribute('data-bs-slide-to'), 10) === + this._getItemIndex(t) + ) { + n[i].classList.add('active'), + n[i].setAttribute('aria-current', 'true') + break + } + } + }), + (r._updateInterval = function () { + var t = + this._activeElement || Y('.active.carousel-item', this._element) + if (t) { + var e = Number.parseInt(t.getAttribute('data-bs-interval'), 10) + e + ? ((this._config.defaultInterval = + this._config.defaultInterval || this._config.interval), + (this._config.interval = e)) + : (this._config.interval = + this._config.defaultInterval || this._config.interval) + } + }), + (r._slide = function (t, e) { + var n = this, + i = Y('.active.carousel-item', this._element), + o = this._getItemIndex(i), + r = e || (i && this._getItemByDirection(t, i)), + s = this._getItemIndex(r), + a = Boolean(this._interval), + l = 'next' === t ? 'carousel-item-start' : 'carousel-item-end', + c = 'next' === t ? 'carousel-item-next' : 'carousel-item-prev', + f = 'next' === t ? 'left' : 'right' + if (r && r.classList.contains('active')) this._isSliding = !1 + else if (!this._triggerSlideEvent(r, f).defaultPrevented && i && r) { + if ( + ((this._isSliding = !0), + a && this.pause(), + this._setActiveIndicatorElement(r), + (this._activeElement = r), + this._element.classList.contains('slide')) + ) { + r.classList.add(c), v(r), i.classList.add(l), r.classList.add(l) + var d = u(i) + B.one(i, 'transitionend', function () { + r.classList.remove(l, c), + r.classList.add('active'), + i.classList.remove('active', c, l), + (n._isSliding = !1), + setTimeout(function () { + B.trigger(n._element, 'slid.bs.carousel', { + relatedTarget: r, + direction: f, + from: o, + to: s, + }) + }, 0) + }), + h(i, d) + } else + i.classList.remove('active'), + r.classList.add('active'), + (this._isSliding = !1), + B.trigger(this._element, 'slid.bs.carousel', { + relatedTarget: r, + direction: f, + from: o, + to: s, + }) + a && this.cycle() + } + }), + (o.carouselInterface = function (t, e) { + var i = T(t, 'bs.carousel'), + r = n({}, X, z.getDataAttributes(t)) + 'object' == typeof e && (r = n({}, r, e)) + var s = 'string' == typeof e ? e : r.slide + if ((i || (i = new o(t, r)), 'number' == typeof e)) i.to(e) + else if ('string' == typeof s) { + if (void 0 === i[s]) + throw new TypeError('No method named "' + s + '"') + i[s]() + } else r.interval && r.ride && (i.pause(), i.cycle()) + }), + (o.jQueryInterface = function (t) { + return this.each(function () { + o.carouselInterface(this, t) + }) + }), + (o.dataApiClickHandler = function (t) { + var e = c(this) + if (e && e.classList.contains('carousel')) { + var i = n({}, z.getDataAttributes(e), z.getDataAttributes(this)), + r = this.getAttribute('data-bs-slide-to') + r && (i.interval = !1), + o.carouselInterface(e, i), + r && T(e, 'bs.carousel').to(r), + t.preventDefault() + } + }), + e(o, null, [ + { + key: 'Default', + get: function () { + return X + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.carousel' + }, + }, + ]), + o + ) + })(H) + B.on( + document, + 'click.bs.carousel.data-api', + '[data-bs-slide], [data-bs-slide-to]', + $.dataApiClickHandler + ), + B.on(window, 'load.bs.carousel.data-api', function () { + for ( + var t = F('[data-bs-ride="carousel"]'), e = 0, n = t.length; + e < n; + e++ + ) + $.carouselInterface(t[e], T(t[e], 'bs.carousel')) + }), + y('carousel', $) + var G = { toggle: !0, parent: '' }, + Z = { toggle: 'boolean', parent: '(string|element)' }, + J = (function (t) { + function o(e, n) { + var i + ;((i = t.call(this, e) || this)._isTransitioning = !1), + (i._config = i._getConfig(n)), + (i._triggerArray = F( + '[data-bs-toggle="collapse"][href="#' + + e.id + + '"],[data-bs-toggle="collapse"][data-bs-target="#' + + e.id + + '"]' + )) + for ( + var o = F('[data-bs-toggle="collapse"]'), r = 0, s = o.length; + r < s; + r++ + ) { + var a = o[r], + c = l(a), + u = F(c).filter(function (t) { + return t === e + }) + null !== c && u.length && ((i._selector = c), i._triggerArray.push(a)) + } + return ( + (i._parent = i._config.parent ? i._getParent() : null), + i._config.parent || + i._addAriaAndCollapsedClass(i._element, i._triggerArray), + i._config.toggle && i.toggle(), + i + ) + } + i(o, t) + var r = o.prototype + return ( + (r.toggle = function () { + this._element.classList.contains('show') ? this.hide() : this.show() + }), + (r.show = function () { + var t = this + if ( + !this._isTransitioning && + !this._element.classList.contains('show') + ) { + var e, n + this._parent && + 0 === + (e = F('.show, .collapsing', this._parent).filter(function (e) { + return 'string' == typeof t._config.parent + ? e.getAttribute('data-bs-parent') === t._config.parent + : e.classList.contains('collapse') + })).length && + (e = null) + var i = Y(this._selector) + if (e) { + var r = e.find(function (t) { + return i !== t + }) + if ((n = r ? T(r, 'bs.collapse') : null) && n._isTransitioning) + return + } + if ( + !B.trigger(this._element, 'show.bs.collapse').defaultPrevented + ) { + e && + e.forEach(function (t) { + i !== t && o.collapseInterface(t, 'hide'), + n || E(t, 'bs.collapse', null) + }) + var s = this._getDimension() + this._element.classList.remove('collapse'), + this._element.classList.add('collapsing'), + (this._element.style[s] = 0), + this._triggerArray.length && + this._triggerArray.forEach(function (t) { + t.classList.remove('collapsed'), + t.setAttribute('aria-expanded', !0) + }), + this.setTransitioning(!0) + var a = 'scroll' + (s[0].toUpperCase() + s.slice(1)), + l = u(this._element) + B.one(this._element, 'transitionend', function () { + t._element.classList.remove('collapsing'), + t._element.classList.add('collapse', 'show'), + (t._element.style[s] = ''), + t.setTransitioning(!1), + B.trigger(t._element, 'shown.bs.collapse') + }), + h(this._element, l), + (this._element.style[s] = this._element[a] + 'px') + } + } + }), + (r.hide = function () { + var t = this + if ( + !this._isTransitioning && + this._element.classList.contains('show') && + !B.trigger(this._element, 'hide.bs.collapse').defaultPrevented + ) { + var e = this._getDimension() + ;(this._element.style[e] = + this._element.getBoundingClientRect()[e] + 'px'), + v(this._element), + this._element.classList.add('collapsing'), + this._element.classList.remove('collapse', 'show') + var n = this._triggerArray.length + if (n > 0) + for (var i = 0; i < n; i++) { + var o = this._triggerArray[i], + r = c(o) + r && + !r.classList.contains('show') && + (o.classList.add('collapsed'), + o.setAttribute('aria-expanded', !1)) + } + this.setTransitioning(!0), (this._element.style[e] = '') + var s = u(this._element) + B.one(this._element, 'transitionend', function () { + t.setTransitioning(!1), + t._element.classList.remove('collapsing'), + t._element.classList.add('collapse'), + B.trigger(t._element, 'hidden.bs.collapse') + }), + h(this._element, s) + } + }), + (r.setTransitioning = function (t) { + this._isTransitioning = t + }), + (r.dispose = function () { + t.prototype.dispose.call(this), + (this._config = null), + (this._parent = null), + (this._triggerArray = null), + (this._isTransitioning = null) + }), + (r._getConfig = function (t) { + return ( + ((t = n({}, G, t)).toggle = Boolean(t.toggle)), + p('collapse', t, Z), + t + ) + }), + (r._getDimension = function () { + return this._element.classList.contains('width') ? 'width' : 'height' + }), + (r._getParent = function () { + var t = this, + e = this._config.parent + return ( + d(e) + ? (void 0 === e.jquery && void 0 === e[0]) || (e = e[0]) + : (e = Y(e)), + F( + '[data-bs-toggle="collapse"][data-bs-parent="' + e + '"]', + e + ).forEach(function (e) { + var n = c(e) + t._addAriaAndCollapsedClass(n, [e]) + }), + e + ) + }), + (r._addAriaAndCollapsedClass = function (t, e) { + if (t && e.length) { + var n = t.classList.contains('show') + e.forEach(function (t) { + n + ? t.classList.remove('collapsed') + : t.classList.add('collapsed'), + t.setAttribute('aria-expanded', n) + }) + } + }), + (o.collapseInterface = function (t, e) { + var i = T(t, 'bs.collapse'), + r = n( + {}, + G, + z.getDataAttributes(t), + 'object' == typeof e && e ? e : {} + ) + if ( + (!i && + r.toggle && + 'string' == typeof e && + /show|hide/.test(e) && + (r.toggle = !1), + i || (i = new o(t, r)), + 'string' == typeof e) + ) { + if (void 0 === i[e]) + throw new TypeError('No method named "' + e + '"') + i[e]() + } + }), + (o.jQueryInterface = function (t) { + return this.each(function () { + o.collapseInterface(this, t) + }) + }), + e(o, null, [ + { + key: 'Default', + get: function () { + return G + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.collapse' + }, + }, + ]), + o + ) + })(H) + B.on( + document, + 'click.bs.collapse.data-api', + '[data-bs-toggle="collapse"]', + function (t) { + ;('A' === t.target.tagName || + (t.delegateTarget && 'A' === t.delegateTarget.tagName)) && + t.preventDefault() + var e = z.getDataAttributes(this), + n = l(this) + F(n).forEach(function (t) { + var n, + i = T(t, 'bs.collapse') + i + ? (null === i._parent && + 'string' == typeof e.parent && + ((i._config.parent = e.parent), (i._parent = i._getParent())), + (n = 'toggle')) + : (n = e), + J.collapseInterface(t, n) + }) + } + ), + y('collapse', J) + var tt = 'top', + et = 'bottom', + nt = 'right', + it = 'left', + ot = [tt, et, nt, it], + rt = ot.reduce(function (t, e) { + return t.concat([e + '-start', e + '-end']) + }, []), + st = [].concat(ot, ['auto']).reduce(function (t, e) { + return t.concat([e, e + '-start', e + '-end']) + }, []), + at = [ + 'beforeRead', + 'read', + 'afterRead', + 'beforeMain', + 'main', + 'afterMain', + 'beforeWrite', + 'write', + 'afterWrite', + ] + function lt(t) { + return t ? (t.nodeName || '').toLowerCase() : null + } + function ct(t) { + if ('[object Window]' !== t.toString()) { + var e = t.ownerDocument + return (e && e.defaultView) || window + } + return t + } + function ut(t) { + return t instanceof ct(t).Element || t instanceof Element + } + function ft(t) { + return t instanceof ct(t).HTMLElement || t instanceof HTMLElement + } + var dt = { + name: 'applyStyles', + enabled: !0, + phase: 'write', + fn: function (t) { + var e = t.state + Object.keys(e.elements).forEach(function (t) { + var n = e.styles[t] || {}, + i = e.attributes[t] || {}, + o = e.elements[t] + ft(o) && + lt(o) && + (Object.assign(o.style, n), + Object.keys(i).forEach(function (t) { + var e = i[t] + !1 === e + ? o.removeAttribute(t) + : o.setAttribute(t, !0 === e ? '' : e) + })) + }) + }, + effect: function (t) { + var e = t.state, + n = { + popper: { + position: e.options.strategy, + left: '0', + top: '0', + margin: '0', + }, + arrow: { position: 'absolute' }, + reference: {}, + } + return ( + Object.assign(e.elements.popper.style, n.popper), + e.elements.arrow && Object.assign(e.elements.arrow.style, n.arrow), + function () { + Object.keys(e.elements).forEach(function (t) { + var i = e.elements[t], + o = e.attributes[t] || {}, + r = Object.keys( + e.styles.hasOwnProperty(t) ? e.styles[t] : n[t] + ).reduce(function (t, e) { + return (t[e] = ''), t + }, {}) + ft(i) && + lt(i) && + (Object.assign(i.style, r), + Object.keys(o).forEach(function (t) { + i.removeAttribute(t) + })) + }) + } + ) + }, + requires: ['computeStyles'], + } + function ht(t) { + return t.split('-')[0] + } + function pt(t) { + return { + x: t.offsetLeft, + y: t.offsetTop, + width: t.offsetWidth, + height: t.offsetHeight, + } + } + function gt(t, e) { + var n, + i = e.getRootNode && e.getRootNode() + if (t.contains(e)) return !0 + if (i && ((n = i) instanceof ct(n).ShadowRoot || n instanceof ShadowRoot)) { + var o = e + do { + if (o && t.isSameNode(o)) return !0 + o = o.parentNode || o.host + } while (o) + } + return !1 + } + function mt(t) { + return ct(t).getComputedStyle(t) + } + function vt(t) { + return ['table', 'td', 'th'].indexOf(lt(t)) >= 0 + } + function _t(t) { + return ( + (ut(t) ? t.ownerDocument : t.document) || window.document + ).documentElement + } + function bt(t) { + return 'html' === lt(t) + ? t + : t.assignedSlot || t.parentNode || t.host || _t(t) + } + function yt(t) { + if (!ft(t) || 'fixed' === mt(t).position) return null + var e = t.offsetParent + if (e) { + var n = _t(e) + if ( + 'body' === lt(e) && + 'static' === mt(e).position && + 'static' !== mt(n).position + ) + return n + } + return e + } + function wt(t) { + for (var e = ct(t), n = yt(t); n && vt(n) && 'static' === mt(n).position; ) + n = yt(n) + return n && 'body' === lt(n) && 'static' === mt(n).position + ? e + : n || + (function (t) { + for ( + var e = bt(t); + ft(e) && ['html', 'body'].indexOf(lt(e)) < 0; + + ) { + var n = mt(e) + if ( + 'none' !== n.transform || + 'none' !== n.perspective || + (n.willChange && 'auto' !== n.willChange) + ) + return e + e = e.parentNode + } + return null + })(t) || + e + } + function Et(t) { + return ['top', 'bottom'].indexOf(t) >= 0 ? 'x' : 'y' + } + function Tt(t, e, n) { + return Math.max(t, Math.min(e, n)) + } + function kt(t) { + return Object.assign( + Object.assign({}, { top: 0, right: 0, bottom: 0, left: 0 }), + t + ) + } + function At(t, e) { + return e.reduce(function (e, n) { + return (e[n] = t), e + }, {}) + } + var Lt = { + name: 'arrow', + enabled: !0, + phase: 'main', + fn: function (t) { + var e, + n = t.state, + i = t.name, + o = n.elements.arrow, + r = n.modifiersData.popperOffsets, + s = ht(n.placement), + a = Et(s), + l = [it, nt].indexOf(s) >= 0 ? 'height' : 'width' + if (o && r) { + var c = n.modifiersData[i + '#persistent'].padding, + u = pt(o), + f = 'y' === a ? tt : it, + d = 'y' === a ? et : nt, + h = + n.rects.reference[l] + + n.rects.reference[a] - + r[a] - + n.rects.popper[l], + p = r[a] - n.rects.reference[a], + g = wt(o), + m = g ? ('y' === a ? g.clientHeight || 0 : g.clientWidth || 0) : 0, + v = h / 2 - p / 2, + _ = c[f], + b = m - u[l] - c[d], + y = m / 2 - u[l] / 2 + v, + w = Tt(_, y, b), + E = a + n.modifiersData[i] = (((e = {})[E] = w), (e.centerOffset = w - y), e) + } + }, + effect: function (t) { + var e = t.state, + n = t.options, + i = t.name, + o = n.element, + r = void 0 === o ? '[data-popper-arrow]' : o, + s = n.padding, + a = void 0 === s ? 0 : s + null != r && + ('string' != typeof r || (r = e.elements.popper.querySelector(r))) && + gt(e.elements.popper, r) && + ((e.elements.arrow = r), + (e.modifiersData[i + '#persistent'] = { + padding: kt('number' != typeof a ? a : At(a, ot)), + })) + }, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'], + }, + Ot = { top: 'auto', right: 'auto', bottom: 'auto', left: 'auto' } + function Dt(t) { + var e, + n = t.popper, + i = t.popperRect, + o = t.placement, + r = t.offsets, + s = t.position, + a = t.gpuAcceleration, + l = t.adaptive, + c = t.roundOffsets + ? (function (t) { + var e = t.x, + n = t.y, + i = window.devicePixelRatio || 1 + return { + x: Math.round(e * i) / i || 0, + y: Math.round(n * i) / i || 0, + } + })(r) + : r, + u = c.x, + f = void 0 === u ? 0 : u, + d = c.y, + h = void 0 === d ? 0 : d, + p = r.hasOwnProperty('x'), + g = r.hasOwnProperty('y'), + m = it, + v = tt, + _ = window + if (l) { + var b = wt(n) + b === ct(n) && (b = _t(n)), + o === tt && + ((v = et), (h -= b.clientHeight - i.height), (h *= a ? 1 : -1)), + o === it && + ((m = nt), (f -= b.clientWidth - i.width), (f *= a ? 1 : -1)) + } + var y, + w = Object.assign({ position: s }, l && Ot) + return a + ? Object.assign( + Object.assign({}, w), + {}, + (((y = {})[v] = g ? '0' : ''), + (y[m] = p ? '0' : ''), + (y.transform = + (_.devicePixelRatio || 1) < 2 + ? 'translate(' + f + 'px, ' + h + 'px)' + : 'translate3d(' + f + 'px, ' + h + 'px, 0)'), + y) + ) + : Object.assign( + Object.assign({}, w), + {}, + (((e = {})[v] = g ? h + 'px' : ''), + (e[m] = p ? f + 'px' : ''), + (e.transform = ''), + e) + ) + } + var xt = { + name: 'computeStyles', + enabled: !0, + phase: 'beforeWrite', + fn: function (t) { + var e = t.state, + n = t.options, + i = n.gpuAcceleration, + o = void 0 === i || i, + r = n.adaptive, + s = void 0 === r || r, + a = n.roundOffsets, + l = void 0 === a || a, + c = { + placement: ht(e.placement), + popper: e.elements.popper, + popperRect: e.rects.popper, + gpuAcceleration: o, + } + null != e.modifiersData.popperOffsets && + (e.styles.popper = Object.assign( + Object.assign({}, e.styles.popper), + Dt( + Object.assign( + Object.assign({}, c), + {}, + { + offsets: e.modifiersData.popperOffsets, + position: e.options.strategy, + adaptive: s, + roundOffsets: l, + } + ) + ) + )), + null != e.modifiersData.arrow && + (e.styles.arrow = Object.assign( + Object.assign({}, e.styles.arrow), + Dt( + Object.assign( + Object.assign({}, c), + {}, + { + offsets: e.modifiersData.arrow, + position: 'absolute', + adaptive: !1, + roundOffsets: l, + } + ) + ) + )), + (e.attributes.popper = Object.assign( + Object.assign({}, e.attributes.popper), + {}, + { 'data-popper-placement': e.placement } + )) + }, + data: {}, + }, + Ct = { passive: !0 }, + St = { + name: 'eventListeners', + enabled: !0, + phase: 'write', + fn: function () {}, + effect: function (t) { + var e = t.state, + n = t.instance, + i = t.options, + o = i.scroll, + r = void 0 === o || o, + s = i.resize, + a = void 0 === s || s, + l = ct(e.elements.popper), + c = [].concat(e.scrollParents.reference, e.scrollParents.popper) + return ( + r && + c.forEach(function (t) { + t.addEventListener('scroll', n.update, Ct) + }), + a && l.addEventListener('resize', n.update, Ct), + function () { + r && + c.forEach(function (t) { + t.removeEventListener('scroll', n.update, Ct) + }), + a && l.removeEventListener('resize', n.update, Ct) + } + ) + }, + data: {}, + }, + jt = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' } + function Nt(t) { + return t.replace(/left|right|bottom|top/g, function (t) { + return jt[t] + }) + } + var Pt = { start: 'end', end: 'start' } + function It(t) { + return t.replace(/start|end/g, function (t) { + return Pt[t] + }) + } + function Mt(t) { + var e = t.getBoundingClientRect() + return { + width: e.width, + height: e.height, + top: e.top, + right: e.right, + bottom: e.bottom, + left: e.left, + x: e.left, + y: e.top, + } + } + function Bt(t) { + var e = ct(t) + return { scrollLeft: e.pageXOffset, scrollTop: e.pageYOffset } + } + function Ht(t) { + return Mt(_t(t)).left + Bt(t).scrollLeft + } + function Rt(t) { + var e = mt(t), + n = e.overflow, + i = e.overflowX, + o = e.overflowY + return /auto|scroll|overlay|hidden/.test(n + o + i) + } + function Wt(t, e) { + void 0 === e && (e = []) + var n = (function t(e) { + return ['html', 'body', '#document'].indexOf(lt(e)) >= 0 + ? e.ownerDocument.body + : ft(e) && Rt(e) + ? e + : t(bt(e)) + })(t), + i = 'body' === lt(n), + o = ct(n), + r = i ? [o].concat(o.visualViewport || [], Rt(n) ? n : []) : n, + s = e.concat(r) + return i ? s : s.concat(Wt(bt(r))) + } + function Kt(t) { + return Object.assign( + Object.assign({}, t), + {}, + { left: t.x, top: t.y, right: t.x + t.width, bottom: t.y + t.height } + ) + } + function Ut(t, e) { + return 'viewport' === e + ? Kt( + (function (t) { + var e = ct(t), + n = _t(t), + i = e.visualViewport, + o = n.clientWidth, + r = n.clientHeight, + s = 0, + a = 0 + return ( + i && + ((o = i.width), + (r = i.height), + /^((?!chrome|android).)*safari/i.test(navigator.userAgent) || + ((s = i.offsetLeft), (a = i.offsetTop))), + { width: o, height: r, x: s + Ht(t), y: a } + ) + })(t) + ) + : ft(e) + ? (function (t) { + var e = Mt(t) + return ( + (e.top = e.top + t.clientTop), + (e.left = e.left + t.clientLeft), + (e.bottom = e.top + t.clientHeight), + (e.right = e.left + t.clientWidth), + (e.width = t.clientWidth), + (e.height = t.clientHeight), + (e.x = e.left), + (e.y = e.top), + e + ) + })(e) + : Kt( + (function (t) { + var e = _t(t), + n = Bt(t), + i = t.ownerDocument.body, + o = Math.max( + e.scrollWidth, + e.clientWidth, + i ? i.scrollWidth : 0, + i ? i.clientWidth : 0 + ), + r = Math.max( + e.scrollHeight, + e.clientHeight, + i ? i.scrollHeight : 0, + i ? i.clientHeight : 0 + ), + s = -n.scrollLeft + Ht(t), + a = -n.scrollTop + return ( + 'rtl' === mt(i || e).direction && + (s += Math.max(e.clientWidth, i ? i.clientWidth : 0) - o), + { width: o, height: r, x: s, y: a } + ) + })(_t(t)) + ) + } + function zt(t) { + return t.split('-')[1] + } + function Ft(t) { + var e, + n = t.reference, + i = t.element, + o = t.placement, + r = o ? ht(o) : null, + s = o ? zt(o) : null, + a = n.x + n.width / 2 - i.width / 2, + l = n.y + n.height / 2 - i.height / 2 + switch (r) { + case tt: + e = { x: a, y: n.y - i.height } + break + case et: + e = { x: a, y: n.y + n.height } + break + case nt: + e = { x: n.x + n.width, y: l } + break + case it: + e = { x: n.x - i.width, y: l } + break + default: + e = { x: n.x, y: n.y } + } + var c = r ? Et(r) : null + if (null != c) { + var u = 'y' === c ? 'height' : 'width' + switch (s) { + case 'start': + e[c] = e[c] - (n[u] / 2 - i[u] / 2) + break + case 'end': + e[c] = e[c] + (n[u] / 2 - i[u] / 2) + } + } + return e + } + function Yt(t, e) { + void 0 === e && (e = {}) + var n = e, + i = n.placement, + o = void 0 === i ? t.placement : i, + r = n.boundary, + s = void 0 === r ? 'clippingParents' : r, + a = n.rootBoundary, + l = void 0 === a ? 'viewport' : a, + c = n.elementContext, + u = void 0 === c ? 'popper' : c, + f = n.altBoundary, + d = void 0 !== f && f, + h = n.padding, + p = void 0 === h ? 0 : h, + g = kt('number' != typeof p ? p : At(p, ot)), + m = 'popper' === u ? 'reference' : 'popper', + v = t.elements.reference, + _ = t.rects.popper, + b = t.elements[d ? m : u], + y = (function (t, e, n) { + var i = + 'clippingParents' === e + ? (function (t) { + var e = Wt(bt(t)), + n = + ['absolute', 'fixed'].indexOf(mt(t).position) >= 0 && + ft(t) + ? wt(t) + : t + return ut(n) + ? e.filter(function (t) { + return ut(t) && gt(t, n) && 'body' !== lt(t) + }) + : [] + })(t) + : [].concat(e), + o = [].concat(i, [n]), + r = o[0], + s = o.reduce(function (e, n) { + var i = Ut(t, n) + return ( + (e.top = Math.max(i.top, e.top)), + (e.right = Math.min(i.right, e.right)), + (e.bottom = Math.min(i.bottom, e.bottom)), + (e.left = Math.max(i.left, e.left)), + e + ) + }, Ut(t, r)) + return ( + (s.width = s.right - s.left), + (s.height = s.bottom - s.top), + (s.x = s.left), + (s.y = s.top), + s + ) + })(ut(b) ? b : b.contextElement || _t(t.elements.popper), s, l), + w = Mt(v), + E = Ft({ reference: w, element: _, strategy: 'absolute', placement: o }), + T = Kt(Object.assign(Object.assign({}, _), E)), + k = 'popper' === u ? T : w, + A = { + top: y.top - k.top + g.top, + bottom: k.bottom - y.bottom + g.bottom, + left: y.left - k.left + g.left, + right: k.right - y.right + g.right, + }, + L = t.modifiersData.offset + if ('popper' === u && L) { + var O = L[o] + Object.keys(A).forEach(function (t) { + var e = [nt, et].indexOf(t) >= 0 ? 1 : -1, + n = [tt, et].indexOf(t) >= 0 ? 'y' : 'x' + A[t] += O[n] * e + }) + } + return A + } + function qt(t, e) { + void 0 === e && (e = {}) + var n = e, + i = n.placement, + o = n.boundary, + r = n.rootBoundary, + s = n.padding, + a = n.flipVariations, + l = n.allowedAutoPlacements, + c = void 0 === l ? st : l, + u = zt(i), + f = u + ? a + ? rt + : rt.filter(function (t) { + return zt(t) === u + }) + : ot, + d = f.filter(function (t) { + return c.indexOf(t) >= 0 + }) + 0 === d.length && (d = f) + var h = d.reduce(function (e, n) { + return ( + (e[n] = Yt(t, { + placement: n, + boundary: o, + rootBoundary: r, + padding: s, + })[ht(n)]), + e + ) + }, {}) + return Object.keys(h).sort(function (t, e) { + return h[t] - h[e] + }) + } + var Vt = { + name: 'flip', + enabled: !0, + phase: 'main', + fn: function (t) { + var e = t.state, + n = t.options, + i = t.name + if (!e.modifiersData[i]._skip) { + for ( + var o = n.mainAxis, + r = void 0 === o || o, + s = n.altAxis, + a = void 0 === s || s, + l = n.fallbackPlacements, + c = n.padding, + u = n.boundary, + f = n.rootBoundary, + d = n.altBoundary, + h = n.flipVariations, + p = void 0 === h || h, + g = n.allowedAutoPlacements, + m = e.options.placement, + v = ht(m), + _ = + l || + (v !== m && p + ? (function (t) { + if ('auto' === ht(t)) return [] + var e = Nt(t) + return [It(t), e, It(e)] + })(m) + : [Nt(m)]), + b = [m].concat(_).reduce(function (t, n) { + return t.concat( + 'auto' === ht(n) + ? qt(e, { + placement: n, + boundary: u, + rootBoundary: f, + padding: c, + flipVariations: p, + allowedAutoPlacements: g, + }) + : n + ) + }, []), + y = e.rects.reference, + w = e.rects.popper, + E = new Map(), + T = !0, + k = b[0], + A = 0; + A < b.length; + A++ + ) { + var L = b[A], + O = ht(L), + D = 'start' === zt(L), + x = [tt, et].indexOf(O) >= 0, + C = x ? 'width' : 'height', + S = Yt(e, { + placement: L, + boundary: u, + rootBoundary: f, + altBoundary: d, + padding: c, + }), + j = x ? (D ? nt : it) : D ? et : tt + y[C] > w[C] && (j = Nt(j)) + var N = Nt(j), + P = [] + if ( + (r && P.push(S[O] <= 0), + a && P.push(S[j] <= 0, S[N] <= 0), + P.every(function (t) { + return t + })) + ) { + ;(k = L), (T = !1) + break + } + E.set(L, P) + } + if (T) + for ( + var I = function (t) { + var e = b.find(function (e) { + var n = E.get(e) + if (n) + return n.slice(0, t).every(function (t) { + return t + }) + }) + if (e) return (k = e), 'break' + }, + M = p ? 3 : 1; + M > 0 && 'break' !== I(M); + M-- + ); + e.placement !== k && + ((e.modifiersData[i]._skip = !0), (e.placement = k), (e.reset = !0)) + } + }, + requiresIfExists: ['offset'], + data: { _skip: !1 }, + } + function Xt(t, e, n) { + return ( + void 0 === n && (n = { x: 0, y: 0 }), + { + top: t.top - e.height - n.y, + right: t.right - e.width + n.x, + bottom: t.bottom - e.height + n.y, + left: t.left - e.width - n.x, + } + ) + } + function Qt(t) { + return [tt, nt, et, it].some(function (e) { + return t[e] >= 0 + }) + } + var $t = { + name: 'hide', + enabled: !0, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: function (t) { + var e = t.state, + n = t.name, + i = e.rects.reference, + o = e.rects.popper, + r = e.modifiersData.preventOverflow, + s = Yt(e, { elementContext: 'reference' }), + a = Yt(e, { altBoundary: !0 }), + l = Xt(s, i), + c = Xt(a, o, r), + u = Qt(l), + f = Qt(c) + ;(e.modifiersData[n] = { + referenceClippingOffsets: l, + popperEscapeOffsets: c, + isReferenceHidden: u, + hasPopperEscaped: f, + }), + (e.attributes.popper = Object.assign( + Object.assign({}, e.attributes.popper), + {}, + { 'data-popper-reference-hidden': u, 'data-popper-escaped': f } + )) + }, + }, + Gt = { + name: 'offset', + enabled: !0, + phase: 'main', + requires: ['popperOffsets'], + fn: function (t) { + var e = t.state, + n = t.options, + i = t.name, + o = n.offset, + r = void 0 === o ? [0, 0] : o, + s = st.reduce(function (t, n) { + return ( + (t[n] = (function (t, e, n) { + var i = ht(t), + o = [it, tt].indexOf(i) >= 0 ? -1 : 1, + r = + 'function' == typeof n + ? n( + Object.assign( + Object.assign({}, e), + {}, + { placement: t } + ) + ) + : n, + s = r[0], + a = r[1] + return ( + (s = s || 0), + (a = (a || 0) * o), + [it, nt].indexOf(i) >= 0 ? { x: a, y: s } : { x: s, y: a } + ) + })(n, e.rects, r)), + t + ) + }, {}), + a = s[e.placement], + l = a.x, + c = a.y + null != e.modifiersData.popperOffsets && + ((e.modifiersData.popperOffsets.x += l), + (e.modifiersData.popperOffsets.y += c)), + (e.modifiersData[i] = s) + }, + }, + Zt = { + name: 'popperOffsets', + enabled: !0, + phase: 'read', + fn: function (t) { + var e = t.state, + n = t.name + e.modifiersData[n] = Ft({ + reference: e.rects.reference, + element: e.rects.popper, + strategy: 'absolute', + placement: e.placement, + }) + }, + data: {}, + }, + Jt = { + name: 'preventOverflow', + enabled: !0, + phase: 'main', + fn: function (t) { + var e = t.state, + n = t.options, + i = t.name, + o = n.mainAxis, + r = void 0 === o || o, + s = n.altAxis, + a = void 0 !== s && s, + l = n.boundary, + c = n.rootBoundary, + u = n.altBoundary, + f = n.padding, + d = n.tether, + h = void 0 === d || d, + p = n.tetherOffset, + g = void 0 === p ? 0 : p, + m = Yt(e, { + boundary: l, + rootBoundary: c, + padding: f, + altBoundary: u, + }), + v = ht(e.placement), + _ = zt(e.placement), + b = !_, + y = Et(v), + w = 'x' === y ? 'y' : 'x', + E = e.modifiersData.popperOffsets, + T = e.rects.reference, + k = e.rects.popper, + A = + 'function' == typeof g + ? g( + Object.assign( + Object.assign({}, e.rects), + {}, + { placement: e.placement } + ) + ) + : g, + L = { x: 0, y: 0 } + if (E) { + if (r) { + var O = 'y' === y ? tt : it, + D = 'y' === y ? et : nt, + x = 'y' === y ? 'height' : 'width', + C = E[y], + S = E[y] + m[O], + j = E[y] - m[D], + N = h ? -k[x] / 2 : 0, + P = 'start' === _ ? T[x] : k[x], + I = 'start' === _ ? -k[x] : -T[x], + M = e.elements.arrow, + B = h && M ? pt(M) : { width: 0, height: 0 }, + H = e.modifiersData['arrow#persistent'] + ? e.modifiersData['arrow#persistent'].padding + : { top: 0, right: 0, bottom: 0, left: 0 }, + R = H[O], + W = H[D], + K = Tt(0, T[x], B[x]), + U = b ? T[x] / 2 - N - K - R - A : P - K - R - A, + z = b ? -T[x] / 2 + N + K + W + A : I + K + W + A, + F = e.elements.arrow && wt(e.elements.arrow), + Y = F ? ('y' === y ? F.clientTop || 0 : F.clientLeft || 0) : 0, + q = e.modifiersData.offset + ? e.modifiersData.offset[e.placement][y] + : 0, + V = E[y] + U - q - Y, + X = E[y] + z - q, + Q = Tt(h ? Math.min(S, V) : S, C, h ? Math.max(j, X) : j) + ;(E[y] = Q), (L[y] = Q - C) + } + if (a) { + var $ = 'x' === y ? tt : it, + G = 'x' === y ? et : nt, + Z = E[w], + J = Tt(Z + m[$], Z, Z - m[G]) + ;(E[w] = J), (L[w] = J - Z) + } + e.modifiersData[i] = L + } + }, + requiresIfExists: ['offset'], + } + function te(t, e, n) { + void 0 === n && (n = !1) + var i, + o, + r = _t(e), + s = Mt(t), + a = ft(e), + l = { scrollLeft: 0, scrollTop: 0 }, + c = { x: 0, y: 0 } + return ( + (a || (!a && !n)) && + (('body' !== lt(e) || Rt(r)) && + (l = + (i = e) !== ct(i) && ft(i) + ? { scrollLeft: (o = i).scrollLeft, scrollTop: o.scrollTop } + : Bt(i)), + ft(e) + ? (((c = Mt(e)).x += e.clientLeft), (c.y += e.clientTop)) + : r && (c.x = Ht(r))), + { + x: s.left + l.scrollLeft - c.x, + y: s.top + l.scrollTop - c.y, + width: s.width, + height: s.height, + } + ) + } + var ee = { placement: 'bottom', modifiers: [], strategy: 'absolute' } + function ne() { + for (var t = arguments.length, e = new Array(t), n = 0; n < t; n++) + e[n] = arguments[n] + return !e.some(function (t) { + return !(t && 'function' == typeof t.getBoundingClientRect) + }) + } + function ie(t) { + void 0 === t && (t = {}) + var e = t, + n = e.defaultModifiers, + i = void 0 === n ? [] : n, + o = e.defaultOptions, + r = void 0 === o ? ee : o + return function (t, e, n) { + void 0 === n && (n = r) + var o, + s, + a = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign(Object.assign({}, ee), r), + modifiersData: {}, + elements: { reference: t, popper: e }, + attributes: {}, + styles: {}, + }, + l = [], + c = !1, + u = { + state: a, + setOptions: function (n) { + f(), + (a.options = Object.assign( + Object.assign(Object.assign({}, r), a.options), + n + )), + (a.scrollParents = { + reference: ut(t) + ? Wt(t) + : t.contextElement + ? Wt(t.contextElement) + : [], + popper: Wt(e), + }) + var o, + s, + c = (function (t) { + var e = (function (t) { + var e = new Map(), + n = new Set(), + i = [] + return ( + t.forEach(function (t) { + e.set(t.name, t) + }), + t.forEach(function (t) { + n.has(t.name) || + (function t(o) { + n.add(o.name), + [] + .concat( + o.requires || [], + o.requiresIfExists || [] + ) + .forEach(function (i) { + if (!n.has(i)) { + var o = e.get(i) + o && t(o) + } + }), + i.push(o) + })(t) + }), + i + ) + })(t) + return at.reduce(function (t, n) { + return t.concat( + e.filter(function (t) { + return t.phase === n + }) + ) + }, []) + })( + ((o = [].concat(i, a.options.modifiers)), + (s = o.reduce(function (t, e) { + var n = t[e.name] + return ( + (t[e.name] = n + ? Object.assign( + Object.assign(Object.assign({}, n), e), + {}, + { + options: Object.assign( + Object.assign({}, n.options), + e.options + ), + data: Object.assign( + Object.assign({}, n.data), + e.data + ), + } + ) + : e), + t + ) + }, {})), + Object.keys(s).map(function (t) { + return s[t] + })) + ) + return ( + (a.orderedModifiers = c.filter(function (t) { + return t.enabled + })), + a.orderedModifiers.forEach(function (t) { + var e = t.name, + n = t.options, + i = void 0 === n ? {} : n, + o = t.effect + if ('function' == typeof o) { + var r = o({ state: a, name: e, instance: u, options: i }) + l.push(r || function () {}) + } + }), + u.update() + ) + }, + forceUpdate: function () { + if (!c) { + var t = a.elements, + e = t.reference, + n = t.popper + if (ne(e, n)) { + ;(a.rects = { + reference: te(e, wt(n), 'fixed' === a.options.strategy), + popper: pt(n), + }), + (a.reset = !1), + (a.placement = a.options.placement), + a.orderedModifiers.forEach(function (t) { + return (a.modifiersData[t.name] = Object.assign({}, t.data)) + }) + for (var i = 0; i < a.orderedModifiers.length; i++) + if (!0 !== a.reset) { + var o = a.orderedModifiers[i], + r = o.fn, + s = o.options, + l = void 0 === s ? {} : s, + f = o.name + 'function' == typeof r && + (a = + r({ state: a, options: l, name: f, instance: u }) || a) + } else (a.reset = !1), (i = -1) + } + } + }, + update: + ((o = function () { + return new Promise(function (t) { + u.forceUpdate(), t(a) + }) + }), + function () { + return ( + s || + (s = new Promise(function (t) { + Promise.resolve().then(function () { + ;(s = void 0), t(o()) + }) + })), + s + ) + }), + destroy: function () { + f(), (c = !0) + }, + } + if (!ne(t, e)) return u + function f() { + l.forEach(function (t) { + return t() + }), + (l = []) + } + return ( + u.setOptions(n).then(function (t) { + !c && n.onFirstUpdate && n.onFirstUpdate(t) + }), + u + ) + } + } + var oe = ie(), + re = ie({ defaultModifiers: [St, Zt, xt, dt] }), + se = ie({ defaultModifiers: [St, Zt, xt, dt, Gt, Vt, Jt, Lt, $t] }), + ae = Object.freeze({ + __proto__: null, + popperGenerator: ie, + detectOverflow: Yt, + createPopperBase: oe, + createPopper: se, + createPopperLite: re, + top: tt, + bottom: et, + right: nt, + left: it, + auto: 'auto', + basePlacements: ot, + start: 'start', + end: 'end', + clippingParents: 'clippingParents', + viewport: 'viewport', + popper: 'popper', + reference: 'reference', + variationPlacements: rt, + placements: st, + beforeRead: 'beforeRead', + read: 'read', + afterRead: 'afterRead', + beforeMain: 'beforeMain', + main: 'main', + afterMain: 'afterMain', + beforeWrite: 'beforeWrite', + write: 'write', + afterWrite: 'afterWrite', + modifierPhases: at, + applyStyles: dt, + arrow: Lt, + computeStyles: xt, + eventListeners: St, + flip: Vt, + hide: $t, + offset: Gt, + popperOffsets: Zt, + preventOverflow: Jt, + }), + le = new RegExp('ArrowUp|ArrowDown|Escape'), + ce = b ? 'top-end' : 'top-start', + ue = b ? 'top-start' : 'top-end', + fe = b ? 'bottom-end' : 'bottom-start', + de = b ? 'bottom-start' : 'bottom-end', + he = b ? 'left-start' : 'right-start', + pe = b ? 'right-start' : 'left-start', + ge = { + offset: [0, 2], + flip: !0, + boundary: 'clippingParents', + reference: 'toggle', + display: 'dynamic', + popperConfig: null, + }, + me = { + offset: '(array|string|function)', + flip: 'boolean', + boundary: '(string|element)', + reference: '(string|element|object)', + display: 'string', + popperConfig: '(null|object|function)', + }, + ve = (function (t) { + function o(e, n) { + var i + return ( + ((i = t.call(this, e) || this)._popper = null), + (i._config = i._getConfig(n)), + (i._menu = i._getMenuElement()), + (i._inNavbar = i._detectNavbar()), + i._addEventListeners(), + i + ) + } + i(o, t) + var r = o.prototype + return ( + (r.toggle = function () { + if ( + !this._element.disabled && + !this._element.classList.contains('disabled') + ) { + var t = this._element.classList.contains('show') + o.clearMenus(), t || this.show() + } + }), + (r.show = function () { + if ( + !( + this._element.disabled || + this._element.classList.contains('disabled') || + this._menu.classList.contains('show') + ) + ) { + var t = o.getParentFromElement(this._element), + e = { relatedTarget: this._element } + if ( + !B.trigger(this._element, 'show.bs.dropdown', e).defaultPrevented + ) { + if (this._inNavbar) + z.setDataAttribute(this._menu, 'popper', 'none') + else { + if (void 0 === ae) + throw new TypeError( + "Bootstrap's dropdowns require Popper (https://popper.js.org)" + ) + var n = this._element + 'parent' === this._config.reference + ? (n = t) + : d(this._config.reference) + ? ((n = this._config.reference), + void 0 !== this._config.reference.jquery && + (n = this._config.reference[0])) + : 'object' == typeof this._config.reference && + (n = this._config.reference) + var i = this._getPopperConfig(), + r = i.modifiers.find(function (t) { + return 'applyStyles' === t.name && !1 === t.enabled + }) + ;(this._popper = se(n, this._menu, i)), + r && z.setDataAttribute(this._menu, 'popper', 'static') + } + var s + 'ontouchstart' in document.documentElement && + !t.closest('.navbar-nav') && + (s = []).concat + .apply(s, document.body.children) + .forEach(function (t) { + return B.on(t, 'mouseover', null, function () {}) + }), + this._element.focus(), + this._element.setAttribute('aria-expanded', !0), + this._menu.classList.toggle('show'), + this._element.classList.toggle('show'), + B.trigger(this._element, 'shown.bs.dropdown', e) + } + } + }), + (r.hide = function () { + if ( + !this._element.disabled && + !this._element.classList.contains('disabled') && + this._menu.classList.contains('show') + ) { + var t = { relatedTarget: this._element } + B.trigger(this._element, 'hide.bs.dropdown', t).defaultPrevented || + (this._popper && this._popper.destroy(), + this._menu.classList.toggle('show'), + this._element.classList.toggle('show'), + z.removeDataAttribute(this._menu, 'popper'), + B.trigger(this._element, 'hidden.bs.dropdown', t)) + } + }), + (r.dispose = function () { + t.prototype.dispose.call(this), + B.off(this._element, '.bs.dropdown'), + (this._menu = null), + this._popper && (this._popper.destroy(), (this._popper = null)) + }), + (r.update = function () { + ;(this._inNavbar = this._detectNavbar()), + this._popper && this._popper.update() + }), + (r._addEventListeners = function () { + var t = this + B.on(this._element, 'click.bs.dropdown', function (e) { + e.preventDefault(), e.stopPropagation(), t.toggle() + }) + }), + (r._getConfig = function (t) { + if ( + ((t = n( + {}, + this.constructor.Default, + z.getDataAttributes(this._element), + t + )), + p('dropdown', t, this.constructor.DefaultType), + 'object' == typeof t.reference && + !d(t.reference) && + 'function' != typeof t.reference.getBoundingClientRect) + ) + throw new TypeError( + 'dropdown'.toUpperCase() + + ': Option "reference" provided type "object" without a required "getBoundingClientRect" method.' + ) + return t + }), + (r._getMenuElement = function () { + return (function (t, e) { + for (var n = t.nextElementSibling; n; ) { + if (n.matches(e)) return [n] + n = n.nextElementSibling + } + return [] + })(this._element, '.dropdown-menu')[0] + }), + (r._getPlacement = function () { + var t = this._element.parentNode + if (t.classList.contains('dropend')) return he + if (t.classList.contains('dropstart')) return pe + var e = + 'end' === + getComputedStyle(this._menu) + .getPropertyValue('--bs-position') + .trim() + return t.classList.contains('dropup') ? (e ? ue : ce) : e ? de : fe + }), + (r._detectNavbar = function () { + return null !== this._element.closest('.navbar') + }), + (r._getOffset = function () { + var t = this, + e = this._config.offset + return 'string' == typeof e + ? e.split(',').map(function (t) { + return Number.parseInt(t, 10) + }) + : 'function' == typeof e + ? function (n) { + return e(n, t._element) + } + : e + }), + (r._getPopperConfig = function () { + var t = { + placement: this._getPlacement(), + modifiers: [ + { + name: 'preventOverflow', + options: { + altBoundary: this._config.flip, + boundary: this._config.boundary, + }, + }, + { name: 'offset', options: { offset: this._getOffset() } }, + ], + } + return ( + 'static' === this._config.display && + (t.modifiers = [{ name: 'applyStyles', enabled: !1 }]), + n( + {}, + t, + 'function' == typeof this._config.popperConfig + ? this._config.popperConfig(t) + : this._config.popperConfig + ) + ) + }), + (o.dropdownInterface = function (t, e) { + var n = T(t, 'bs.dropdown') + if ( + (n || (n = new o(t, 'object' == typeof e ? e : null)), + 'string' == typeof e) + ) { + if (void 0 === n[e]) + throw new TypeError('No method named "' + e + '"') + n[e]() + } + }), + (o.jQueryInterface = function (t) { + return this.each(function () { + o.dropdownInterface(this, t) + }) + }), + (o.clearMenus = function (t) { + if (!t || (2 !== t.button && ('keyup' !== t.type || 'Tab' === t.key))) + for ( + var e = F('[data-bs-toggle="dropdown"]'), n = 0, i = e.length; + n < i; + n++ + ) { + var o = T(e[n], 'bs.dropdown'), + r = { relatedTarget: e[n] } + if ((t && 'click' === t.type && (r.clickEvent = t), o)) { + var s, + a = o._menu + if ( + e[n].classList.contains('show') && + !( + (t && + (('click' === t.type && + /input|textarea/i.test(t.target.tagName)) || + ('keyup' === t.type && 'Tab' === t.key)) && + a.contains(t.target)) || + B.trigger(e[n], 'hide.bs.dropdown', r).defaultPrevented + ) + ) + 'ontouchstart' in document.documentElement && + (s = []).concat + .apply(s, document.body.children) + .forEach(function (t) { + return B.off(t, 'mouseover', null, function () {}) + }), + e[n].setAttribute('aria-expanded', 'false'), + o._popper && o._popper.destroy(), + a.classList.remove('show'), + e[n].classList.remove('show'), + z.removeDataAttribute(a, 'popper'), + B.trigger(e[n], 'hidden.bs.dropdown', r) + } + } + }), + (o.getParentFromElement = function (t) { + return c(t) || t.parentNode + }), + (o.dataApiKeydownHandler = function (t) { + if ( + !(/input|textarea/i.test(t.target.tagName) + ? 'Space' === t.key || + ('Escape' !== t.key && + (('ArrowDown' !== t.key && 'ArrowUp' !== t.key) || + t.target.closest('.dropdown-menu'))) + : !le.test(t.key)) && + (t.preventDefault(), + t.stopPropagation(), + !this.disabled && !this.classList.contains('disabled')) + ) { + var e = o.getParentFromElement(this), + n = this.classList.contains('show') + if ('Escape' === t.key) + return ( + (this.matches('[data-bs-toggle="dropdown"]') + ? this + : V(this, '[data-bs-toggle="dropdown"]')[0] + ).focus(), + void o.clearMenus() + ) + if (n || ('ArrowUp' !== t.key && 'ArrowDown' !== t.key)) + if (n && 'Space' !== t.key) { + var i = F( + '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)', + e + ).filter(g) + if (i.length) { + var r = i.indexOf(t.target) + 'ArrowUp' === t.key && r > 0 && r--, + 'ArrowDown' === t.key && r < i.length - 1 && r++, + i[(r = -1 === r ? 0 : r)].focus() + } + } else o.clearMenus() + else + (this.matches('[data-bs-toggle="dropdown"]') + ? this + : V(this, '[data-bs-toggle="dropdown"]')[0] + ).click() + } + }), + e(o, null, [ + { + key: 'Default', + get: function () { + return ge + }, + }, + { + key: 'DefaultType', + get: function () { + return me + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.dropdown' + }, + }, + ]), + o + ) + })(H) + B.on( + document, + 'keydown.bs.dropdown.data-api', + '[data-bs-toggle="dropdown"]', + ve.dataApiKeydownHandler + ), + B.on( + document, + 'keydown.bs.dropdown.data-api', + '.dropdown-menu', + ve.dataApiKeydownHandler + ), + B.on(document, 'click.bs.dropdown.data-api', ve.clearMenus), + B.on(document, 'keyup.bs.dropdown.data-api', ve.clearMenus), + B.on( + document, + 'click.bs.dropdown.data-api', + '[data-bs-toggle="dropdown"]', + function (t) { + t.preventDefault(), + t.stopPropagation(), + ve.dropdownInterface(this, 'toggle') + } + ), + B.on(document, 'click.bs.dropdown.data-api', '.dropdown form', function ( + t + ) { + return t.stopPropagation() + }), + y('dropdown', ve) + var _e = { backdrop: !0, keyboard: !0, focus: !0 }, + be = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean', + }, + ye = (function (t) { + function o(e, n) { + var i + return ( + ((i = t.call(this, e) || this)._config = i._getConfig(n)), + (i._dialog = Y('.modal-dialog', e)), + (i._backdrop = null), + (i._isShown = !1), + (i._isBodyOverflowing = !1), + (i._ignoreBackdropClick = !1), + (i._isTransitioning = !1), + (i._scrollbarWidth = 0), + i + ) + } + i(o, t) + var r = o.prototype + return ( + (r.toggle = function (t) { + return this._isShown ? this.hide() : this.show(t) + }), + (r.show = function (t) { + var e = this + if (!this._isShown && !this._isTransitioning) { + this._element.classList.contains('fade') && + (this._isTransitioning = !0) + var n = B.trigger(this._element, 'show.bs.modal', { + relatedTarget: t, + }) + this._isShown || + n.defaultPrevented || + ((this._isShown = !0), + this._checkScrollbar(), + this._setScrollbar(), + this._adjustDialog(), + this._setEscapeEvent(), + this._setResizeEvent(), + B.on( + this._element, + 'click.dismiss.bs.modal', + '[data-bs-dismiss="modal"]', + function (t) { + return e.hide(t) + } + ), + B.on(this._dialog, 'mousedown.dismiss.bs.modal', function () { + B.one(e._element, 'mouseup.dismiss.bs.modal', function (t) { + t.target === e._element && (e._ignoreBackdropClick = !0) + }) + }), + this._showBackdrop(function () { + return e._showElement(t) + })) + } + }), + (r.hide = function (t) { + var e = this + if ( + (t && t.preventDefault(), + this._isShown && + !this._isTransitioning && + !B.trigger(this._element, 'hide.bs.modal').defaultPrevented) + ) { + this._isShown = !1 + var n = this._element.classList.contains('fade') + if ( + (n && (this._isTransitioning = !0), + this._setEscapeEvent(), + this._setResizeEvent(), + B.off(document, 'focusin.bs.modal'), + this._element.classList.remove('show'), + B.off(this._element, 'click.dismiss.bs.modal'), + B.off(this._dialog, 'mousedown.dismiss.bs.modal'), + n) + ) { + var i = u(this._element) + B.one(this._element, 'transitionend', function (t) { + return e._hideModal(t) + }), + h(this._element, i) + } else this._hideModal() + } + }), + (r.dispose = function () { + ;[window, this._element, this._dialog].forEach(function (t) { + return B.off(t, '.bs.modal') + }), + t.prototype.dispose.call(this), + B.off(document, 'focusin.bs.modal'), + (this._config = null), + (this._dialog = null), + (this._backdrop = null), + (this._isShown = null), + (this._isBodyOverflowing = null), + (this._ignoreBackdropClick = null), + (this._isTransitioning = null), + (this._scrollbarWidth = null) + }), + (r.handleUpdate = function () { + this._adjustDialog() + }), + (r._getConfig = function (t) { + return (t = n({}, _e, t)), p('modal', t, be), t + }), + (r._showElement = function (t) { + var e = this, + n = this._element.classList.contains('fade'), + i = Y('.modal-body', this._dialog) + ;(this._element.parentNode && + this._element.parentNode.nodeType === Node.ELEMENT_NODE) || + document.body.appendChild(this._element), + (this._element.style.display = 'block'), + this._element.removeAttribute('aria-hidden'), + this._element.setAttribute('aria-modal', !0), + this._element.setAttribute('role', 'dialog'), + (this._element.scrollTop = 0), + i && (i.scrollTop = 0), + n && v(this._element), + this._element.classList.add('show'), + this._config.focus && this._enforceFocus() + var o = function () { + e._config.focus && e._element.focus(), + (e._isTransitioning = !1), + B.trigger(e._element, 'shown.bs.modal', { relatedTarget: t }) + } + if (n) { + var r = u(this._dialog) + B.one(this._dialog, 'transitionend', o), h(this._dialog, r) + } else o() + }), + (r._enforceFocus = function () { + var t = this + B.off(document, 'focusin.bs.modal'), + B.on(document, 'focusin.bs.modal', function (e) { + document === e.target || + t._element === e.target || + t._element.contains(e.target) || + t._element.focus() + }) + }), + (r._setEscapeEvent = function () { + var t = this + this._isShown + ? B.on(this._element, 'keydown.dismiss.bs.modal', function (e) { + t._config.keyboard && 'Escape' === e.key + ? (e.preventDefault(), t.hide()) + : t._config.keyboard || + 'Escape' !== e.key || + t._triggerBackdropTransition() + }) + : B.off(this._element, 'keydown.dismiss.bs.modal') + }), + (r._setResizeEvent = function () { + var t = this + this._isShown + ? B.on(window, 'resize.bs.modal', function () { + return t._adjustDialog() + }) + : B.off(window, 'resize.bs.modal') + }), + (r._hideModal = function () { + var t = this + ;(this._element.style.display = 'none'), + this._element.setAttribute('aria-hidden', !0), + this._element.removeAttribute('aria-modal'), + this._element.removeAttribute('role'), + (this._isTransitioning = !1), + this._showBackdrop(function () { + document.body.classList.remove('modal-open'), + t._resetAdjustments(), + t._resetScrollbar(), + B.trigger(t._element, 'hidden.bs.modal') + }) + }), + (r._removeBackdrop = function () { + this._backdrop.parentNode.removeChild(this._backdrop), + (this._backdrop = null) + }), + (r._showBackdrop = function (t) { + var e = this, + n = this._element.classList.contains('fade') ? 'fade' : '' + if (this._isShown && this._config.backdrop) { + if ( + ((this._backdrop = document.createElement('div')), + (this._backdrop.className = 'modal-backdrop'), + n && this._backdrop.classList.add(n), + document.body.appendChild(this._backdrop), + B.on(this._element, 'click.dismiss.bs.modal', function (t) { + e._ignoreBackdropClick + ? (e._ignoreBackdropClick = !1) + : t.target === t.currentTarget && + ('static' === e._config.backdrop + ? e._triggerBackdropTransition() + : e.hide()) + }), + n && v(this._backdrop), + this._backdrop.classList.add('show'), + !n) + ) + return void t() + var i = u(this._backdrop) + B.one(this._backdrop, 'transitionend', t), h(this._backdrop, i) + } else if (!this._isShown && this._backdrop) { + this._backdrop.classList.remove('show') + var o = function () { + e._removeBackdrop(), t() + } + if (this._element.classList.contains('fade')) { + var r = u(this._backdrop) + B.one(this._backdrop, 'transitionend', o), h(this._backdrop, r) + } else o() + } else t() + }), + (r._triggerBackdropTransition = function () { + var t = this + if ( + !B.trigger(this._element, 'hidePrevented.bs.modal').defaultPrevented + ) { + var e = + this._element.scrollHeight > document.documentElement.clientHeight + e || (this._element.style.overflowY = 'hidden'), + this._element.classList.add('modal-static') + var n = u(this._dialog) + B.off(this._element, 'transitionend'), + B.one(this._element, 'transitionend', function () { + t._element.classList.remove('modal-static'), + e || + (B.one(t._element, 'transitionend', function () { + t._element.style.overflowY = '' + }), + h(t._element, n)) + }), + h(this._element, n), + this._element.focus() + } + }), + (r._adjustDialog = function () { + var t = + this._element.scrollHeight > document.documentElement.clientHeight + ;((!this._isBodyOverflowing && t && !b) || + (this._isBodyOverflowing && !t && b)) && + (this._element.style.paddingLeft = this._scrollbarWidth + 'px'), + ((this._isBodyOverflowing && !t && !b) || + (!this._isBodyOverflowing && t && b)) && + (this._element.style.paddingRight = this._scrollbarWidth + 'px') + }), + (r._resetAdjustments = function () { + ;(this._element.style.paddingLeft = ''), + (this._element.style.paddingRight = '') + }), + (r._checkScrollbar = function () { + var t = document.body.getBoundingClientRect() + ;(this._isBodyOverflowing = + Math.round(t.left + t.right) < window.innerWidth), + (this._scrollbarWidth = this._getScrollbarWidth()) + }), + (r._setScrollbar = function () { + var t = this + this._isBodyOverflowing && + (this._setElementAttributes( + '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', + 'paddingRight', + function (e) { + return e + t._scrollbarWidth + } + ), + this._setElementAttributes('.sticky-top', 'marginRight', function ( + e + ) { + return e - t._scrollbarWidth + }), + this._setElementAttributes('body', 'paddingRight', function (e) { + return e + t._scrollbarWidth + })), + document.body.classList.add('modal-open') + }), + (r._setElementAttributes = function (t, e, n) { + F(t).forEach(function (t) { + var i = t.style[e], + o = window.getComputedStyle(t)[e] + z.setDataAttribute(t, e, i), + (t.style[e] = n(Number.parseFloat(o)) + 'px') + }) + }), + (r._resetScrollbar = function () { + this._resetElementAttributes( + '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', + 'paddingRight' + ), + this._resetElementAttributes('.sticky-top', 'marginRight'), + this._resetElementAttributes('body', 'paddingRight') + }), + (r._resetElementAttributes = function (t, e) { + F(t).forEach(function (t) { + var n = z.getDataAttribute(t, e) + void 0 === n && t === document.body + ? (t.style[e] = '') + : (z.removeDataAttribute(t, e), (t.style[e] = n)) + }) + }), + (r._getScrollbarWidth = function () { + var t = document.createElement('div') + ;(t.className = 'modal-scrollbar-measure'), + document.body.appendChild(t) + var e = t.getBoundingClientRect().width - t.clientWidth + return document.body.removeChild(t), e + }), + (o.jQueryInterface = function (t, e) { + return this.each(function () { + var i = T(this, 'bs.modal'), + r = n( + {}, + _e, + z.getDataAttributes(this), + 'object' == typeof t && t ? t : {} + ) + if ((i || (i = new o(this, r)), 'string' == typeof t)) { + if (void 0 === i[t]) + throw new TypeError('No method named "' + t + '"') + i[t](e) + } + }) + }), + e(o, null, [ + { + key: 'Default', + get: function () { + return _e + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.modal' + }, + }, + ]), + o + ) + })(H) + B.on( + document, + 'click.bs.modal.data-api', + '[data-bs-toggle="modal"]', + function (t) { + var e = this, + i = c(this) + ;('A' !== this.tagName && 'AREA' !== this.tagName) || t.preventDefault(), + B.one(i, 'show.bs.modal', function (t) { + t.defaultPrevented || + B.one(i, 'hidden.bs.modal', function () { + g(e) && e.focus() + }) + }) + var o = T(i, 'bs.modal') + if (!o) { + var r = n({}, z.getDataAttributes(i), z.getDataAttributes(this)) + o = new ye(i, r) + } + o.toggle(this) + } + ), + y('modal', ye) + var we = new Set([ + 'background', + 'cite', + 'href', + 'itemtype', + 'longdesc', + 'poster', + 'src', + 'xlink:href', + ]), + Ee = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi, + Te = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i + function ke(t, e, n) { + var i + if (!t.length) return t + if (n && 'function' == typeof n) return n(t) + for ( + var o = new window.DOMParser().parseFromString(t, 'text/html'), + r = Object.keys(e), + s = (i = []).concat.apply(i, o.body.querySelectorAll('*')), + a = function (t, n) { + var i, + o = s[t], + a = o.nodeName.toLowerCase() + if (!r.includes(a)) return o.parentNode.removeChild(o), 'continue' + var l = (i = []).concat.apply(i, o.attributes), + c = [].concat(e['*'] || [], e[a] || []) + l.forEach(function (t) { + ;(function (t, e) { + var n = t.nodeName.toLowerCase() + if (e.includes(n)) + return ( + !we.has(n) || + Boolean(Ee.test(t.nodeValue) || Te.test(t.nodeValue)) + ) + for ( + var i = e.filter(function (t) { + return t instanceof RegExp + }), + o = 0, + r = i.length; + o < r; + o++ + ) + if (i[o].test(n)) return !0 + return !1 + })(t, c) || o.removeAttribute(t.nodeName) + }) + }, + l = 0, + c = s.length; + l < c; + l++ + ) + a(l) + return o.body.innerHTML + } + var Ae = new RegExp('(^|\\s)bs-tooltip\\S+', 'g'), + Le = new Set(['sanitize', 'allowList', 'sanitizeFn']), + Oe = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(array|string|function)', + container: '(string|element|boolean)', + fallbackPlacements: 'array', + boundary: '(string|element)', + customClass: '(string|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + allowList: 'object', + popperConfig: '(null|object|function)', + }, + De = { + AUTO: 'auto', + TOP: 'top', + RIGHT: b ? 'left' : 'right', + BOTTOM: 'bottom', + LEFT: b ? 'right' : 'left', + }, + xe = { + animation: !0, + template: + '', + trigger: 'hover focus', + title: '', + delay: 0, + html: !1, + selector: !1, + placement: 'top', + offset: [0, 0], + container: !1, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], + boundary: 'clippingParents', + customClass: '', + sanitize: !0, + sanitizeFn: null, + allowList: { + '*': ['class', 'dir', 'id', 'lang', 'role', /^aria-[\w-]*$/i], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [], + }, + popperConfig: null, + }, + Ce = { + HIDE: 'hide.bs.tooltip', + HIDDEN: 'hidden.bs.tooltip', + SHOW: 'show.bs.tooltip', + SHOWN: 'shown.bs.tooltip', + INSERTED: 'inserted.bs.tooltip', + CLICK: 'click.bs.tooltip', + FOCUSIN: 'focusin.bs.tooltip', + FOCUSOUT: 'focusout.bs.tooltip', + MOUSEENTER: 'mouseenter.bs.tooltip', + MOUSELEAVE: 'mouseleave.bs.tooltip', + }, + Se = (function (t) { + function o(e, n) { + var i + if (void 0 === ae) + throw new TypeError( + "Bootstrap's tooltips require Popper (https://popper.js.org)" + ) + return ( + ((i = t.call(this, e) || this)._isEnabled = !0), + (i._timeout = 0), + (i._hoverState = ''), + (i._activeTrigger = {}), + (i._popper = null), + (i.config = i._getConfig(n)), + (i.tip = null), + i._setListeners(), + i + ) + } + i(o, t) + var r = o.prototype + return ( + (r.enable = function () { + this._isEnabled = !0 + }), + (r.disable = function () { + this._isEnabled = !1 + }), + (r.toggleEnabled = function () { + this._isEnabled = !this._isEnabled + }), + (r.toggle = function (t) { + if (this._isEnabled) + if (t) { + var e = this._initializeOnDelegatedTarget(t) + ;(e._activeTrigger.click = !e._activeTrigger.click), + e._isWithActiveTrigger() ? e._enter(null, e) : e._leave(null, e) + } else { + if (this.getTipElement().classList.contains('show')) + return void this._leave(null, this) + this._enter(null, this) + } + }), + (r.dispose = function () { + clearTimeout(this._timeout), + B.off(this._element, this.constructor.EVENT_KEY), + B.off( + this._element.closest('.modal'), + 'hide.bs.modal', + this._hideModalHandler + ), + this.tip && + this.tip.parentNode && + this.tip.parentNode.removeChild(this.tip), + (this._isEnabled = null), + (this._timeout = null), + (this._hoverState = null), + (this._activeTrigger = null), + this._popper && this._popper.destroy(), + (this._popper = null), + (this.config = null), + (this.tip = null), + t.prototype.dispose.call(this) + }), + (r.show = function () { + var t = this + if ('none' === this._element.style.display) + throw new Error('Please use show on visible elements') + if (this.isWithContent() && this._isEnabled) { + var e = B.trigger(this._element, this.constructor.Event.SHOW), + n = (function t(e) { + if (!document.documentElement.attachShadow) return null + if ('function' == typeof e.getRootNode) { + var n = e.getRootNode() + return n instanceof ShadowRoot ? n : null + } + return e instanceof ShadowRoot + ? e + : e.parentNode + ? t(e.parentNode) + : null + })(this._element), + i = + null === n + ? this._element.ownerDocument.documentElement.contains( + this._element + ) + : n.contains(this._element) + if (!e.defaultPrevented && i) { + var o = this.getTipElement(), + r = s(this.constructor.NAME) + o.setAttribute('id', r), + this._element.setAttribute('aria-describedby', r), + this.setContent(), + this.config.animation && o.classList.add('fade') + var a = + 'function' == typeof this.config.placement + ? this.config.placement.call(this, o, this._element) + : this.config.placement, + l = this._getAttachment(a) + this._addAttachmentClass(l) + var c = this._getContainer() + E(o, this.constructor.DATA_KEY, this), + this._element.ownerDocument.documentElement.contains( + this.tip + ) || c.appendChild(o), + B.trigger(this._element, this.constructor.Event.INSERTED), + (this._popper = se(this._element, o, this._getPopperConfig(l))), + o.classList.add('show') + var f, + d, + p = + 'function' == typeof this.config.customClass + ? this.config.customClass() + : this.config.customClass + p && (f = o.classList).add.apply(f, p.split(' ')), + 'ontouchstart' in document.documentElement && + (d = []).concat + .apply(d, document.body.children) + .forEach(function (t) { + B.on(t, 'mouseover', function () {}) + }) + var g = function () { + var e = t._hoverState + ;(t._hoverState = null), + B.trigger(t._element, t.constructor.Event.SHOWN), + 'out' === e && t._leave(null, t) + } + if (this.tip.classList.contains('fade')) { + var m = u(this.tip) + B.one(this.tip, 'transitionend', g), h(this.tip, m) + } else g() + } + } + }), + (r.hide = function () { + var t = this + if (this._popper) { + var e = this.getTipElement(), + n = function () { + 'show' !== t._hoverState && + e.parentNode && + e.parentNode.removeChild(e), + t._cleanTipClass(), + t._element.removeAttribute('aria-describedby'), + B.trigger(t._element, t.constructor.Event.HIDDEN), + t._popper && (t._popper.destroy(), (t._popper = null)) + } + if ( + !B.trigger(this._element, this.constructor.Event.HIDE) + .defaultPrevented + ) { + var i + if ( + (e.classList.remove('show'), + 'ontouchstart' in document.documentElement && + (i = []).concat + .apply(i, document.body.children) + .forEach(function (t) { + return B.off(t, 'mouseover', m) + }), + (this._activeTrigger.click = !1), + (this._activeTrigger.focus = !1), + (this._activeTrigger.hover = !1), + this.tip.classList.contains('fade')) + ) { + var o = u(e) + B.one(e, 'transitionend', n), h(e, o) + } else n() + this._hoverState = '' + } + } + }), + (r.update = function () { + null !== this._popper && this._popper.update() + }), + (r.isWithContent = function () { + return Boolean(this.getTitle()) + }), + (r.getTipElement = function () { + if (this.tip) return this.tip + var t = document.createElement('div') + return ( + (t.innerHTML = this.config.template), + (this.tip = t.children[0]), + this.tip + ) + }), + (r.setContent = function () { + var t = this.getTipElement() + this.setElementContent(Y('.tooltip-inner', t), this.getTitle()), + t.classList.remove('fade', 'show') + }), + (r.setElementContent = function (t, e) { + if (null !== t) + return 'object' == typeof e && d(e) + ? (e.jquery && (e = e[0]), + void (this.config.html + ? e.parentNode !== t && ((t.innerHTML = ''), t.appendChild(e)) + : (t.textContent = e.textContent))) + : void (this.config.html + ? (this.config.sanitize && + (e = ke( + e, + this.config.allowList, + this.config.sanitizeFn + )), + (t.innerHTML = e)) + : (t.textContent = e)) + }), + (r.getTitle = function () { + var t = this._element.getAttribute('data-bs-original-title') + return ( + t || + (t = + 'function' == typeof this.config.title + ? this.config.title.call(this._element) + : this.config.title), + t + ) + }), + (r.updateAttachment = function (t) { + return 'right' === t ? 'end' : 'left' === t ? 'start' : t + }), + (r._initializeOnDelegatedTarget = function (t, e) { + var n = this.constructor.DATA_KEY + return ( + (e = e || T(t.delegateTarget, n)) || + ((e = new this.constructor( + t.delegateTarget, + this._getDelegateConfig() + )), + E(t.delegateTarget, n, e)), + e + ) + }), + (r._getOffset = function () { + var t = this, + e = this.config.offset + return 'string' == typeof e + ? e.split(',').map(function (t) { + return Number.parseInt(t, 10) + }) + : 'function' == typeof e + ? function (n) { + return e(n, t._element) + } + : e + }), + (r._getPopperConfig = function (t) { + var e = this, + i = { + placement: t, + modifiers: [ + { + name: 'flip', + options: { + altBoundary: !0, + fallbackPlacements: this.config.fallbackPlacements, + }, + }, + { name: 'offset', options: { offset: this._getOffset() } }, + { + name: 'preventOverflow', + options: { boundary: this.config.boundary }, + }, + { + name: 'arrow', + options: { element: '.' + this.constructor.NAME + '-arrow' }, + }, + { + name: 'onChange', + enabled: !0, + phase: 'afterWrite', + fn: function (t) { + return e._handlePopperPlacementChange(t) + }, + }, + ], + onFirstUpdate: function (t) { + t.options.placement !== t.placement && + e._handlePopperPlacementChange(t) + }, + } + return n( + {}, + i, + 'function' == typeof this.config.popperConfig + ? this.config.popperConfig(i) + : this.config.popperConfig + ) + }), + (r._addAttachmentClass = function (t) { + this.getTipElement().classList.add( + 'bs-tooltip-' + this.updateAttachment(t) + ) + }), + (r._getContainer = function () { + return !1 === this.config.container + ? document.body + : d(this.config.container) + ? this.config.container + : Y(this.config.container) + }), + (r._getAttachment = function (t) { + return De[t.toUpperCase()] + }), + (r._setListeners = function () { + var t = this + this.config.trigger.split(' ').forEach(function (e) { + if ('click' === e) + B.on( + t._element, + t.constructor.Event.CLICK, + t.config.selector, + function (e) { + return t.toggle(e) + } + ) + else if ('manual' !== e) { + var n = + 'hover' === e + ? t.constructor.Event.MOUSEENTER + : t.constructor.Event.FOCUSIN, + i = + 'hover' === e + ? t.constructor.Event.MOUSELEAVE + : t.constructor.Event.FOCUSOUT + B.on(t._element, n, t.config.selector, function (e) { + return t._enter(e) + }), + B.on(t._element, i, t.config.selector, function (e) { + return t._leave(e) + }) + } + }), + (this._hideModalHandler = function () { + t._element && t.hide() + }), + B.on( + this._element.closest('.modal'), + 'hide.bs.modal', + this._hideModalHandler + ), + this.config.selector + ? (this.config = n({}, this.config, { + trigger: 'manual', + selector: '', + })) + : this._fixTitle() + }), + (r._fixTitle = function () { + var t = this._element.getAttribute('title'), + e = typeof this._element.getAttribute('data-bs-original-title') + ;(t || 'string' !== e) && + (this._element.setAttribute('data-bs-original-title', t || ''), + !t || + this._element.getAttribute('aria-label') || + this._element.textContent || + this._element.setAttribute('aria-label', t), + this._element.setAttribute('title', '')) + }), + (r._enter = function (t, e) { + ;(e = this._initializeOnDelegatedTarget(t, e)), + t && + (e._activeTrigger['focusin' === t.type ? 'focus' : 'hover'] = !0), + e.getTipElement().classList.contains('show') || + 'show' === e._hoverState + ? (e._hoverState = 'show') + : (clearTimeout(e._timeout), + (e._hoverState = 'show'), + e.config.delay && e.config.delay.show + ? (e._timeout = setTimeout(function () { + 'show' === e._hoverState && e.show() + }, e.config.delay.show)) + : e.show()) + }), + (r._leave = function (t, e) { + ;(e = this._initializeOnDelegatedTarget(t, e)), + t && + (e._activeTrigger[ + 'focusout' === t.type ? 'focus' : 'hover' + ] = !1), + e._isWithActiveTrigger() || + (clearTimeout(e._timeout), + (e._hoverState = 'out'), + e.config.delay && e.config.delay.hide + ? (e._timeout = setTimeout(function () { + 'out' === e._hoverState && e.hide() + }, e.config.delay.hide)) + : e.hide()) + }), + (r._isWithActiveTrigger = function () { + for (var t in this._activeTrigger) + if (this._activeTrigger[t]) return !0 + return !1 + }), + (r._getConfig = function (t) { + var e = z.getDataAttributes(this._element) + return ( + Object.keys(e).forEach(function (t) { + Le.has(t) && delete e[t] + }), + t && + 'object' == typeof t.container && + t.container.jquery && + (t.container = t.container[0]), + 'number' == + typeof (t = n( + {}, + this.constructor.Default, + e, + 'object' == typeof t && t ? t : {} + )).delay && (t.delay = { show: t.delay, hide: t.delay }), + 'number' == typeof t.title && (t.title = t.title.toString()), + 'number' == typeof t.content && (t.content = t.content.toString()), + p('tooltip', t, this.constructor.DefaultType), + t.sanitize && + (t.template = ke(t.template, t.allowList, t.sanitizeFn)), + t + ) + }), + (r._getDelegateConfig = function () { + var t = {} + if (this.config) + for (var e in this.config) + this.constructor.Default[e] !== this.config[e] && + (t[e] = this.config[e]) + return t + }), + (r._cleanTipClass = function () { + var t = this.getTipElement(), + e = t.getAttribute('class').match(Ae) + null !== e && + e.length > 0 && + e + .map(function (t) { + return t.trim() + }) + .forEach(function (e) { + return t.classList.remove(e) + }) + }), + (r._handlePopperPlacementChange = function (t) { + var e = t.state + e && + ((this.tip = e.elements.popper), + this._cleanTipClass(), + this._addAttachmentClass(this._getAttachment(e.placement))) + }), + (o.jQueryInterface = function (t) { + return this.each(function () { + var e = T(this, 'bs.tooltip'), + n = 'object' == typeof t && t + if ( + (e || !/dispose|hide/.test(t)) && + (e || (e = new o(this, n)), 'string' == typeof t) + ) { + if (void 0 === e[t]) + throw new TypeError('No method named "' + t + '"') + e[t]() + } + }) + }), + e(o, null, [ + { + key: 'Default', + get: function () { + return xe + }, + }, + { + key: 'NAME', + get: function () { + return 'tooltip' + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.tooltip' + }, + }, + { + key: 'Event', + get: function () { + return Ce + }, + }, + { + key: 'EVENT_KEY', + get: function () { + return '.bs.tooltip' + }, + }, + { + key: 'DefaultType', + get: function () { + return Oe + }, + }, + ]), + o + ) + })(H) + y('tooltip', Se) + var je = new RegExp('(^|\\s)bs-popover\\S+', 'g'), + Ne = n({}, Se.Default, { + placement: 'right', + offset: [0, 8], + trigger: 'click', + content: '', + template: + '', + }), + Pe = n({}, Se.DefaultType, { content: '(string|element|function)' }), + Ie = { + HIDE: 'hide.bs.popover', + HIDDEN: 'hidden.bs.popover', + SHOW: 'show.bs.popover', + SHOWN: 'shown.bs.popover', + INSERTED: 'inserted.bs.popover', + CLICK: 'click.bs.popover', + FOCUSIN: 'focusin.bs.popover', + FOCUSOUT: 'focusout.bs.popover', + MOUSEENTER: 'mouseenter.bs.popover', + MOUSELEAVE: 'mouseleave.bs.popover', + }, + Me = (function (t) { + function n() { + return t.apply(this, arguments) || this + } + i(n, t) + var o = n.prototype + return ( + (o.isWithContent = function () { + return this.getTitle() || this._getContent() + }), + (o.setContent = function () { + var t = this.getTipElement() + this.setElementContent(Y('.popover-header', t), this.getTitle()) + var e = this._getContent() + 'function' == typeof e && (e = e.call(this._element)), + this.setElementContent(Y('.popover-body', t), e), + t.classList.remove('fade', 'show') + }), + (o._addAttachmentClass = function (t) { + this.getTipElement().classList.add( + 'bs-popover-' + this.updateAttachment(t) + ) + }), + (o._getContent = function () { + return ( + this._element.getAttribute('data-bs-content') || this.config.content + ) + }), + (o._cleanTipClass = function () { + var t = this.getTipElement(), + e = t.getAttribute('class').match(je) + null !== e && + e.length > 0 && + e + .map(function (t) { + return t.trim() + }) + .forEach(function (e) { + return t.classList.remove(e) + }) + }), + (n.jQueryInterface = function (t) { + return this.each(function () { + var e = T(this, 'bs.popover'), + i = 'object' == typeof t ? t : null + if ( + (e || !/dispose|hide/.test(t)) && + (e || ((e = new n(this, i)), E(this, 'bs.popover', e)), + 'string' == typeof t) + ) { + if (void 0 === e[t]) + throw new TypeError('No method named "' + t + '"') + e[t]() + } + }) + }), + e(n, null, [ + { + key: 'Default', + get: function () { + return Ne + }, + }, + { + key: 'NAME', + get: function () { + return 'popover' + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.popover' + }, + }, + { + key: 'Event', + get: function () { + return Ie + }, + }, + { + key: 'EVENT_KEY', + get: function () { + return '.bs.popover' + }, + }, + { + key: 'DefaultType', + get: function () { + return Pe + }, + }, + ]), + n + ) + })(Se) + y('popover', Me) + var Be = { offset: 10, method: 'auto', target: '' }, + He = { offset: 'number', method: 'string', target: '(string|element)' }, + Re = (function (t) { + function o(e, n) { + var i + return ( + ((i = t.call(this, e) || this)._scrollElement = + 'BODY' === e.tagName ? window : e), + (i._config = i._getConfig(n)), + (i._selector = + i._config.target + + ' .nav-link, ' + + i._config.target + + ' .list-group-item, ' + + i._config.target + + ' .dropdown-item'), + (i._offsets = []), + (i._targets = []), + (i._activeTarget = null), + (i._scrollHeight = 0), + B.on(i._scrollElement, 'scroll.bs.scrollspy', function () { + return i._process() + }), + i.refresh(), + i._process(), + i + ) + } + i(o, t) + var r = o.prototype + return ( + (r.refresh = function () { + var t = this, + e = + this._scrollElement === this._scrollElement.window + ? 'offset' + : 'position', + n = 'auto' === this._config.method ? e : this._config.method, + i = 'position' === n ? this._getScrollTop() : 0 + ;(this._offsets = []), + (this._targets = []), + (this._scrollHeight = this._getScrollHeight()), + F(this._selector) + .map(function (t) { + var e = l(t), + o = e ? Y(e) : null + if (o) { + var r = o.getBoundingClientRect() + if (r.width || r.height) return [z[n](o).top + i, e] + } + return null + }) + .filter(function (t) { + return t + }) + .sort(function (t, e) { + return t[0] - e[0] + }) + .forEach(function (e) { + t._offsets.push(e[0]), t._targets.push(e[1]) + }) + }), + (r.dispose = function () { + t.prototype.dispose.call(this), + B.off(this._scrollElement, '.bs.scrollspy'), + (this._scrollElement = null), + (this._config = null), + (this._selector = null), + (this._offsets = null), + (this._targets = null), + (this._activeTarget = null), + (this._scrollHeight = null) + }), + (r._getConfig = function (t) { + if ( + 'string' != + typeof (t = n({}, Be, 'object' == typeof t && t ? t : {})) + .target && + d(t.target) + ) { + var e = t.target.id + e || ((e = s('scrollspy')), (t.target.id = e)), (t.target = '#' + e) + } + return p('scrollspy', t, He), t + }), + (r._getScrollTop = function () { + return this._scrollElement === window + ? this._scrollElement.pageYOffset + : this._scrollElement.scrollTop + }), + (r._getScrollHeight = function () { + return ( + this._scrollElement.scrollHeight || + Math.max( + document.body.scrollHeight, + document.documentElement.scrollHeight + ) + ) + }), + (r._getOffsetHeight = function () { + return this._scrollElement === window + ? window.innerHeight + : this._scrollElement.getBoundingClientRect().height + }), + (r._process = function () { + var t = this._getScrollTop() + this._config.offset, + e = this._getScrollHeight(), + n = this._config.offset + e - this._getOffsetHeight() + if ((this._scrollHeight !== e && this.refresh(), t >= n)) { + var i = this._targets[this._targets.length - 1] + this._activeTarget !== i && this._activate(i) + } else { + if ( + this._activeTarget && + t < this._offsets[0] && + this._offsets[0] > 0 + ) + return (this._activeTarget = null), void this._clear() + for (var o = this._offsets.length; o--; ) + this._activeTarget !== this._targets[o] && + t >= this._offsets[o] && + (void 0 === this._offsets[o + 1] || t < this._offsets[o + 1]) && + this._activate(this._targets[o]) + } + }), + (r._activate = function (t) { + ;(this._activeTarget = t), this._clear() + var e = this._selector.split(',').map(function (e) { + return ( + e + '[data-bs-target="' + t + '"],' + e + '[href="' + t + '"]' + ) + }), + n = Y(e.join(',')) + n.classList.contains('dropdown-item') + ? (Y('.dropdown-toggle', n.closest('.dropdown')).classList.add( + 'active' + ), + n.classList.add('active')) + : (n.classList.add('active'), + (function (t, e) { + for ( + var n = [], i = t.parentNode; + i && i.nodeType === Node.ELEMENT_NODE && 3 !== i.nodeType; + + ) + i.matches(e) && n.push(i), (i = i.parentNode) + return n + })(n, '.nav, .list-group').forEach(function (t) { + V(t, '.nav-link, .list-group-item').forEach(function (t) { + return t.classList.add('active') + }), + V(t, '.nav-item').forEach(function (t) { + q(t, '.nav-link').forEach(function (t) { + return t.classList.add('active') + }) + }) + })), + B.trigger(this._scrollElement, 'activate.bs.scrollspy', { + relatedTarget: t, + }) + }), + (r._clear = function () { + F(this._selector) + .filter(function (t) { + return t.classList.contains('active') + }) + .forEach(function (t) { + return t.classList.remove('active') + }) + }), + (o.jQueryInterface = function (t) { + return this.each(function () { + var e = T(this, 'bs.scrollspy') + if ( + (e || (e = new o(this, 'object' == typeof t && t)), + 'string' == typeof t) + ) { + if (void 0 === e[t]) + throw new TypeError('No method named "' + t + '"') + e[t]() + } + }) + }), + e(o, null, [ + { + key: 'Default', + get: function () { + return Be + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.scrollspy' + }, + }, + ]), + o + ) + })(H) + B.on(window, 'load.bs.scrollspy.data-api', function () { + F('[data-bs-spy="scroll"]').forEach(function (t) { + return new Re(t, z.getDataAttributes(t)) + }) + }), + y('scrollspy', Re) + var We = (function (t) { + function n() { + return t.apply(this, arguments) || this + } + i(n, t) + var o = n.prototype + return ( + (o.show = function () { + var t = this + if ( + !( + (this._element.parentNode && + this._element.parentNode.nodeType === Node.ELEMENT_NODE && + this._element.classList.contains('active')) || + this._element.classList.contains('disabled') + ) + ) { + var e, + n = c(this._element), + i = this._element.closest('.nav, .list-group') + if (i) { + var o = + 'UL' === i.nodeName || 'OL' === i.nodeName + ? ':scope > li > .active' + : '.active' + e = (e = F(o, i))[e.length - 1] + } + var r = e + ? B.trigger(e, 'hide.bs.tab', { relatedTarget: this._element }) + : null + if ( + !( + B.trigger(this._element, 'show.bs.tab', { relatedTarget: e }) + .defaultPrevented || + (null !== r && r.defaultPrevented) + ) + ) { + this._activate(this._element, i) + var s = function () { + B.trigger(e, 'hidden.bs.tab', { relatedTarget: t._element }), + B.trigger(t._element, 'shown.bs.tab', { relatedTarget: e }) + } + n ? this._activate(n, n.parentNode, s) : s() + } + } + }), + (o._activate = function (t, e, n) { + var i = this, + o = (!e || ('UL' !== e.nodeName && 'OL' !== e.nodeName) + ? q(e, '.active') + : F(':scope > li > .active', e))[0], + r = n && o && o.classList.contains('fade'), + s = function () { + return i._transitionComplete(t, o, n) + } + if (o && r) { + var a = u(o) + o.classList.remove('show'), B.one(o, 'transitionend', s), h(o, a) + } else s() + }), + (o._transitionComplete = function (t, e, n) { + if (e) { + e.classList.remove('active') + var i = Y(':scope > .dropdown-menu .active', e.parentNode) + i && i.classList.remove('active'), + 'tab' === e.getAttribute('role') && + e.setAttribute('aria-selected', !1) + } + t.classList.add('active'), + 'tab' === t.getAttribute('role') && + t.setAttribute('aria-selected', !0), + v(t), + t.classList.contains('fade') && t.classList.add('show'), + t.parentNode && + t.parentNode.classList.contains('dropdown-menu') && + (t.closest('.dropdown') && + F('.dropdown-toggle').forEach(function (t) { + return t.classList.add('active') + }), + t.setAttribute('aria-expanded', !0)), + n && n() + }), + (n.jQueryInterface = function (t) { + return this.each(function () { + var e = T(this, 'bs.tab') || new n(this) + if ('string' == typeof t) { + if (void 0 === e[t]) + throw new TypeError('No method named "' + t + '"') + e[t]() + } + }) + }), + e(n, null, [ + { + key: 'DATA_KEY', + get: function () { + return 'bs.tab' + }, + }, + ]), + n + ) + })(H) + B.on( + document, + 'click.bs.tab.data-api', + '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', + function (t) { + t.preventDefault(), (T(this, 'bs.tab') || new We(this)).show() + } + ), + y('tab', We) + var Ke = { animation: 'boolean', autohide: 'boolean', delay: 'number' }, + Ue = { animation: !0, autohide: !0, delay: 5e3 }, + ze = (function (t) { + function o(e, n) { + var i + return ( + ((i = t.call(this, e) || this)._config = i._getConfig(n)), + (i._timeout = null), + i._setListeners(), + i + ) + } + i(o, t) + var r = o.prototype + return ( + (r.show = function () { + var t = this + if (!B.trigger(this._element, 'show.bs.toast').defaultPrevented) { + this._clearTimeout(), + this._config.animation && this._element.classList.add('fade') + var e = function () { + t._element.classList.remove('showing'), + t._element.classList.add('show'), + B.trigger(t._element, 'shown.bs.toast'), + t._config.autohide && + (t._timeout = setTimeout(function () { + t.hide() + }, t._config.delay)) + } + if ( + (this._element.classList.remove('hide'), + v(this._element), + this._element.classList.add('showing'), + this._config.animation) + ) { + var n = u(this._element) + B.one(this._element, 'transitionend', e), h(this._element, n) + } else e() + } + }), + (r.hide = function () { + var t = this + if ( + this._element.classList.contains('show') && + !B.trigger(this._element, 'hide.bs.toast').defaultPrevented + ) { + var e = function () { + t._element.classList.add('hide'), + B.trigger(t._element, 'hidden.bs.toast') + } + if ( + (this._element.classList.remove('show'), this._config.animation) + ) { + var n = u(this._element) + B.one(this._element, 'transitionend', e), h(this._element, n) + } else e() + } + }), + (r.dispose = function () { + this._clearTimeout(), + this._element.classList.contains('show') && + this._element.classList.remove('show'), + B.off(this._element, 'click.dismiss.bs.toast'), + t.prototype.dispose.call(this), + (this._config = null) + }), + (r._getConfig = function (t) { + return ( + (t = n( + {}, + Ue, + z.getDataAttributes(this._element), + 'object' == typeof t && t ? t : {} + )), + p('toast', t, this.constructor.DefaultType), + t + ) + }), + (r._setListeners = function () { + var t = this + B.on( + this._element, + 'click.dismiss.bs.toast', + '[data-bs-dismiss="toast"]', + function () { + return t.hide() + } + ) + }), + (r._clearTimeout = function () { + clearTimeout(this._timeout), (this._timeout = null) + }), + (o.jQueryInterface = function (t) { + return this.each(function () { + var e = T(this, 'bs.toast') + if ( + (e || (e = new o(this, 'object' == typeof t && t)), + 'string' == typeof t) + ) { + if (void 0 === e[t]) + throw new TypeError('No method named "' + t + '"') + e[t](this) + } + }) + }), + e(o, null, [ + { + key: 'DefaultType', + get: function () { + return Ke + }, + }, + { + key: 'Default', + get: function () { + return Ue + }, + }, + { + key: 'DATA_KEY', + get: function () { + return 'bs.toast' + }, + }, + ]), + o + ) + })(H) + return ( + y('toast', ze), + { + Alert: R, + Button: W, + Carousel: $, + Collapse: J, + Dropdown: ve, + Modal: ye, + Popover: Me, + ScrollSpy: Re, + Tab: We, + Toast: ze, + Tooltip: Se, + } + ) +}) +//# sourceMappingURL=bootstrap.bundle.min.js.map diff --git a/sphinx_pythia_theme/static/bootstrap/js/bootstrap.bundle.min.js.map b/sphinx_pythia_theme/static/bootstrap/js/bootstrap.bundle.min.js.map new file mode 100644 index 00000000..bc7d4ccb --- /dev/null +++ b/sphinx_pythia_theme/static/bootstrap/js/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/data.js","../../js/src/dom/event-handler.js","../../js/src/base-component.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/modal.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["storeData","id","getUID","prefix","Math","floor","random","document","getElementById","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","querySelector","getElementFromSelector","getTransitionDurationFromElement","_window$getComputedSt","window","getComputedStyle","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","nodeType","emulateTransitionEnd","duration","called","emulatedDuration","addEventListener","listener","removeEventListener","setTimeout","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","style","parentNode","elementStyle","parentNodeStyle","display","visibility","noop","reflow","offsetHeight","getjQuery","jQuery","body","hasAttribute","isRTL","documentElement","dir","defineJQueryPlugin","name","plugin","callback","$","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","mapData","set","key","data","bsKey","get","keyProperties","delete","Data","instance","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","handler","delegationSelector","uidEventList","i","len","length","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","replace","custom","has","addHandler","oneOff","_normalizeParams","handlers","previousFn","domElements","querySelectorAll","target","this","delegateTarget","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","_normalizeParams2","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","jQueryEvent","isNative","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","defineProperty","preventDefault","BaseComponent","_element","constructor","DATA_KEY","dispose","getInstance","Alert","close","rootElement","_getRootElement","customEvent","_triggerCloseEvent","_removeElement","closest","_this","classList","remove","contains","_destroyElement","removeChild","each","handleDismiss","alertInstance","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","scrollTop","left","scrollLeft","position","offsetTop","offsetLeft","SelectorEngine","_ref","concat","Element","prototype","_ref2","children","child","matches","previous","previousElementSibling","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","Carousel","_BaseComponent","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","index","_this2","activeIndex","_getItemIndex","direction","_extends","_handleSwipe","absDeltax","abs","_this3","_keydown","_addTouchEventListeners","_this4","start","pointerType","touches","clientX","end","clearTimeout","itemImg","e","add","move","tagName","indexOf","_getItemByDirection","activeElement","isNextDirection","isPrevDirection","lastItemIndex","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","from","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","_this5","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","carouselInterface","action","ride","dataApiClickHandler","slideIndex","carousels","parent","Collapse","_isTransitioning","_triggerArray","SELECTOR_DATA_TOGGLE","toggleList","elem","filterElement","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","container","tempActiveData","find","elemActive","collapseInterface","dimension","_getDimension","setTransitioning","scrollSize","triggerArrayLength","isTransitioning","jquery","selected","triggerArray","isOpen","triggerData","bottom","right","basePlacements","variationPlacements","reduce","acc","placement","placements","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","applyStyles$1","enabled","phase","state","elements","styles","assign","effect","initialStyles","popper","options","strategy","margin","arrow","reference","hasOwnProperty","attribute","requires","getBasePlacement","getLayoutRect","x","y","width","offsetWidth","height","rootNode","getRootNode","ShadowRoot","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","html","getOffsetParent","currentNode","css","transform","perspective","willChange","getContainingBlock","getMainAxisFromPlacement","within","min","max","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","padding","arrowRect","minProp","maxProp","endDiff","rects","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","axisProp","centerOffset","_options$element","_options$padding","requiresIfExists","unsetSides","mapToStyles","_Object$assign2","popperRect","offsets","gpuAcceleration","adaptive","_ref3","roundOffsets","dpr","devicePixelRatio","round","roundOffsetsByDPR","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","win","_Object$assign","commonStyles","computeStyles$1","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","data-popper-placement","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","pageXOffset","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","listScrollParents","list","getScrollParent","isBody","visualViewport","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","userAgent","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","getVariation","computeOffsets","variation","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","altContext","referenceElement","clippingClientRect","mainClippingParents","clippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","Map","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","data-popper-reference-hidden","data-popper-escaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_preventedOffset","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","DEFAULT_OPTIONS","modifiers","areValidElements","_len","arguments","Array","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","cleanupModifierEffects","merged","map","visited","result","modifier","dep","depModifier","order","orderModifiers","current","existing","m","_ref3$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","undefined","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","REGEXP_KEYDOWN","ARROW_UP_KEY","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","popperConfig","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","disabled","isActive","clearMenus","getParentFromElement","Popper","_getPopperConfig","isDisplayStatic","focus","stopPropagation","nextElementSibling","_getPlacement","parentDropdown","isEnd","getPropertyValue","_getOffset","popperData","defaultBsPopperConfig","dropdownInterface","toggles","context","clickEvent","dropdownMenu","dataApiKeydownHandler","items","click","backdrop","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","showEvent","_checkScrollbar","_setScrollbar","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","transition","_hideModal","htmlElement","handleUpdate","modalBody","Node","ELEMENT_NODE","appendChild","_enforceFocus","transitionComplete","_this6","_triggerBackdropTransition","_this7","_this8","_resetAdjustments","_resetScrollbar","_removeBackdrop","_this9","animate","createElement","className","currentTarget","backdropTransitionDuration","callbackRemove","_this10","isModalOverflowing","modalTransitionDuration","paddingLeft","paddingRight","innerWidth","_getScrollbarWidth","_this11","_setElementAttributes","calculatedValue","styleProp","actualValue","_resetElementAttributes","scrollDiv","scrollbarWidth","_this12","uriAttrs","SAFE_URL_PATTERN","DATA_URL_PATTERN","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","allowlistKeys","el","elName","attributeList","allowedAttributes","attr","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","allowedAttribute","innerHTML","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","*","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","_isWithActiveTrigger","_enter","_leave","getTipElement","EVENT_KEY","_hideModalHandler","Error","isWithContent","shadowRoot","findShadowRoot","attachShadow","root","isInTheDom","tipId","NAME","setContent","attachment","_getAttachment","_addAttachmentClass","_getContainer","_tip$classList","complete","prevHoverState","_cleanTipClass","getTitle","setElementContent","content","textContent","updateAttachment","dataKey","_getDelegateConfig","_handlePopperPlacementChange","CLASS_PREFIX","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","tabClass","token","tClass","Popover","_getContent","method","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","join","parents","ancestor","listGroup","SELECTOR_NAV_LINKS","navItem","spy","Tab","listElement","itemSelector","hideEvent","active","_transitionComplete","dropdownChild","dropdown","autohide","Toast","_clearTimeout"],"mappings":";;;;;6zBAOA,ICOQA,EACFC,EDWAC,EAAS,SAAAC,GACb,GACEA,GAAUC,KAAKC,MArBH,IAqBSD,KAAKE,gBACnBC,SAASC,eAAeL,IAEjC,OAAOA,GAGHM,EAAc,SAAAC,GAClB,IAAIC,EAAWD,EAAQE,aAAa,kBAEpC,IAAKD,GAAyB,MAAbA,EAAkB,CACjC,IAAIE,EAAWH,EAAQE,aAAa,QAMpC,IAAKC,IAAcA,EAASC,SAAS,OAASD,EAASE,WAAW,KAChE,OAAO,KAILF,EAASC,SAAS,OAASD,EAASE,WAAW,OACjDF,EAAW,IAAMA,EAASG,MAAM,KAAK,IAGvCL,EAAWE,GAAyB,MAAbA,EAAmBA,EAASI,OAAS,KAG9D,OAAON,GAGHO,EAAyB,SAAAR,GAC7B,IAAMC,EAAWF,EAAYC,GAE7B,OAAIC,GACKJ,SAASY,cAAcR,GAAYA,EAGrC,MAGHS,EAAyB,SAAAV,GAC7B,IAAMC,EAAWF,EAAYC,GAE7B,OAAOC,EAAWJ,SAASY,cAAcR,GAAY,MAGjDU,EAAmC,SAAAX,GACvC,IAAKA,EACH,OAAO,EAFyC,IAAAY,EAMJC,OAAOC,iBAAiBd,GAAhEe,EAN4CH,EAM5CG,mBAAoBC,EANwBJ,EAMxBI,gBAEpBC,EAA0BC,OAAOC,WAAWJ,GAC5CK,EAAuBF,OAAOC,WAAWH,GAG/C,OAAKC,GAA4BG,GAKjCL,EAAqBA,EAAmBT,MAAM,KAAK,GACnDU,EAAkBA,EAAgBV,MAAM,KAAK,GArFf,KAuFtBY,OAAOC,WAAWJ,GAAsBG,OAAOC,WAAWH,KAPzD,GAULK,EAAuB,SAAArB,GAC3BA,EAAQsB,cAAc,IAAIC,MA1FL,mBA6FjBC,EAAY,SAAAC,GAAG,OAAKA,EAAI,IAAMA,GAAKC,UAEnCC,EAAuB,SAAC3B,EAAS4B,GACrC,IAAIC,GAAS,EAEPC,EAAmBF,EADD,EAQxB5B,EAAQ+B,iBAzGa,iBAoGrB,SAASC,IACPH,GAAS,EACT7B,EAAQiC,oBAtGW,gBAsGyBD,MAI9CE,YAAW,WACJL,GACHR,EAAqBrB,KAEtB8B,IAGCK,EAAkB,SAACC,EAAeC,EAAQC,GAC9CC,OAAOC,KAAKF,GAAaG,SAAQ,SAAAC,GAC/B,IAhHWjB,EAgHLkB,EAAgBL,EAAYI,GAC5BE,EAAQP,EAAOK,GACfG,EAAYD,GAASpB,EAAUoB,GAAS,UAjH5CnB,OADSA,EAkHsDmB,GAhHjE,GAAUnB,EAGL,GAAGqB,SAASC,KAAKtB,GAAKuB,MAAM,eAAe,GAAGC,cA+GnD,IAAK,IAAIC,OAAOP,GAAeQ,KAAKN,GAClC,MAAM,IAAIO,UACLhB,EAAciB,cAAdjB,aACQM,EADX,oBACuCG,EADpCT,wBAEmBO,EAFtB,UAQFW,EAAY,SAAAtD,GAChB,IAAKA,EACH,OAAO,EAGT,GAAIA,EAAQuD,OAASvD,EAAQwD,YAAcxD,EAAQwD,WAAWD,MAAO,CACnE,IAAME,EAAe3C,iBAAiBd,GAChC0D,EAAkB5C,iBAAiBd,EAAQwD,YAEjD,MAAgC,SAAzBC,EAAaE,SACU,SAA5BD,EAAgBC,SACY,WAA5BF,EAAaG,WAGjB,OAAO,GA0BHC,EAAO,WAAA,OAAM,cAEbC,EAAS,SAAA9D,GAAO,OAAIA,EAAQ+D,cAE5BC,EAAY,WAAM,IACdC,EAAWpD,OAAXoD,OAER,OAAIA,IAAWpE,SAASqE,KAAKC,aAAa,qBACjCF,EAGF,MAWHG,EAAyC,QAAjCvE,SAASwE,gBAAgBC,IAEjCC,EAAqB,SAACC,EAAMC,GAVP,IAAAC,EAAAA,EAWN,WACjB,IAAMC,EAAIX,IAEV,GAAIW,EAAG,CACL,IAAMC,EAAqBD,EAAEE,GAAGL,GAChCG,EAAEE,GAAGL,GAAQC,EAAOK,gBACpBH,EAAEE,GAAGL,GAAMO,YAAcN,EACzBE,EAAEE,GAAGL,GAAMQ,WAAa,WAEtB,OADAL,EAAEE,GAAGL,GAAQI,EACNH,EAAOK,mBAnBQ,YAAxBjF,SAASoF,WACXpF,SAASkC,iBAAiB,mBAAoB2C,GAE9CA,KCvLEQ,GACE5F,EAAY,GACdC,EAAK,EACF,CACL4F,IADK,SACDnF,EAASoF,EAAKC,QACa,IAAlBrF,EAAQsF,QACjBtF,EAAQsF,MAAQ,CACdF,IAAAA,EACA7F,GAAAA,GAEFA,KAGFD,EAAUU,EAAQsF,MAAM/F,IAAM8F,GAEhCE,IAZK,SAYDvF,EAASoF,GACX,IAAKpF,QAAoC,IAAlBA,EAAQsF,MAC7B,OAAO,KAGT,IAAME,EAAgBxF,EAAQsF,MAC9B,OAAIE,EAAcJ,MAAQA,EACjB9F,EAAUkG,EAAcjG,IAG1B,MAETkG,OAxBK,SAwBEzF,EAASoF,GACd,QAA6B,IAAlBpF,EAAQsF,MAAnB,CAIA,IAAME,EAAgBxF,EAAQsF,MAC1BE,EAAcJ,MAAQA,WACjB9F,EAAUkG,EAAcjG,WACxBS,EAAQsF,WAMjBI,EAAO,SACHC,EAAUP,EAAKC,GACrBH,EAAQC,IAAIQ,EAAUP,EAAKC,IAFzBK,EAAO,SAIHC,EAAUP,GAChB,OAAOF,EAAQK,IAAII,EAAUP,IC5C3BQ,EAAiB,qBACjBC,EAAiB,OACjBC,EAAgB,SAChBC,EAAgB,GAClBC,EAAW,EACTC,EAAe,CACnBC,WAAY,YACZC,WAAY,YAERC,EAAe,IAAIC,IAAI,CAC3B,QACA,WACA,UACA,YACA,cACA,aACA,iBACA,YACA,WACA,YACA,cACA,YACA,UACA,WACA,QACA,oBACA,aACA,YACA,WACA,cACA,cACA,cACA,YACA,eACA,gBACA,eACA,gBACA,aACA,QACA,OACA,SACA,QACA,SACA,SACA,UACA,WACA,OACA,SACA,eACA,SACA,OACA,mBACA,mBACA,QACA,QACA,WASF,SAASC,EAAYtG,EAASuG,GAC5B,OAAQA,GAAUA,EAAP,KAAeP,KAAiBhG,EAAQgG,UAAYA,IAGjE,SAASQ,EAASxG,GAChB,IAAMuG,EAAMD,EAAYtG,GAKxB,OAHAA,EAAQgG,SAAWO,EACnBR,EAAcQ,GAAOR,EAAcQ,IAAQ,GAEpCR,EAAcQ,GAuCvB,SAASE,EAAYC,EAAQC,EAASC,QAA2B,IAA3BA,IAAAA,EAAqB,MAGzD,IAFA,IAAMC,EAAetE,OAAOC,KAAKkE,GAExBI,EAAI,EAAGC,EAAMF,EAAaG,OAAQF,EAAIC,EAAKD,IAAK,CACvD,IAAMG,EAAQP,EAAOG,EAAaC,IAElC,GAAIG,EAAMC,kBAAoBP,GAAWM,EAAML,qBAAuBA,EACpE,OAAOK,EAIX,OAAO,KAGT,SAASE,EAAgBC,EAAmBT,EAASU,GACnD,IAAMC,EAAgC,iBAAZX,EACpBO,EAAkBI,EAAaD,EAAeV,EAGhDY,EAAYH,EAAkBI,QAAQ3B,EAAgB,IACpD4B,EAASxB,EAAasB,GAY5B,OAVIE,IACFF,EAAYE,GAGGrB,EAAasB,IAAIH,KAGhCA,EAAYH,GAGP,CAACE,EAAYJ,EAAiBK,GAGvC,SAASI,EAAW3H,EAASoH,EAAmBT,EAASU,EAAcO,GACrE,GAAiC,iBAAtBR,GAAmCpH,EAA9C,CAIK2G,IACHA,EAAUU,EACVA,EAAe,MAP4D,IAAAQ,EAU5BV,EAAgBC,EAAmBT,EAASU,GAAtFC,EAVsEO,EAAA,GAU1DX,EAV0DW,EAAA,GAUzCN,EAVyCM,EAAA,GAWvEnB,EAASF,EAASxG,GAClB8H,EAAWpB,EAAOa,KAAeb,EAAOa,GAAa,IACrDQ,EAAatB,EAAYqB,EAAUZ,EAAiBI,EAAaX,EAAU,MAEjF,GAAIoB,EACFA,EAAWH,OAASG,EAAWH,QAAUA,MAD3C,CAMA,IAAMrB,EAAMD,EAAYY,EAAiBE,EAAkBI,QAAQ5B,EAAgB,KAC7Ef,EAAKyC,EAjFb,SAAoCtH,EAASC,EAAU4E,GACrD,OAAO,SAAS8B,EAAQM,GAGtB,IAFA,IAAMe,EAAchI,EAAQiI,iBAAiBhI,GAElCiI,EAAWjB,EAAXiB,OAAkBA,GAAUA,IAAWC,KAAMD,EAASA,EAAO1E,WACtE,IAAK,IAAIsD,EAAIkB,EAAYhB,OAAQF,KAC/B,GAAIkB,EAAYlB,KAAOoB,EAQrB,OAPAjB,EAAMmB,eAAiBF,EAEnBvB,EAAQiB,QAEVS,EAAaC,IAAItI,EAASiH,EAAMsB,KAAM1D,GAGjCA,EAAG2D,MAAMN,EAAQ,CAACjB,IAM/B,OAAO,MA8DPwB,CAA2BzI,EAAS2G,EAASU,GA9FjD,SAA0BrH,EAAS6E,GACjC,OAAO,SAAS8B,EAAQM,GAOtB,OANAA,EAAMmB,eAAiBpI,EAEnB2G,EAAQiB,QACVS,EAAaC,IAAItI,EAASiH,EAAMsB,KAAM1D,GAGjCA,EAAG2D,MAAMxI,EAAS,CAACiH,KAuF1ByB,CAAiB1I,EAAS2G,GAE5B9B,EAAG+B,mBAAqBU,EAAaX,EAAU,KAC/C9B,EAAGqC,gBAAkBA,EACrBrC,EAAG+C,OAASA,EACZ/C,EAAGmB,SAAWO,EACduB,EAASvB,GAAO1B,EAEhB7E,EAAQ+B,iBAAiBwF,EAAW1C,EAAIyC,KAG1C,SAASqB,EAAc3I,EAAS0G,EAAQa,EAAWZ,EAASC,GAC1D,IAAM/B,EAAK4B,EAAYC,EAAOa,GAAYZ,EAASC,GAE9C/B,IAIL7E,EAAQiC,oBAAoBsF,EAAW1C,EAAI+D,QAAQhC,WAC5CF,EAAOa,GAAW1C,EAAGmB,WAe9B,IAAMqC,EAAe,CACnBQ,GADmB,SAChB7I,EAASiH,EAAON,EAASU,GAC1BM,EAAW3H,EAASiH,EAAON,EAASU,GAAc,IAGpDyB,IALmB,SAKf9I,EAASiH,EAAON,EAASU,GAC3BM,EAAW3H,EAASiH,EAAON,EAASU,GAAc,IAGpDiB,IATmB,SASftI,EAASoH,EAAmBT,EAASU,GACvC,GAAiC,iBAAtBD,GAAmCpH,EAA9C,CADqD,IAAA+I,EAKJ5B,EAAgBC,EAAmBT,EAASU,GAAtFC,EAL8CyB,EAAA,GAKlC7B,EALkC6B,EAAA,GAKjBxB,EALiBwB,EAAA,GAM/CC,EAAczB,IAAcH,EAC5BV,EAASF,EAASxG,GAClBiJ,EAAc7B,EAAkB/G,WAAW,KAEjD,QAA+B,IAApB6G,EAAX,CAUI+B,GACF1G,OAAOC,KAAKkE,GAAQjE,SAAQ,SAAAyG,IA1ClC,SAAkClJ,EAAS0G,EAAQa,EAAW4B,GAC5D,IAAMC,EAAoB1C,EAAOa,IAAc,GAE/ChF,OAAOC,KAAK4G,GAAmB3G,SAAQ,SAAA4G,GACrC,GAAIA,EAAWjJ,SAAS+I,GAAY,CAClC,IAAMlC,EAAQmC,EAAkBC,GAEhCV,EAAc3I,EAAS0G,EAAQa,EAAWN,EAAMC,gBAAiBD,EAAML,wBAoCrE0C,CAAyBtJ,EAAS0G,EAAQwC,EAAc9B,EAAkBmC,MAAM,OAIpF,IAAMH,EAAoB1C,EAAOa,IAAc,GAC/ChF,OAAOC,KAAK4G,GAAmB3G,SAAQ,SAAA+G,GACrC,IAAMH,EAAaG,EAAYhC,QAAQ1B,EAAe,IAEtD,IAAKkD,GAAe5B,EAAkBhH,SAASiJ,GAAa,CAC1D,IAAMpC,EAAQmC,EAAkBI,GAEhCb,EAAc3I,EAAS0G,EAAQa,EAAWN,EAAMC,gBAAiBD,EAAML,4BAvB3E,CAEE,IAAKF,IAAWA,EAAOa,GACrB,OAGFoB,EAAc3I,EAAS0G,EAAQa,EAAWL,EAAiBI,EAAaX,EAAU,SAsBtF8C,QA/CmB,SA+CXzJ,EAASiH,EAAOyC,GACtB,GAAqB,iBAAVzC,IAAuBjH,EAChC,OAAO,KAGT,IAKI2J,EALEhF,EAAIX,IACJuD,EAAYN,EAAMO,QAAQ3B,EAAgB,IAC1CmD,EAAc/B,IAAUM,EACxBqC,EAAWxD,EAAasB,IAAIH,GAG9BsC,GAAU,EACVC,GAAiB,EACjBC,GAAmB,EACnBC,EAAM,KA4CV,OA1CIhB,GAAerE,IACjBgF,EAAchF,EAAEpD,MAAM0F,EAAOyC,GAE7B/E,EAAE3E,GAASyJ,QAAQE,GACnBE,GAAWF,EAAYM,uBACvBH,GAAkBH,EAAYO,gCAC9BH,EAAmBJ,EAAYQ,sBAG7BP,GACFI,EAAMnK,SAASuK,YAAY,eACvBC,UAAU9C,EAAWsC,GAAS,GAElCG,EAAM,IAAIM,YAAYrD,EAAO,CAC3B4C,QAAAA,EACAU,YAAY,SAKI,IAATb,GACTnH,OAAOC,KAAKkH,GAAMjH,SAAQ,SAAA2C,GACxB7C,OAAOiI,eAAeR,EAAK5E,EAAK,CAC9BG,IAD8B,WAE5B,OAAOmE,EAAKtE,SAMhB2E,GACFC,EAAIS,iBAGFX,GACF9J,EAAQsB,cAAc0I,GAGpBA,EAAID,uBAA2C,IAAhBJ,GACjCA,EAAYc,iBAGPT,ICrTLU,EAAAA,WACJ,SAAAA,EAAY1K,GACLA,IAILmI,KAAKwC,SAAW3K,EAChB0F,EAAa1F,EAASmI,KAAKyC,YAAYC,SAAU1C,0BAGnD2C,QAAA,WF2BW,IAOAnF,EAAUP,EAAVO,EEjCOwC,KAAKwC,SFiCFvF,EEjCY+C,KAAKyC,YAAYC,SFkChD3F,EAAQO,OAAOE,EAAUP,GEjCzB+C,KAAKwC,SAAW,QAKXI,YAAP,SAAmB/K,GACjB,OAAO0F,EAAa1F,EAASmI,KAAK0C,wCAGpC,WACE,MAxBY,oBAEVH,GC2BAM,EAAAA,SAAAA,uFASJC,MAAA,SAAMjL,GACJ,IAAMkL,EAAclL,EAAUmI,KAAKgD,gBAAgBnL,GAAWmI,KAAKwC,SAC7DS,EAAcjD,KAAKkD,mBAAmBH,GAExB,OAAhBE,GAAwBA,EAAYrB,kBAIxC5B,KAAKmD,eAAeJ,MAKtBC,gBAAA,SAAgBnL,GACd,OAAOU,EAAuBV,IAAYA,EAAQuL,QAAR,aAG5CF,mBAAA,SAAmBrL,GACjB,OAAOqI,EAAaoB,QAAQzJ,EAzCf,qBA4CfsL,eAAA,SAAetL,GAAS,IAAAwL,EAAArD,KAGtB,GAFAnI,EAAQyL,UAAUC,OAvCE,QAyCf1L,EAAQyL,UAAUE,SA1CH,QA0CpB,CAKA,IAAM5K,EAAqBJ,EAAiCX,GAE5DqI,EAAaS,IAAI9I,EAAS,iBAAiB,WAAA,OAAMwL,EAAKI,gBAAgB5L,MACtE2B,EAAqB3B,EAASe,QAP5BoH,KAAKyD,gBAAgB5L,MAUzB4L,gBAAA,SAAgB5L,GACVA,EAAQwD,YACVxD,EAAQwD,WAAWqI,YAAY7L,GAGjCqI,EAAaoB,QAAQzJ,EA9DP,sBAmET8E,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf,IAAIzG,EAAOK,EAAayC,KA5Eb,YA8EN9C,IACHA,EAAO,IAAI2F,EAAM7C,OAGJ,UAAX9F,GACFgD,EAAKhD,GAAQ8F,YAKZ4D,cAAP,SAAqBC,GACnB,OAAO,SAAU/E,GACXA,GACFA,EAAMwD,iBAGRuB,EAAcf,MAAM9C,sCAvExB,WACE,MAxBa,iBAoBX6C,CAAcN,GAoFpBrC,EAAaQ,GAAGhJ,SAhGU,0BAJD,4BAoGyCmL,EAAMe,cAAc,IAAIf,IAS1FzG,EAlHa,QAkHYyG,GCvHzB,IAiBMiB,EAAAA,SAAAA,+EASJC,OAAA,WAEE/D,KAAKwC,SAASwB,aAAa,eAAgBhE,KAAKwC,SAASc,UAAUS,OAvB7C,cA4BjBpH,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf,IAAIzG,EAAOK,EAAayC,KAlCb,aAoCN9C,IACHA,EAAO,IAAI4G,EAAO9D,OAGL,WAAX9F,GACFgD,EAAKhD,uCAtBX,WACE,MApBa,kBAgBX4J,CAAevB,GC5BrB,SAAS0B,EAAcC,GACrB,MAAY,SAARA,GAIQ,UAARA,IAIAA,IAAQnL,OAAOmL,GAAKvJ,WACf5B,OAAOmL,GAGJ,KAARA,GAAsB,SAARA,EACT,KAGFA,GAGT,SAASC,EAAiBlH,GACxB,OAAOA,EAAIoC,QAAQ,UAAU,SAAA+E,GAAG,MAAA,IAAQA,EAAItJ,iBD4C9CoF,EAAaQ,GAAGhJ,SA7CU,2BAFG,6BA+CyC,SAAAoH,GACpEA,EAAMwD,iBAEN,IAAM+B,EAASvF,EAAMiB,OAAOqD,QAlDD,6BAoDvBlG,EAAOK,EAAa8G,EA1DT,aA2DVnH,IACHA,EAAO,IAAI4G,EAAOO,IAGpBnH,EAAK6G,YAUP3H,EA1Ea,SA0EY0H,GC7DzB,IAAMQ,EAAc,CAClBC,iBADkB,SACD1M,EAASoF,EAAKxC,GAC7B5C,EAAQmM,aAAR,WAAgCG,EAAiBlH,GAAQxC,IAG3D+J,oBALkB,SAKE3M,EAASoF,GAC3BpF,EAAQ4M,gBAAR,WAAmCN,EAAiBlH,KAGtDyH,kBATkB,SASA7M,GAChB,IAAKA,EACH,MAAO,GAGT,IAAM8M,EAAa,GAUnB,OARAvK,OAAOC,KAAKxC,EAAQ+M,SACjBC,QAAO,SAAA5H,GAAG,OAAIA,EAAI/E,WAAW,SAC7BoC,SAAQ,SAAA2C,GACP,IAAI6H,EAAU7H,EAAIoC,QAAQ,MAAO,IACjCyF,EAAUA,EAAQC,OAAO,GAAGjK,cAAgBgK,EAAQ1D,MAAM,EAAG0D,EAAQjG,QACrE8F,EAAWG,GAAWb,EAAcpM,EAAQ+M,QAAQ3H,OAGjD0H,GAGTK,iBA3BkB,SA2BDnN,EAASoF,GACxB,OAAOgH,EAAcpM,EAAQE,aAAR,WAAgCoM,EAAiBlH,MAGxEgI,OA/BkB,SA+BXpN,GACL,IAAMqN,EAAOrN,EAAQsN,wBAErB,MAAO,CACLC,IAAKF,EAAKE,IAAM1N,SAASqE,KAAKsJ,UAC9BC,KAAMJ,EAAKI,KAAO5N,SAASqE,KAAKwJ,aAIpCC,SAxCkB,SAwCT3N,GACP,MAAO,CACLuN,IAAKvN,EAAQ4N,UACbH,KAAMzN,EAAQ6N,cC3DdC,EAAiB,SAChB7N,EAAUD,GAAoC,IAAA+N,EACjD,YADiD,IAApC/N,IAAAA,EAAUH,SAASwE,kBACzB0J,EAAA,IAAGC,OAAHxF,MAAAuF,EAAaE,QAAQC,UAAUjG,iBAAiBlF,KAAK/C,EAASC,KAFnE6N,EAAiB,SAKb7N,EAAUD,GAChB,YADoD,IAApCA,IAAAA,EAAUH,SAASwE,iBAC5B4J,QAAQC,UAAUzN,cAAcsC,KAAK/C,EAASC,IANnD6N,EAAiB,SASZ9N,EAASC,GAAU,IAAAkO,EAC1B,OAAOA,EAAA,IAAGH,OAAHxF,MAAA2F,EAAanO,EAAQoO,UACzBpB,QAAO,SAAAqB,GAAK,OAAIA,EAAMC,QAAQrO,OAX/B6N,EAAiB,SA8BhB9N,EAASC,GAGZ,IAFA,IAAIsO,EAAWvO,EAAQwO,uBAEhBD,GAAU,CACf,GAAIA,EAASD,QAAQrO,GACnB,MAAO,CAACsO,GAGVA,EAAWA,EAASC,uBAGtB,MAAO,IChBLC,EAAU,CACdC,SAAU,IACVC,UAAU,EACVC,OAAO,EACPC,MAAO,QACPC,MAAM,EACNC,OAAO,GAGHC,EAAc,CAClBN,SAAU,mBACVC,SAAU,UACVC,MAAO,mBACPC,MAAO,mBACPC,KAAM,UACNC,MAAO,WAiDHE,EAAAA,SAAAA,GACJ,SAAAA,EAAYjP,EAASqC,GAAQ,IAAAmJ,EAAA,OAC3BA,EAAA0D,EAAAnM,KAAAoF,KAAMnI,IAANmI,MAEKgH,OAAS,KACd3D,EAAK4D,UAAY,KACjB5D,EAAK6D,eAAiB,KACtB7D,EAAK8D,WAAY,EACjB9D,EAAK+D,YAAa,EAClB/D,EAAKgE,aAAe,KACpBhE,EAAKiE,YAAc,EACnBjE,EAAKkE,YAAc,EAEnBlE,EAAKmE,QAAUnE,EAAKoE,WAAWvN,GAC/BmJ,EAAKqE,mBAAqB/B,EA3BF,uBA2B8CtC,EAAKb,UAC3Ea,EAAKsE,gBAAkB,iBAAkBjQ,SAASwE,iBAAmB0L,UAAUC,eAAiB,EAChGxE,EAAKyE,cAAgBrH,QAAQ/H,OAAOqP,cAEpC1E,EAAK2E,qBAjBsB3E,oCAgC7B4E,KAAA,WACOjI,KAAKoH,YACRpH,KAAKkI,OAjFY,WAqFrBC,gBAAA,YAGOzQ,SAAS0Q,QAAUjN,EAAU6E,KAAKwC,WACrCxC,KAAKiI,UAITI,KAAA,WACOrI,KAAKoH,YACRpH,KAAKkI,OA9FY,WAkGrBxB,MAAA,SAAM5H,GACCA,IACHkB,KAAKmH,WAAY,GAGfxB,EAxEmB,2CAwEwB3F,KAAKwC,YAClDtJ,EAAqB8G,KAAKwC,UAC1BxC,KAAKsI,OAAM,IAGbC,cAAcvI,KAAKiH,WACnBjH,KAAKiH,UAAY,QAGnBqB,MAAA,SAAMxJ,GACCA,IACHkB,KAAKmH,WAAY,GAGfnH,KAAKiH,YACPsB,cAAcvI,KAAKiH,WACnBjH,KAAKiH,UAAY,MAGfjH,KAAKwH,SAAWxH,KAAKwH,QAAQjB,WAAavG,KAAKmH,YACjDnH,KAAKwI,kBAELxI,KAAKiH,UAAYwB,aACd/Q,SAASgR,gBAAkB1I,KAAKmI,gBAAkBnI,KAAKiI,MAAMU,KAAK3I,MACnEA,KAAKwH,QAAQjB,cAKnBqC,GAAA,SAAGC,GAAO,IAAAC,EAAA9I,KACRA,KAAKkH,eAAiBvB,EAzGG,wBAyG0C3F,KAAKwC,UACxE,IAAMuG,EAAc/I,KAAKgJ,cAAchJ,KAAKkH,gBAE5C,KAAI2B,EAAQ7I,KAAKgH,OAAOnI,OAAS,GAAKgK,EAAQ,GAI9C,GAAI7I,KAAKoH,WACPlH,EAAaS,IAAIX,KAAKwC,SAxIZ,oBAwIkC,WAAA,OAAMsG,EAAKF,GAAGC,UAD5D,CAKA,GAAIE,IAAgBF,EAGlB,OAFA7I,KAAK0G,aACL1G,KAAKsI,QAIP,IAAMW,EAAYJ,EAAQE,EAxJP,OACA,OA2JnB/I,KAAKkI,OAAOe,EAAWjJ,KAAKgH,OAAO6B,QAGrClG,QAAA,WACEoE,EAAAhB,UAAMpD,QAAN/H,KAAAoF,MACAE,EAAaC,IAAIH,KAAKwC,SA3LX,gBA6LXxC,KAAKgH,OAAS,KACdhH,KAAKwH,QAAU,KACfxH,KAAKiH,UAAY,KACjBjH,KAAKmH,UAAY,KACjBnH,KAAKoH,WAAa,KAClBpH,KAAKkH,eAAiB,KACtBlH,KAAK0H,mBAAqB,QAK5BD,WAAA,SAAWvN,GAMT,OALAA,EAAMgP,EAAA,GACD5C,EACApM,GAELF,EA/MS,WA+MaE,EAAQ2M,GACvB3M,KAGTiP,aAAA,WACE,IAAMC,EAAY7R,KAAK8R,IAAIrJ,KAAKuH,aAEhC,KAAI6B,GA9MgB,IA8MpB,CAIA,IAAMH,EAAYG,EAAYpJ,KAAKuH,YAEnCvH,KAAKuH,YAAc,EAGf0B,EAAY,IACVhN,EACF+D,KAAKiI,OAELjI,KAAKqI,QAKLY,EAAY,IACVhN,EACF+D,KAAKqI,OAELrI,KAAKiI,YAKXD,mBAAA,WAAqB,IAAAsB,EAAAtJ,KACfA,KAAKwH,QAAQhB,UACftG,EAAaQ,GAAGV,KAAKwC,SAhNR,uBAgNiC,SAAA1D,GAAK,OAAIwK,EAAKC,SAASzK,MAG5C,UAAvBkB,KAAKwH,QAAQd,QACfxG,EAAaQ,GAAGV,KAAKwC,SAnNL,0BAmNiC,SAAA1D,GAAK,OAAIwK,EAAK5C,MAAM5H,MACrEoB,EAAaQ,GAAGV,KAAKwC,SAnNL,0BAmNiC,SAAA1D,GAAK,OAAIwK,EAAKhB,MAAMxJ,OAGnEkB,KAAKwH,QAAQZ,OAAS5G,KAAK2H,iBAC7B3H,KAAKwJ,6BAITA,wBAAA,WAA0B,IAAAC,EAAAzJ,KAClB0J,EAAQ,SAAA5K,IACR2K,EAAK3B,eA/LU,QA+LQhJ,EAAM6K,aAhMZ,UAgMgD7K,EAAM6K,YAE/DF,EAAK3B,gBACf2B,EAAKnC,YAAcxI,EAAM8K,QAAQ,GAAGC,SAFpCJ,EAAKnC,YAAcxI,EAAM+K,SAevBC,EAAM,SAAAhL,IACN2K,EAAK3B,eAhNU,QAgNQhJ,EAAM6K,aAjNZ,UAiNgD7K,EAAM6K,cACzEF,EAAKlC,YAAczI,EAAM+K,QAAUJ,EAAKnC,aAG1CmC,EAAKN,eACsB,UAAvBM,EAAKjC,QAAQd,QASf+C,EAAK/C,QACD+C,EAAKpC,cACP0C,aAAaN,EAAKpC,cAGpBoC,EAAKpC,aAAetN,YAAW,SAAA+E,GAAK,OAAI2K,EAAKnB,MAAMxJ,KA/R5B,IA+R6D2K,EAAKjC,QAAQjB,YAIrGZ,EA/OsB,qBA+OiB3F,KAAKwC,UAAUlI,SAAQ,SAAA0P,GAC5D9J,EAAaQ,GAAGsJ,EAhQA,yBAgQ2B,SAAAC,GAAC,OAAIA,EAAE3H,uBAGhDtC,KAAK8H,eACP5H,EAAaQ,GAAGV,KAAKwC,SAtQJ,2BAsQiC,SAAA1D,GAAK,OAAI4K,EAAM5K,MACjEoB,EAAaQ,GAAGV,KAAKwC,SAtQN,yBAsQiC,SAAA1D,GAAK,OAAIgL,EAAIhL,MAE7DkB,KAAKwC,SAASc,UAAU4G,IA5PG,mBA8P3BhK,EAAaQ,GAAGV,KAAKwC,SA9QL,0BA8QiC,SAAA1D,GAAK,OAAI4K,EAAM5K,MAChEoB,EAAaQ,GAAGV,KAAKwC,SA9QN,yBA8QiC,SAAA1D,GAAK,OA5C1C,SAAAA,GAEPA,EAAM8K,SAAW9K,EAAM8K,QAAQ/K,OAAS,EAC1C4K,EAAKlC,YAAc,EAEnBkC,EAAKlC,YAAczI,EAAM8K,QAAQ,GAAGC,QAAUJ,EAAKnC,YAuCI6C,CAAKrL,MAC9DoB,EAAaQ,GAAGV,KAAKwC,SA9QP,wBA8QiC,SAAA1D,GAAK,OAAIgL,EAAIhL,UAIhEyK,SAAA,SAASzK,GACH,kBAAkB9D,KAAK8D,EAAMiB,OAAOqK,WAtTrB,cA0TftL,EAAM7B,KACR6B,EAAMwD,iBACFrG,EACF+D,KAAKiI,OAELjI,KAAKqI,QA9TW,eAgUTvJ,EAAM7B,MACf6B,EAAMwD,iBACFrG,EACF+D,KAAKqI,OAELrI,KAAKiI,YAKXe,cAAA,SAAcnR,GAKZ,OAJAmI,KAAKgH,OAASnP,GAAWA,EAAQwD,WAC/BsK,EAxRgB,iBAwRmB9N,EAAQwD,YAC3C,GAEK2E,KAAKgH,OAAOqD,QAAQxS,MAG7ByS,oBAAA,SAAoBrB,EAAWsB,GAC7B,IAAMC,EA7Ta,SA6TKvB,EAClBwB,EA7Ta,SA6TKxB,EAClBF,EAAc/I,KAAKgJ,cAAcuB,GACjCG,EAAgB1K,KAAKgH,OAAOnI,OAAS,EAI3C,IAHuB4L,GAAmC,IAAhB1B,GACjByB,GAAmBzB,IAAgB2B,KAEtC1K,KAAKwH,QAAQb,KACjC,OAAO4D,EAGT,IACMI,GAAa5B,GAxUA,SAuULE,GAAgC,EAAI,IACRjJ,KAAKgH,OAAOnI,OAEtD,OAAsB,IAAf8L,EACL3K,KAAKgH,OAAOhH,KAAKgH,OAAOnI,OAAS,GACjCmB,KAAKgH,OAAO2D,MAGhBC,mBAAA,SAAmBC,EAAeC,GAChC,IAAMC,EAAc/K,KAAKgJ,cAAc6B,GACjCG,EAAYhL,KAAKgJ,cAAcrD,EArTZ,wBAqTyD3F,KAAKwC,WAEvF,OAAOtC,EAAaoB,QAAQtB,KAAKwC,SA/UpB,oBA+U2C,CACtDqI,cAAAA,EACA5B,UAAW6B,EACXG,KAAMD,EACNpC,GAAImC,OAIRG,2BAAA,SAA2BrT,GACzB,GAAImI,KAAK0H,mBAAoB,CAC3B,IAAMyD,EAAkBxF,EAlUN,UAkU8C3F,KAAK0H,oBAErEyD,EAAgB7H,UAAUC,OA5UN,UA6UpB4H,EAAgB1G,gBAAgB,gBAIhC,IAFA,IAAM2G,EAAazF,EAjUE,mBAiUsC3F,KAAK0H,oBAEvD/I,EAAI,EAAGA,EAAIyM,EAAWvM,OAAQF,IACrC,GAAI5F,OAAOsS,SAASD,EAAWzM,GAAG5G,aAAa,oBAAqB,MAAQiI,KAAKgJ,cAAcnR,GAAU,CACvGuT,EAAWzM,GAAG2E,UAAU4G,IAnVR,UAoVhBkB,EAAWzM,GAAGqF,aAAa,eAAgB,QAC3C,WAMRwE,gBAAA,WACE,IAAM3Q,EAAUmI,KAAKkH,gBAAkBvB,EAnVd,wBAmV2D3F,KAAKwC,UAEzF,GAAK3K,EAAL,CAIA,IAAMyT,EAAkBvS,OAAOsS,SAASxT,EAAQE,aAAa,oBAAqB,IAE9EuT,GACFtL,KAAKwH,QAAQ+D,gBAAkBvL,KAAKwH,QAAQ+D,iBAAmBvL,KAAKwH,QAAQjB,SAC5EvG,KAAKwH,QAAQjB,SAAW+E,GAExBtL,KAAKwH,QAAQjB,SAAWvG,KAAKwH,QAAQ+D,iBAAmBvL,KAAKwH,QAAQjB,aAIzE2B,OAAA,SAAOe,EAAWpR,GAAS,IAAA2T,EAAAxL,KACnBuK,EAAgB5E,EApWG,wBAoW0C3F,KAAKwC,UAClEiJ,EAAqBzL,KAAKgJ,cAAcuB,GACxCmB,EAAc7T,GAAY0S,GAAiBvK,KAAKsK,oBAAoBrB,EAAWsB,GAE/EoB,EAAmB3L,KAAKgJ,cAAc0C,GACtCE,EAAYnL,QAAQT,KAAKiH,WAEzB4E,EAxYa,SAwYU5C,EAjXR,sBADF,oBAmXb6C,EAzYa,SAyYI7C,EAjXH,qBACA,qBAiXd6B,EA1Ya,SA0YQ7B,EAxYR,OACC,QAyYpB,GAAIyC,GAAeA,EAAYpI,UAAUE,SAxXnB,UAyXpBxD,KAAKoH,YAAa,OAKpB,IADmBpH,KAAK4K,mBAAmBc,EAAaZ,GACzClJ,kBAIV2I,GAAkBmB,EAAvB,CAcA,GATA1L,KAAKoH,YAAa,EAEdwE,GACF5L,KAAK0G,QAGP1G,KAAKkL,2BAA2BQ,GAChC1L,KAAKkH,eAAiBwE,EAElB1L,KAAKwC,SAASc,UAAUE,SA/YP,SA+YmC,CACtDkI,EAAYpI,UAAU4G,IAAI4B,GAE1BnQ,EAAO+P,GAEPnB,EAAcjH,UAAU4G,IAAI2B,GAC5BH,EAAYpI,UAAU4G,IAAI2B,GAE1B,IAAMjT,EAAqBJ,EAAiC+R,GAE5DrK,EAAaS,IAAI4J,EAAe,iBAAiB,WAC/CmB,EAAYpI,UAAUC,OAAOsI,EAAsBC,GACnDJ,EAAYpI,UAAU4G,IA5ZJ,UA8ZlBK,EAAcjH,UAAUC,OA9ZN,SA8ZgCuI,EAAgBD,GAElEL,EAAKpE,YAAa,EAElBrN,YAAW,WACTmG,EAAaoB,QAAQkK,EAAKhJ,SAjbpB,mBAib0C,CAC9CqI,cAAea,EACfzC,UAAW6B,EACXG,KAAMQ,EACN7C,GAAI+C,MAEL,MAGLnS,EAAqB+Q,EAAe3R,QAEpC2R,EAAcjH,UAAUC,OA9aJ,UA+apBmI,EAAYpI,UAAU4G,IA/aF,UAibpBlK,KAAKoH,YAAa,EAClBlH,EAAaoB,QAAQtB,KAAKwC,SAhchB,mBAgcsC,CAC9CqI,cAAea,EACfzC,UAAW6B,EACXG,KAAMQ,EACN7C,GAAI+C,IAIJC,GACF5L,KAAKsI,YAMFyD,kBAAP,SAAyBlU,EAASqC,GAChC,IAAIgD,EAAOK,EAAa1F,EAjfX,eAkfT2P,EAAO0B,EAAA,GACN5C,EACAhC,EAAYI,kBAAkB7M,IAGb,iBAAXqC,IACTsN,EAAO0B,EAAA,GACF1B,EACAtN,IAIP,IAAM8R,EAA2B,iBAAX9R,EAAsBA,EAASsN,EAAQf,MAM7D,GAJKvJ,IACHA,EAAO,IAAI4J,EAASjP,EAAS2P,IAGT,iBAAXtN,EACTgD,EAAK0L,GAAG1O,QACH,GAAsB,iBAAX8R,EAAqB,CACrC,QAA4B,IAAjB9O,EAAK8O,GACd,MAAM,IAAI/Q,UAAJ,oBAAkC+Q,EAAlC,KAGR9O,EAAK8O,UACIxE,EAAQjB,UAAYiB,EAAQyE,OACrC/O,EAAKwJ,QACLxJ,EAAKoL,YAIF3L,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACfmD,EAASiF,kBAAkB/L,KAAM9F,SAI9BgS,oBAAP,SAA2BpN,GACzB,IAAMiB,EAASxH,EAAuByH,MAEtC,GAAKD,GAAWA,EAAOuD,UAAUE,SA7eT,YA6exB,CAIA,IAAMtJ,EAAMgP,EAAA,GACP5E,EAAYI,kBAAkB3E,GAC9BuE,EAAYI,kBAAkB1E,OAE7BmM,EAAanM,KAAKjI,aAAa,oBAEjCoU,IACFjS,EAAOqM,UAAW,GAGpBO,EAASiF,kBAAkBhM,EAAQ7F,GAE/BiS,GACF5O,EAAawC,EA5iBF,eA4iBoB6I,GAAGuD,GAGpCrN,EAAMwD,gDA/cR,WACE,OAAOgE,wBAGT,WACE,MArGa,oBAyEXQ,CAAiBvE,GAgfvBrC,EAAaQ,GAAGhJ,SA7gBU,6BAkBE,sCA2fyCoP,EAASoF,qBAE9EhM,EAAaQ,GAAGhI,OAhhBS,6BAghBoB,WAG3C,IAFA,IAAM0T,EAAYzG,EA7fO,6BA+fhBhH,EAAI,EAAGC,EAAMwN,EAAUvN,OAAQF,EAAIC,EAAKD,IAC/CmI,EAASiF,kBAAkBK,EAAUzN,GAAIpB,EAAa6O,EAAUzN,GA/jBnD,mBA0kBjBvC,EA3kBa,WA2kBY0K,GC5kBzB,IAKMR,EAAU,CACdvC,QAAQ,EACRsI,OAAQ,IAGJxF,EAAc,CAClB9C,OAAQ,UACRsI,OAAQ,oBA0BJC,EAAAA,SAAAA,GACJ,SAAAA,EAAYzU,EAASqC,GAAQ,IAAAmJ,GAC3BA,EAAA0D,EAAAnM,KAAAoF,KAAMnI,IAANmI,MAEKuM,kBAAmB,EACxBlJ,EAAKmE,QAAUnE,EAAKoE,WAAWvN,GAC/BmJ,EAAKmJ,cAAgB7G,EAChB8G,sCAA+B5U,EAAQT,GAAvCqV,mDACyC5U,EAAQT,GADpD,MAMF,IAFA,IAAMsV,EAAa/G,EAnBM,+BAqBhBhH,EAAI,EAAGC,EAAM8N,EAAW7N,OAAQF,EAAIC,EAAKD,IAAK,CACrD,IAAMgO,EAAOD,EAAW/N,GAClB7G,EAAWO,EAAuBsU,GAClCC,EAAgBjH,EAAoB7N,GACvC+M,QAAO,SAAAgI,GAAS,OAAIA,IAAchV,KAEpB,OAAbC,GAAqB8U,EAAc/N,SACrCwE,EAAKyJ,UAAYhV,EACjBuL,EAAKmJ,cAAcO,KAAKJ,IApBD,OAwB3BtJ,EAAK2J,QAAU3J,EAAKmE,QAAQ6E,OAAShJ,EAAK4J,aAAe,KAEpD5J,EAAKmE,QAAQ6E,QAChBhJ,EAAK6J,0BAA0B7J,EAAKb,SAAUa,EAAKmJ,eAGjDnJ,EAAKmE,QAAQzD,QACfV,EAAKU,SA/BoBV,oCA+C7BU,OAAA,WACM/D,KAAKwC,SAASc,UAAUE,SAlER,QAmElBxD,KAAKmN,OAELnN,KAAKoN,UAITA,KAAA,WAAO,IAAAtE,EAAA9I,KACL,IAAIA,KAAKuM,mBAAoBvM,KAAKwC,SAASc,UAAUE,SA1EjC,QA0EpB,CAIA,IAAI6J,EACAC,EAEAtN,KAAKgN,SAUgB,KATvBK,EAAU1H,EA1ES,qBA0E6B3F,KAAKgN,SAClDnI,QAAO,SAAA8H,GACN,MAAmC,iBAAxB7D,EAAKtB,QAAQ6E,OACfM,EAAK5U,aAAa,oBAAsB+Q,EAAKtB,QAAQ6E,OAGvDM,EAAKrJ,UAAUE,SAvFJ,gBA0FV3E,SACVwO,EAAU,MAId,IAAME,EAAY5H,EAAuB3F,KAAK8M,WAC9C,GAAIO,EAAS,CACX,IAAMG,EAAiBH,EAAQI,MAAK,SAAAd,GAAI,OAAIY,IAAcZ,KAG1D,IAFAW,EAAcE,EAAiBjQ,EAAaiQ,EAvHjC,eAuH6D,OAErDF,EAAYf,iBAC7B,OAKJ,IADmBrM,EAAaoB,QAAQtB,KAAKwC,SAhHjC,oBAiHGZ,iBAAf,CAIIyL,GACFA,EAAQ/S,SAAQ,SAAAoT,GACVH,IAAcG,GAChBpB,EAASqB,kBAAkBD,EAAY,QAGpCJ,GACH/P,EAAamQ,EA1IN,cA0I4B,SAKzC,IAAME,EAAY5N,KAAK6N,gBAEvB7N,KAAKwC,SAASc,UAAUC,OA5HA,YA6HxBvD,KAAKwC,SAASc,UAAU4G,IA5HE,cA8H1BlK,KAAKwC,SAASpH,MAAMwS,GAAa,EAE7B5N,KAAKwM,cAAc3N,QACrBmB,KAAKwM,cAAclS,SAAQ,SAAAzC,GACzBA,EAAQyL,UAAUC,OAjIG,aAkIrB1L,EAAQmM,aAAa,iBAAiB,MAI1ChE,KAAK8N,kBAAiB,GAEtB,IAYMC,EAAU,UADaH,EAAU,GAAG1S,cAAgB0S,EAAUxM,MAAM,IAEpExI,EAAqBJ,EAAiCwH,KAAKwC,UAEjEtC,EAAaS,IAAIX,KAAKwC,SAAU,iBAff,WACfsG,EAAKtG,SAASc,UAAUC,OA1IA,cA2IxBuF,EAAKtG,SAASc,UAAU4G,IA5IF,WADJ,QA+IlBpB,EAAKtG,SAASpH,MAAMwS,GAAa,GAEjC9E,EAAKgF,kBAAiB,GAEtB5N,EAAaoB,QAAQwH,EAAKtG,SAxJf,wBAiKbhJ,EAAqBwG,KAAKwC,SAAU5J,GACpCoH,KAAKwC,SAASpH,MAAMwS,GAAgB5N,KAAKwC,SAASuL,GAAlD,UAGFZ,KAAA,WAAO,IAAA7D,EAAAtJ,KACL,IAAIA,KAAKuM,kBAAqBvM,KAAKwC,SAASc,UAAUE,SAjKlC,UAqKDtD,EAAaoB,QAAQtB,KAAKwC,SAzKjC,oBA0KGZ,iBAAf,CAIA,IAAMgM,EAAY5N,KAAK6N,gBAEvB7N,KAAKwC,SAASpH,MAAMwS,GAAgB5N,KAAKwC,SAAS2C,wBAAwByI,GAA1E,KAEAjS,EAAOqE,KAAKwC,UAEZxC,KAAKwC,SAASc,UAAU4G,IA9KE,cA+K1BlK,KAAKwC,SAASc,UAAUC,OAhLA,WADJ,QAmLpB,IAAMyK,EAAqBhO,KAAKwM,cAAc3N,OAC9C,GAAImP,EAAqB,EACvB,IAAK,IAAIrP,EAAI,EAAGA,EAAIqP,EAAoBrP,IAAK,CAC3C,IAAM2C,EAAUtB,KAAKwM,cAAc7N,GAC7BgO,EAAOpU,EAAuB+I,GAEhCqL,IAASA,EAAKrJ,UAAUE,SAzLZ,UA0LdlC,EAAQgC,UAAU4G,IAvLC,aAwLnB5I,EAAQ0C,aAAa,iBAAiB,IAK5ChE,KAAK8N,kBAAiB,GAStB9N,KAAKwC,SAASpH,MAAMwS,GAAa,GACjC,IAAMhV,EAAqBJ,EAAiCwH,KAAKwC,UAEjEtC,EAAaS,IAAIX,KAAKwC,SAAU,iBAVf,WACf8G,EAAKwE,kBAAiB,GACtBxE,EAAK9G,SAASc,UAAUC,OAlMA,cAmMxB+F,EAAK9G,SAASc,UAAU4G,IApMF,YAqMtBhK,EAAaoB,QAAQgI,EAAK9G,SAzMd,yBAgNdhJ,EAAqBwG,KAAKwC,SAAU5J,OAGtCkV,iBAAA,SAAiBG,GACfjO,KAAKuM,iBAAmB0B,KAG1BtL,QAAA,WACEoE,EAAAhB,UAAMpD,QAAN/H,KAAAoF,MACAA,KAAKwH,QAAU,KACfxH,KAAKgN,QAAU,KACfhN,KAAKwM,cAAgB,KACrBxM,KAAKuM,iBAAmB,QAK1B9E,WAAA,SAAWvN,GAOT,OANAA,EAAMgP,EAAA,GACD5C,EACApM,IAEE6J,OAAStD,QAAQvG,EAAO6J,QAC/B/J,EAzPS,WAyPaE,EAAQ2M,GACvB3M,KAGT2T,cAAA,WACE,OAAO7N,KAAKwC,SAASc,UAAUE,SApOrB,SAAA,QACC,YAsObyJ,WAAA,WAAa,IAAAxD,EAAAzJ,KACLqM,EAAWrM,KAAKwH,QAAhB6E,OAuBN,OArBIhT,EAAUgT,QAEiB,IAAlBA,EAAO6B,aAA+C,IAAd7B,EAAO,KACxDA,EAASA,EAAO,IAGlBA,EAAS1G,EAAuB0G,GAKlC1G,EAFoB8G,+CAAwCJ,EAA9C,KAEgBA,GAC3B/R,SAAQ,SAAAzC,GACP,IAAMsW,EAAW5V,EAAuBV,GAExC4R,EAAKyD,0BACHiB,EACA,CAACtW,OAIAwU,KAGTa,0BAAA,SAA0BrV,EAASuW,GACjC,GAAKvW,GAAYuW,EAAavP,OAA9B,CAIA,IAAMwP,EAASxW,EAAQyL,UAAUE,SA5Qb,QA8QpB4K,EAAa9T,SAAQ,SAAAqS,GACf0B,EACF1B,EAAKrJ,UAAUC,OA7QM,aA+QrBoJ,EAAKrJ,UAAU4G,IA/QM,aAkRvByC,EAAK3I,aAAa,gBAAiBqK,UAMhCV,kBAAP,SAAyB9V,EAASqC,GAChC,IAAIgD,EAAOK,EAAa1F,EAhTX,eAiTP2P,EAAO0B,EAAA,GACR5C,EACAhC,EAAYI,kBAAkB7M,GACX,iBAAXqC,GAAuBA,EAASA,EAAS,IAWtD,IARKgD,GAAQsK,EAAQzD,QAA4B,iBAAX7J,GAAuB,YAAYc,KAAKd,KAC5EsN,EAAQzD,QAAS,GAGd7G,IACHA,EAAO,IAAIoP,EAASzU,EAAS2P,IAGT,iBAAXtN,EAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,SAIFyC,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf2I,EAASqB,kBAAkB3N,KAAM9F,oCA/PrC,WACE,OAAOoM,wBAGT,WACE,MAhFa,oBAqCXgG,CAAiB/J,GAgTvBrC,EAAaQ,GAAGhJ,SAnUU,6BAWG,+BAwTyC,SAAUoH,IAEjD,MAAzBA,EAAMiB,OAAOqK,SAAoBtL,EAAMmB,gBAAmD,MAAjCnB,EAAMmB,eAAemK,UAChFtL,EAAMwD,iBAGR,IAAMgM,EAAchK,EAAYI,kBAAkB1E,MAC5ClI,EAAWO,EAAuB2H,MACf2F,EAAoB7N,GAE5BwC,SAAQ,SAAAzC,GACvB,IACIqC,EADEgD,EAAOK,EAAa1F,EAhWb,eAkWTqF,GAEmB,OAAjBA,EAAK8P,SAAkD,iBAAvBsB,EAAYjC,SAC9CnP,EAAKsK,QAAQ6E,OAASiC,EAAYjC,OAClCnP,EAAK8P,QAAU9P,EAAK+P,cAGtB/S,EAAS,UAETA,EAASoU,EAGXhC,EAASqB,kBAAkB9V,EAASqC,SAWxCkC,EA1Xa,WA0XYkQ,GCvZlB,IAAIlH,GAAM,MACNmJ,GAAS,SACTC,GAAQ,QACRlJ,GAAO,OAEPmJ,GAAiB,CAACrJ,GAAKmJ,GAAQC,GAAOlJ,IAOtCoJ,GAAmCD,GAAeE,QAAO,SAAUC,EAAKC,GACjF,OAAOD,EAAI/I,OAAO,CAACgJ,EAAAA,SAAyBA,EAAAA,WAC3C,IACQC,GAA0B,GAAGjJ,OAAO4I,GAAgB,CAX7C,SAWqDE,QAAO,SAAUC,EAAKC,GAC3F,OAAOD,EAAI/I,OAAO,CAACgJ,EAAWA,EAAAA,SAAyBA,EAAAA,WACtD,IAaQE,GAAiB,CAXJ,aACN,OACK,YAEC,aACN,OACK,YAEE,cACN,QACK,cC7BT,SAASC,GAAYnX,GAClC,OAAOA,GAAWA,EAAQoX,UAAY,IAAInU,cAAgB,KCE7C,SAASoU,GAAUC,GAChC,GAAwB,oBAApBA,EAAKxU,WAAkC,CACzC,IAAIyU,EAAgBD,EAAKC,cACzB,OAAOA,GAAgBA,EAAcC,aAAwB3W,OAG/D,OAAOyW,ECLT,SAAS9V,GAAU8V,GAEjB,OAAOA,aADUD,GAAUC,GAAMrJ,SACIqJ,aAAgBrJ,QAMvD,SAASwJ,GAAcH,GAErB,OAAOA,aADUD,GAAUC,GAAMI,aACIJ,aAAgBI,YC6DvD,IAAAC,GAAe,CACbnT,KAAM,cACNoT,SAAS,EACTC,MAAO,QACPhT,GA3EF,SAAqBkJ,GACnB,IAAI+J,EAAQ/J,EAAK+J,MACjBvV,OAAOC,KAAKsV,EAAMC,UAAUtV,SAAQ,SAAU+B,GAC5C,IAAIjB,EAAQuU,EAAME,OAAOxT,IAAS,GAC9BsI,EAAagL,EAAMhL,WAAWtI,IAAS,GACvCxE,EAAU8X,EAAMC,SAASvT,GAExBiT,GAAczX,IAAamX,GAAYnX,KAO5CuC,OAAO0V,OAAOjY,EAAQuD,MAAOA,GAC7BhB,OAAOC,KAAKsK,GAAYrK,SAAQ,SAAU+B,GACxC,IAAI5B,EAAQkK,EAAWtI,IAET,IAAV5B,EACF5C,EAAQ4M,gBAAgBpI,GAExBxE,EAAQmM,aAAa3H,GAAgB,IAAV5B,EAAiB,GAAKA,WAuDvDsV,OAjDF,SAAgB/J,GACd,IAAI2J,EAAQ3J,EAAM2J,MACdK,EAAgB,CAClBC,OAAQ,CACNzK,SAAUmK,EAAMO,QAAQC,SACxB7K,KAAM,IACNF,IAAK,IACLgL,OAAQ,KAEVC,MAAO,CACL7K,SAAU,YAEZ8K,UAAW,IAQb,OANAlW,OAAO0V,OAAOH,EAAMC,SAASK,OAAO7U,MAAO4U,EAAcC,QAErDN,EAAMC,SAASS,OACjBjW,OAAO0V,OAAOH,EAAMC,SAASS,MAAMjV,MAAO4U,EAAcK,OAGnD,WACLjW,OAAOC,KAAKsV,EAAMC,UAAUtV,SAAQ,SAAU+B,GAC5C,IAAIxE,EAAU8X,EAAMC,SAASvT,GACzBsI,EAAagL,EAAMhL,WAAWtI,IAAS,GAGvCjB,EAFkBhB,OAAOC,KAAKsV,EAAME,OAAOU,eAAelU,GAAQsT,EAAME,OAAOxT,GAAQ2T,EAAc3T,IAE7EsS,QAAO,SAAUvT,EAAOb,GAElD,OADAa,EAAMb,GAAY,GACXa,IACN,IAEEkU,GAAczX,IAAamX,GAAYnX,KAI5CuC,OAAO0V,OAAOjY,EAAQuD,MAAOA,GAC7BhB,OAAOC,KAAKsK,GAAYrK,SAAQ,SAAUkW,GACxC3Y,EAAQ4M,gBAAgB+L,YAa9BC,SAAU,CAAC,kBChFE,SAASC,GAAiB7B,GACvC,OAAOA,EAAU1W,MAAM,KAAK,GCAf,SAASwY,GAAc9Y,GACpC,MAAO,CACL+Y,EAAG/Y,EAAQ6N,WACXmL,EAAGhZ,EAAQ4N,UACXqL,MAAOjZ,EAAQkZ,YACfC,OAAQnZ,EAAQ+D,cCNL,SAAS4H,GAAS6I,EAAQnG,GACvC,IJkBoBiJ,EIlBhB8B,EAAW/K,EAAMgL,aAAehL,EAAMgL,cAE1C,GAAI7E,EAAO7I,SAAS0C,GAClB,OAAO,EAEJ,GAAI+K,KJaW9B,EIbc8B,aJcjB/B,GAAUC,GAAMgC,YACIhC,aAAgBgC,YIfR,CACzC,IAAIlJ,EAAO/B,EAEX,EAAG,CACD,GAAI+B,GAAQoE,EAAO+E,WAAWnJ,GAC5B,OAAO,EAITA,EAAOA,EAAK5M,YAAc4M,EAAKoJ,WACxBpJ,GAIb,OAAO,ECpBM,SAAStP,GAAiBd,GACvC,OAAOqX,GAAUrX,GAASc,iBAAiBd,GCD9B,SAASyZ,GAAezZ,GACrC,MAAO,CAAC,QAAS,KAAM,MAAMwS,QAAQ2E,GAAYnX,KAAa,ECDjD,SAAS0Z,GAAmB1Z,GAEzC,QAASwB,GAAUxB,GAAWA,EAAQuX,cACtCvX,EAAQH,WAAagB,OAAOhB,UAAUwE,gBCFzB,SAASsV,GAAc3Z,GACpC,MAA6B,SAAzBmX,GAAYnX,GACPA,EAMPA,EAAQ4Z,cACR5Z,EAAQwD,YAERxD,EAAQwZ,MAERE,GAAmB1Z,GCPvB,SAAS6Z,GAAoB7Z,GAC3B,IAAKyX,GAAczX,IACoB,UAAvCc,GAAiBd,GAAS2N,SACxB,OAAO,KAGT,IAAImM,EAAe9Z,EAAQ8Z,aAE3B,GAAIA,EAAc,CAChB,IAAIC,EAAOL,GAAmBI,GAE9B,GAAkC,SAA9B3C,GAAY2C,IAAwE,WAA5ChZ,GAAiBgZ,GAAcnM,UAA6D,WAApC7M,GAAiBiZ,GAAMpM,SACzH,OAAOoM,EAIX,OAAOD,EAwBM,SAASE,GAAgBha,GAItC,IAHA,IAAIa,EAASwW,GAAUrX,GACnB8Z,EAAeD,GAAoB7Z,GAEhC8Z,GAAgBL,GAAeK,IAA6D,WAA5ChZ,GAAiBgZ,GAAcnM,UACpFmM,EAAeD,GAAoBC,GAGrC,OAAIA,GAA8C,SAA9B3C,GAAY2C,IAAwE,WAA5ChZ,GAAiBgZ,GAAcnM,SAClF9M,EAGFiZ,GA/BT,SAA4B9Z,GAG1B,IAFA,IAAIia,EAAcN,GAAc3Z,GAEzByX,GAAcwC,IAAgB,CAAC,OAAQ,QAAQzH,QAAQ2E,GAAY8C,IAAgB,GAAG,CAC3F,IAAIC,EAAMpZ,GAAiBmZ,GAG3B,GAAsB,SAAlBC,EAAIC,WAA4C,SAApBD,EAAIE,aAA0BF,EAAIG,YAAiC,SAAnBH,EAAIG,WAClF,OAAOJ,EAEPA,EAAcA,EAAYzW,WAI9B,OAAO,KAiBgB8W,CAAmBta,IAAYa,EC5DzC,SAAS0Z,GAAyBvD,GAC/C,MAAO,CAAC,MAAO,UAAUxE,QAAQwE,IAAc,EAAI,IAAM,ICD5C,SAASwD,GAAOC,EAAK7X,EAAO8X,GACzC,OAAOhb,KAAKgb,IAAID,EAAK/a,KAAK+a,IAAI7X,EAAO8X,ICAxB,SAASC,GAAmBC,GACzC,OAAOrY,OAAO0V,OAAO1V,OAAO0V,OAAO,GCD5B,CACL1K,IAAK,EACLoJ,MAAO,EACPD,OAAQ,EACRjJ,KAAM,IDHsDmN,GEFjD,SAASC,GAAgBjY,EAAOJ,GAC7C,OAAOA,EAAKsU,QAAO,SAAUgE,EAAS1V,GAEpC,OADA0V,EAAQ1V,GAAOxC,EACRkY,IACN,ICsFL,IAAAC,GAAe,CACbvW,KAAM,QACNoT,SAAS,EACTC,MAAO,OACPhT,GAnFF,SAAekJ,GACb,IAAIiN,EAEAlD,EAAQ/J,EAAK+J,MACbtT,EAAOuJ,EAAKvJ,KACZyW,EAAenD,EAAMC,SAASS,MAC9B0C,EAAgBpD,EAAMqD,cAAcD,cACpCE,EAAgBvC,GAAiBf,EAAMd,WACvCqE,EAAOd,GAAyBa,GAEhCrU,EADa,CAAC0G,GAAMkJ,IAAOnE,QAAQ4I,IAAkB,EAClC,SAAW,QAElC,GAAKH,GAAiBC,EAAtB,CAIA,IAAIN,EAAgB9C,EAAMqD,cAAc3W,EAAO,eAAe8W,QAC1DC,EAAYzC,GAAcmC,GAC1BO,EAAmB,MAATH,EAAe9N,GAAME,GAC/BgO,EAAmB,MAATJ,EAAe3E,GAASC,GAClC+E,EAAU5D,EAAM6D,MAAMlD,UAAU1R,GAAO+Q,EAAM6D,MAAMlD,UAAU4C,GAAQH,EAAcG,GAAQvD,EAAM6D,MAAMvD,OAAOrR,GAC9G6U,EAAYV,EAAcG,GAAQvD,EAAM6D,MAAMlD,UAAU4C,GACxDQ,EAAoB7B,GAAgBiB,GACpCa,EAAaD,EAA6B,MAATR,EAAeQ,EAAkBE,cAAgB,EAAIF,EAAkBG,aAAe,EAAI,EAC3HC,EAAoBP,EAAU,EAAIE,EAAY,EAG9CnB,EAAMG,EAAcY,GACpBd,EAAMoB,EAAaP,EAAUxU,GAAO6T,EAAca,GAClDS,EAASJ,EAAa,EAAIP,EAAUxU,GAAO,EAAIkV,EAC/C7O,EAASoN,GAAOC,EAAKyB,EAAQxB,GAE7ByB,EAAWd,EACfvD,EAAMqD,cAAc3W,KAASwW,EAAwB,IAA0BmB,GAAY/O,EAAQ4N,EAAsBoB,aAAehP,EAAS8O,EAAQlB,KAmDzJ9C,OAhDF,SAAgB/J,GACd,IAAI2J,EAAQ3J,EAAM2J,MACdO,EAAUlK,EAAMkK,QAChB7T,EAAO2J,EAAM3J,KACb6X,EAAmBhE,EAAQrY,QAC3Bib,OAAoC,IAArBoB,EAA8B,sBAAwBA,EACrEC,EAAmBjE,EAAQiD,QAC3BA,OAA+B,IAArBgB,EAA8B,EAAIA,EAE5B,MAAhBrB,IAKwB,iBAAjBA,IACTA,EAAenD,EAAMC,SAASK,OAAO3X,cAAcwa,MAahDtP,GAASmM,EAAMC,SAASK,OAAQ6C,KAQrCnD,EAAMC,SAASS,MAAQyC,EACvBnD,EAAMqD,cAAc3W,EAAO,eAAiB,CAC1C8W,QAASX,GAAsC,iBAAZW,EAAuBA,EAAUT,GAAgBS,EAAS1E,QAW/FgC,SAAU,CAAC,iBACX2D,iBAAkB,CAAC,oBC1FjBC,GAAa,CACfjP,IAAK,OACLoJ,MAAO,OACPD,OAAQ,OACRjJ,KAAM,QAgBD,SAASgP,GAAYtO,GAC1B,IAAIuO,EAEAtE,EAASjK,EAAMiK,OACfuE,EAAaxO,EAAMwO,WACnB3F,EAAY7I,EAAM6I,UAClB4F,EAAUzO,EAAMyO,QAChBjP,EAAWQ,EAAMR,SACjBkP,EAAkB1O,EAAM0O,gBACxBC,EAAW3O,EAAM2O,SAGjBC,EAFe5O,EAAM6O,aArB3B,SAA2BjP,GACzB,IAAIgL,EAAIhL,EAAKgL,EACTC,EAAIjL,EAAKiL,EAETiE,EADMpc,OACIqc,kBAAoB,EAClC,MAAO,CACLnE,EAAGrZ,KAAKyd,MAAMpE,EAAIkE,GAAOA,GAAO,EAChCjE,EAAGtZ,KAAKyd,MAAMnE,EAAIiE,GAAOA,GAAO,GAgBPG,CAAkBR,GAAWA,EACpDS,EAAUN,EAAMhE,EAChBA,OAAgB,IAAZsE,EAAqB,EAAIA,EAC7BC,EAAUP,EAAM/D,EAChBA,OAAgB,IAAZsE,EAAqB,EAAIA,EAE7BC,EAAOX,EAAQlE,eAAe,KAC9B8E,EAAOZ,EAAQlE,eAAe,KAC9B+E,EAAQhQ,GACRiQ,EAAQnQ,GACRoQ,EAAM9c,OAEV,GAAIic,EAAU,CACZ,IAAIhD,EAAeE,GAAgB5B,GAE/B0B,IAAiBzC,GAAUe,KAC7B0B,EAAeJ,GAAmBtB,IAMhCpB,IAAczJ,KAChBmQ,EAAQhH,GACRsC,GAAKc,EAAaiC,aAAeY,EAAWxD,OAC5CH,GAAK6D,EAAkB,GAAK,GAG1B7F,IAAcvJ,KAChBgQ,EAAQ9G,GACRoC,GAAKe,EAAakC,YAAcW,EAAW1D,MAC3CF,GAAK8D,EAAkB,GAAK,GAIhC,IAKMe,EALFC,EAAetb,OAAO0V,OAAO,CAC/BtK,SAAUA,GACTmP,GAAYN,IAEf,OAAIK,EAGKta,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI4F,GAAe,KAAKD,EAAiB,IAAmBF,GAASF,EAAO,IAAM,GAAII,EAAeH,GAASF,EAAO,IAAM,GAAIK,EAAezD,WAAawD,EAAIT,kBAAoB,GAAK,EAAI,aAAenE,EAAI,OAASC,EAAI,MAAQ,eAAiBD,EAAI,OAASC,EAAI,SAAU4E,IAG9Srb,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI4F,GAAe,KAAKnB,EAAkB,IAAoBgB,GAASF,EAAOxE,EAAI,KAAO,GAAI0D,EAAgBe,GAASF,EAAOxE,EAAI,KAAO,GAAI2D,EAAgBvC,UAAY,GAAIuC,IAsDjN,IAAAoB,GAAe,CACbtZ,KAAM,gBACNoT,SAAS,EACTC,MAAO,cACPhT,GAvDF,SAAuBkZ,GACrB,IAAIjG,EAAQiG,EAAMjG,MACdO,EAAU0F,EAAM1F,QAChB2F,EAAwB3F,EAAQwE,gBAChCA,OAA4C,IAA1BmB,GAA0CA,EAC5DC,EAAoB5F,EAAQyE,SAC5BA,OAAiC,IAAtBmB,GAAsCA,EACjDC,EAAwB7F,EAAQ2E,aAChCA,OAAyC,IAA1BkB,GAA0CA,EAYzDL,EAAe,CACjB7G,UAAW6B,GAAiBf,EAAMd,WAClCoB,OAAQN,EAAMC,SAASK,OACvBuE,WAAY7E,EAAM6D,MAAMvD,OACxByE,gBAAiBA,GAGsB,MAArC/E,EAAMqD,cAAcD,gBACtBpD,EAAME,OAAOI,OAAS7V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIH,EAAME,OAAOI,QAASqE,GAAYla,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI4F,GAAe,GAAI,CACzIjB,QAAS9E,EAAMqD,cAAcD,cAC7BvN,SAAUmK,EAAMO,QAAQC,SACxBwE,SAAUA,EACVE,aAAcA,OAIe,MAA7BlF,EAAMqD,cAAc3C,QACtBV,EAAME,OAAOQ,MAAQjW,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIH,EAAME,OAAOQ,OAAQiE,GAAYla,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI4F,GAAe,GAAI,CACvIjB,QAAS9E,EAAMqD,cAAc3C,MAC7B7K,SAAU,WACVmP,UAAU,EACVE,aAAcA,OAIlBlF,EAAMhL,WAAWsL,OAAS7V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIH,EAAMhL,WAAWsL,QAAS,GAAI,CACtF+F,wBAAyBrG,EAAMd,aAUjC3R,KAAM,IC7IJ+Y,GAAU,CACZA,SAAS,GAsCXC,GAAe,CACb7Z,KAAM,iBACNoT,SAAS,EACTC,MAAO,QACPhT,GAAI,aACJqT,OAxCF,SAAgBnK,GACd,IAAI+J,EAAQ/J,EAAK+J,MACbnS,EAAWoI,EAAKpI,SAChB0S,EAAUtK,EAAKsK,QACfiG,EAAkBjG,EAAQkG,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7CE,EAAkBnG,EAAQoG,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7C3d,EAASwW,GAAUS,EAAMC,SAASK,QAClCsG,EAAgB,GAAG1Q,OAAO8J,EAAM4G,cAAcjG,UAAWX,EAAM4G,cAActG,QAYjF,OAVImG,GACFG,EAAcjc,SAAQ,SAAUkc,GAC9BA,EAAa5c,iBAAiB,SAAU4D,EAASiZ,OAAQR,OAIzDK,GACF5d,EAAOkB,iBAAiB,SAAU4D,EAASiZ,OAAQR,IAG9C,WACDG,GACFG,EAAcjc,SAAQ,SAAUkc,GAC9BA,EAAa1c,oBAAoB,SAAU0D,EAASiZ,OAAQR,OAI5DK,GACF5d,EAAOoB,oBAAoB,SAAU0D,EAASiZ,OAAQR,MAY1D/Y,KAAM,IC/CJwZ,GAAO,CACTpR,KAAM,QACNkJ,MAAO,OACPD,OAAQ,MACRnJ,IAAK,UAEQ,SAASuR,GAAqB9H,GAC3C,OAAOA,EAAUxP,QAAQ,0BAA0B,SAAUuX,GAC3D,OAAOF,GAAKE,MCRhB,IAAIF,GAAO,CACThN,MAAO,MACPI,IAAK,SAEQ,SAAS+M,GAA8BhI,GACpD,OAAOA,EAAUxP,QAAQ,cAAc,SAAUuX,GAC/C,OAAOF,GAAKE,MCND,SAASzR,GAAsBtN,GAC5C,IAAIqN,EAAOrN,EAAQsN,wBACnB,MAAO,CACL2L,MAAO5L,EAAK4L,MACZE,OAAQ9L,EAAK8L,OACb5L,IAAKF,EAAKE,IACVoJ,MAAOtJ,EAAKsJ,MACZD,OAAQrJ,EAAKqJ,OACbjJ,KAAMJ,EAAKI,KACXsL,EAAG1L,EAAKI,KACRuL,EAAG3L,EAAKE,KCTG,SAAS0R,GAAgB3H,GACtC,IAAIqG,EAAMtG,GAAUC,GAGpB,MAAO,CACL5J,WAHeiQ,EAAIuB,YAInB1R,UAHcmQ,EAAIwB,aCDP,SAASC,GAAoBpf,GAQ1C,OAAOsN,GAAsBoM,GAAmB1Z,IAAUyN,KAAOwR,GAAgBjf,GAAS0N,WCV7E,SAAS2R,GAAerf,GAErC,IAAIsf,EAAoBxe,GAAiBd,GACrCuf,EAAWD,EAAkBC,SAC7BC,EAAYF,EAAkBE,UAC9BC,EAAYH,EAAkBG,UAElC,MAAO,6BAA6Btc,KAAKoc,EAAWE,EAAYD,GCInD,SAASE,GAAkB1f,EAAS2f,QACpC,IAATA,IACFA,EAAO,IAGT,IAAIhB,ECbS,SAASiB,EAAgBtI,GACtC,MAAI,CAAC,OAAQ,OAAQ,aAAa9E,QAAQ2E,GAAYG,KAAU,EAEvDA,EAAKC,cAAcrT,KAGxBuT,GAAcH,IAAS+H,GAAe/H,GACjCA,EAGFsI,EAAgBjG,GAAcrC,IDGlBsI,CAAgB5f,GAC/B6f,EAAuC,SAA9B1I,GAAYwH,GACrBhB,EAAMtG,GAAUsH,GAChBzW,EAAS2X,EAAS,CAAClC,GAAK3P,OAAO2P,EAAImC,gBAAkB,GAAIT,GAAeV,GAAgBA,EAAe,IAAMA,EAC7GoB,EAAcJ,EAAK3R,OAAO9F,GAC9B,OAAO2X,EAASE,EAChBA,EAAY/R,OAAO0R,GAAkB/F,GAAczR,KEvBtC,SAAS8X,GAAiB3S,GACvC,OAAO9K,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI5K,GAAO,GAAI,CAChDI,KAAMJ,EAAK0L,EACXxL,IAAKF,EAAK2L,EACVrC,MAAOtJ,EAAK0L,EAAI1L,EAAK4L,MACrBvC,OAAQrJ,EAAK2L,EAAI3L,EAAK8L,SCsB1B,SAAS8G,GAA2BjgB,EAASkgB,GAC3C,M9BnBoB,a8BmBbA,EAA8BF,GCzBxB,SAAyBhgB,GACtC,IAAI2d,EAAMtG,GAAUrX,GAChB+Z,EAAOL,GAAmB1Z,GAC1B8f,EAAiBnC,EAAImC,eACrB7G,EAAQc,EAAKiC,YACb7C,EAASY,EAAKgC,aACdhD,EAAI,EACJC,EAAI,EAuBR,OAjBI8G,IACF7G,EAAQ6G,EAAe7G,MACvBE,EAAS2G,EAAe3G,OASnB,iCAAiChW,KAAK4M,UAAUoQ,aACnDpH,EAAI+G,EAAejS,WACnBmL,EAAI8G,EAAelS,YAIhB,CACLqL,MAAOA,EACPE,OAAQA,EACRJ,EAAGA,EAAIqG,GAAoBpf,GAC3BgZ,EAAGA,GDTiDoH,CAAgBpgB,IAAYyX,GAAcyI,GAdlG,SAAoClgB,GAClC,IAAIqN,EAAOC,GAAsBtN,GASjC,OARAqN,EAAKE,IAAMF,EAAKE,IAAMvN,EAAQqgB,UAC9BhT,EAAKI,KAAOJ,EAAKI,KAAOzN,EAAQsgB,WAChCjT,EAAKqJ,OAASrJ,EAAKE,IAAMvN,EAAQ+b,aACjC1O,EAAKsJ,MAAQtJ,EAAKI,KAAOzN,EAAQgc,YACjC3O,EAAK4L,MAAQjZ,EAAQgc,YACrB3O,EAAK8L,OAASnZ,EAAQ+b,aACtB1O,EAAK0L,EAAI1L,EAAKI,KACdJ,EAAK2L,EAAI3L,EAAKE,IACPF,EAI2GkT,CAA2BL,GAAkBF,GEtBlJ,SAAyBhgB,GACtC,IAAI+Z,EAAOL,GAAmB1Z,GAC1BwgB,EAAYvB,GAAgBjf,GAC5BkE,EAAOlE,EAAQuX,cAAcrT,KAC7B+U,EAAQvZ,KAAKgb,IAAIX,EAAK0G,YAAa1G,EAAKiC,YAAa9X,EAAOA,EAAKuc,YAAc,EAAGvc,EAAOA,EAAK8X,YAAc,GAC5G7C,EAASzZ,KAAKgb,IAAIX,EAAK2G,aAAc3G,EAAKgC,aAAc7X,EAAOA,EAAKwc,aAAe,EAAGxc,EAAOA,EAAK6X,aAAe,GACjHhD,GAAKyH,EAAU9S,WAAa0R,GAAoBpf,GAChDgZ,GAAKwH,EAAUhT,UAMnB,MAJiD,QAA7C1M,GAAiBoD,GAAQ6V,GAAM3I,YACjC2H,GAAKrZ,KAAKgb,IAAIX,EAAKiC,YAAa9X,EAAOA,EAAK8X,YAAc,GAAK/C,GAG1D,CACLA,MAAOA,EACPE,OAAQA,EACRJ,EAAGA,EACHC,EAAGA,GFK2K2H,CAAgBjH,GAAmB1Z,KG5BtM,SAAS4gB,GAAa5J,GACnC,OAAOA,EAAU1W,MAAM,KAAK,GCGf,SAASugB,GAAe9S,GACrC,IAOI6O,EAPAnE,EAAY1K,EAAK0K,UACjBzY,EAAU+N,EAAK/N,QACfgX,EAAYjJ,EAAKiJ,UACjBoE,EAAgBpE,EAAY6B,GAAiB7B,GAAa,KAC1D8J,EAAY9J,EAAY4J,GAAa5J,GAAa,KAClD+J,EAAUtI,EAAUM,EAAIN,EAAUQ,MAAQ,EAAIjZ,EAAQiZ,MAAQ,EAC9D+H,EAAUvI,EAAUO,EAAIP,EAAUU,OAAS,EAAInZ,EAAQmZ,OAAS,EAGpE,OAAQiC,GACN,KAAK7N,GACHqP,EAAU,CACR7D,EAAGgI,EACH/H,EAAGP,EAAUO,EAAIhZ,EAAQmZ,QAE3B,MAEF,KAAKzC,GACHkG,EAAU,CACR7D,EAAGgI,EACH/H,EAAGP,EAAUO,EAAIP,EAAUU,QAE7B,MAEF,KAAKxC,GACHiG,EAAU,CACR7D,EAAGN,EAAUM,EAAIN,EAAUQ,MAC3BD,EAAGgI,GAEL,MAEF,KAAKvT,GACHmP,EAAU,CACR7D,EAAGN,EAAUM,EAAI/Y,EAAQiZ,MACzBD,EAAGgI,GAEL,MAEF,QACEpE,EAAU,CACR7D,EAAGN,EAAUM,EACbC,EAAGP,EAAUO,GAInB,IAAIiI,EAAW7F,EAAgBb,GAAyBa,GAAiB,KAEzE,GAAgB,MAAZ6F,EAAkB,CACpB,IAAIla,EAAmB,MAAbka,EAAmB,SAAW,QAExC,OAAQH,GACN,IlClDa,QkCmDXlE,EAAQqE,GAAYrE,EAAQqE,IAAaxI,EAAU1R,GAAO,EAAI/G,EAAQ+G,GAAO,GAC7E,MAEF,IlCrDW,MkCsDT6V,EAAQqE,GAAYrE,EAAQqE,IAAaxI,EAAU1R,GAAO,EAAI/G,EAAQ+G,GAAO,IAOnF,OAAO6V,EC1DM,SAASsE,GAAepJ,EAAOO,QAC5B,IAAZA,IACFA,EAAU,IAGZ,IAAI8I,EAAW9I,EACX+I,EAAqBD,EAASnK,UAC9BA,OAAmC,IAAvBoK,EAAgCtJ,EAAMd,UAAYoK,EAC9DC,EAAoBF,EAASG,SAC7BA,OAAiC,IAAtBD,EnCXY,kBmCWqCA,EAC5DE,EAAwBJ,EAASK,aACjCA,OAAyC,IAA1BD,EnCZC,WmCY6CA,EAC7DE,EAAwBN,EAASO,eACjCA,OAA2C,IAA1BD,EnCbH,SmCa+CA,EAC7DE,EAAuBR,EAASS,YAChCA,OAAuC,IAAzBD,GAA0CA,EACxDrF,EAAmB6E,EAAS7F,QAC5BA,OAA+B,IAArBgB,EAA8B,EAAIA,EAC5C1B,EAAgBD,GAAsC,iBAAZW,EAAuBA,EAAUT,GAAgBS,EAAS1E,KACpGiL,EnCnBc,WmCmBDH,EnClBI,YADH,SmCoBdI,EAAmBhK,EAAMC,SAASU,UAClCkE,EAAa7E,EAAM6D,MAAMvD,OACzBpY,EAAU8X,EAAMC,SAAS6J,EAAcC,EAAaH,GACpDK,ELkBS,SAAyB/hB,EAASshB,EAAUE,GACzD,IAAIQ,EAAmC,oBAAbV,EAlB5B,SAA4BthB,GAC1B,IAAIiiB,EAAkBvC,GAAkB/F,GAAc3Z,IAElDkiB,EADoB,CAAC,WAAY,SAAS1P,QAAQ1R,GAAiBd,GAAS2N,WAAa,GACnD8J,GAAczX,GAAWga,GAAgBha,GAAWA,EAE9F,OAAKwB,GAAU0gB,GAKRD,EAAgBjV,QAAO,SAAUkT,GACtC,OAAO1e,GAAU0e,IAAmBvU,GAASuU,EAAgBgC,IAAmD,SAAhC/K,GAAY+I,MALrF,GAYkDiC,CAAmBniB,GAAW,GAAGgO,OAAOsT,GAC/FW,EAAkB,GAAGjU,OAAOgU,EAAqB,CAACR,IAClDY,EAAsBH,EAAgB,GACtCI,EAAeJ,EAAgBnL,QAAO,SAAUwL,EAASpC,GAC3D,IAAI7S,EAAO4S,GAA2BjgB,EAASkgB,GAK/C,OAJAoC,EAAQ/U,IAAM7N,KAAKgb,IAAIrN,EAAKE,IAAK+U,EAAQ/U,KACzC+U,EAAQ3L,MAAQjX,KAAK+a,IAAIpN,EAAKsJ,MAAO2L,EAAQ3L,OAC7C2L,EAAQ5L,OAAShX,KAAK+a,IAAIpN,EAAKqJ,OAAQ4L,EAAQ5L,QAC/C4L,EAAQ7U,KAAO/N,KAAKgb,IAAIrN,EAAKI,KAAM6U,EAAQ7U,MACpC6U,IACNrC,GAA2BjgB,EAASoiB,IAKvC,OAJAC,EAAapJ,MAAQoJ,EAAa1L,MAAQ0L,EAAa5U,KACvD4U,EAAalJ,OAASkJ,EAAa3L,OAAS2L,EAAa9U,IACzD8U,EAAatJ,EAAIsJ,EAAa5U,KAC9B4U,EAAarJ,EAAIqJ,EAAa9U,IACvB8U,EKlCkBE,CAAgB/gB,GAAUxB,GAAWA,EAAUA,EAAQwiB,gBAAkB9I,GAAmB5B,EAAMC,SAASK,QAASkJ,EAAUE,GACnJiB,EAAsBnV,GAAsBwU,GAC5C5G,EAAgB2F,GAAe,CACjCpI,UAAWgK,EACXziB,QAAS2c,EACTrE,SAAU,WACVtB,UAAWA,IAET0L,EAAmB1C,GAAiBzd,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI0E,GAAazB,IACjFyH,EnChCc,WmCgCMjB,EAA4BgB,EAAmBD,EAGnEG,EAAkB,CACpBrV,IAAKwU,EAAmBxU,IAAMoV,EAAkBpV,IAAMqN,EAAcrN,IACpEmJ,OAAQiM,EAAkBjM,OAASqL,EAAmBrL,OAASkE,EAAclE,OAC7EjJ,KAAMsU,EAAmBtU,KAAOkV,EAAkBlV,KAAOmN,EAAcnN,KACvEkJ,MAAOgM,EAAkBhM,MAAQoL,EAAmBpL,MAAQiE,EAAcjE,OAExEkM,EAAa/K,EAAMqD,cAAc/N,OAErC,GnC3CkB,WmC2CdsU,GAA6BmB,EAAY,CAC3C,IAAIzV,EAASyV,EAAW7L,GACxBzU,OAAOC,KAAKogB,GAAiBngB,SAAQ,SAAU2C,GAC7C,IAAI0d,EAAW,CAACnM,GAAOD,IAAQlE,QAAQpN,IAAQ,EAAI,GAAK,EACpDiW,EAAO,CAAC9N,GAAKmJ,IAAQlE,QAAQpN,IAAQ,EAAI,IAAM,IACnDwd,EAAgBxd,IAAQgI,EAAOiO,GAAQyH,KAI3C,OAAOF,ECtDM,SAASG,GAAqBjL,EAAOO,QAClC,IAAZA,IACFA,EAAU,IAGZ,IAAI8I,EAAW9I,EACXrB,EAAYmK,EAASnK,UACrBsK,EAAWH,EAASG,SACpBE,EAAeL,EAASK,aACxBlG,EAAU6F,EAAS7F,QACnB0H,EAAiB7B,EAAS6B,eAC1BC,EAAwB9B,EAAS+B,sBACjCA,OAAkD,IAA1BD,EAAmCE,GAAgBF,EAC3EnC,EAAYF,GAAa5J,GACzBC,EAAa6J,EAAYkC,EAAiBnM,GAAsBA,GAAoB7J,QAAO,SAAUgK,GACvG,OAAO4J,GAAa5J,KAAe8J,KAChClK,GACDwM,EAAoBnM,EAAWjK,QAAO,SAAUgK,GAClD,OAAOkM,EAAsB1Q,QAAQwE,IAAc,KAGpB,IAA7BoM,EAAkBpc,SACpBoc,EAAoBnM,GAQtB,IAAIoM,EAAYD,EAAkBtM,QAAO,SAAUC,EAAKC,GAOtD,OANAD,EAAIC,GAAakK,GAAepJ,EAAO,CACrCd,UAAWA,EACXsK,SAAUA,EACVE,aAAcA,EACdlG,QAASA,IACRzC,GAAiB7B,IACbD,IACN,IACH,OAAOxU,OAAOC,KAAK6gB,GAAWC,MAAK,SAAUC,EAAGC,GAC9C,OAAOH,EAAUE,GAAKF,EAAUG,MCyFpC,IAAAC,GAAe,CACbjf,KAAM,OACNoT,SAAS,EACTC,MAAO,OACPhT,GA5HF,SAAckJ,GACZ,IAAI+J,EAAQ/J,EAAK+J,MACbO,EAAUtK,EAAKsK,QACf7T,EAAOuJ,EAAKvJ,KAEhB,IAAIsT,EAAMqD,cAAc3W,GAAMkf,MAA9B,CAoCA,IAhCA,IAAIC,EAAoBtL,EAAQ4I,SAC5B2C,OAAsC,IAAtBD,GAAsCA,EACtDE,EAAmBxL,EAAQyL,QAC3BC,OAAoC,IAArBF,GAAqCA,EACpDG,EAA8B3L,EAAQ4L,mBACtC3I,EAAUjD,EAAQiD,QAClBgG,EAAWjJ,EAAQiJ,SACnBE,EAAenJ,EAAQmJ,aACvBI,EAAcvJ,EAAQuJ,YACtBsC,EAAwB7L,EAAQ2K,eAChCA,OAA2C,IAA1BkB,GAA0CA,EAC3DhB,EAAwB7K,EAAQ6K,sBAChCiB,EAAqBrM,EAAMO,QAAQrB,UACnCoE,EAAgBvC,GAAiBsL,GAEjCF,EAAqBD,IADH5I,IAAkB+I,GACqCnB,EAjC/E,SAAuChM,GACrC,GrCLgB,SqCKZ6B,GAAiB7B,GACnB,MAAO,GAGT,IAAIoN,EAAoBtF,GAAqB9H,GAC7C,MAAO,CAACgI,GAA8BhI,GAAYoN,EAAmBpF,GAA8BoF,IA2BwCC,CAA8BF,GAA3E,CAACrF,GAAqBqF,KAChHlN,EAAa,CAACkN,GAAoBnW,OAAOiW,GAAoBnN,QAAO,SAAUC,EAAKC,GACrF,OAAOD,EAAI/I,OrCvCG,SqCuCI6K,GAAiB7B,GAAsB+L,GAAqBjL,EAAO,CACnFd,UAAWA,EACXsK,SAAUA,EACVE,aAAcA,EACdlG,QAASA,EACT0H,eAAgBA,EAChBE,sBAAuBA,IACpBlM,KACJ,IACCsN,EAAgBxM,EAAM6D,MAAMlD,UAC5BkE,EAAa7E,EAAM6D,MAAMvD,OACzBmM,EAAY,IAAIC,IAChBC,GAAqB,EACrBC,EAAwBzN,EAAW,GAE9BnQ,EAAI,EAAGA,EAAImQ,EAAWjQ,OAAQF,IAAK,CAC1C,IAAIkQ,EAAYC,EAAWnQ,GAEvB6d,EAAiB9L,GAAiB7B,GAElC4N,ErCzDW,UqCyDQhE,GAAa5J,GAChC6N,EAAa,CAACtX,GAAKmJ,IAAQlE,QAAQmS,IAAmB,EACtD5d,EAAM8d,EAAa,QAAU,SAC7BtF,EAAW2B,GAAepJ,EAAO,CACnCd,UAAWA,EACXsK,SAAUA,EACVE,aAAcA,EACdI,YAAaA,EACbtG,QAASA,IAEPwJ,EAAoBD,EAAaD,EAAmBjO,GAAQlJ,GAAOmX,EAAmBlO,GAASnJ,GAE/F+W,EAAcvd,GAAO4V,EAAW5V,KAClC+d,EAAoBhG,GAAqBgG,IAG3C,IAAIC,EAAmBjG,GAAqBgG,GACxCE,EAAS,GAUb,GARIpB,GACFoB,EAAO9P,KAAKqK,EAASoF,IAAmB,GAGtCZ,GACFiB,EAAO9P,KAAKqK,EAASuF,IAAsB,EAAGvF,EAASwF,IAAqB,GAG1EC,EAAOC,OAAM,SAAUC,GACzB,OAAOA,KACL,CACFR,EAAwB1N,EACxByN,GAAqB,EACrB,MAGFF,EAAUpf,IAAI6R,EAAWgO,GAG3B,GAAIP,EAqBF,IAnBA,IAEIU,EAAQ,SAAeC,GACzB,IAAIC,EAAmBpO,EAAWrB,MAAK,SAAUoB,GAC/C,IAAIgO,EAAST,EAAUhf,IAAIyR,GAE3B,GAAIgO,EACF,OAAOA,EAAOzb,MAAM,EAAG6b,GAAIH,OAAM,SAAUC,GACzC,OAAOA,QAKb,GAAIG,EAEF,OADAX,EAAwBW,EACjB,SAIFD,EAnBYpC,EAAiB,EAAI,EAmBZoC,EAAK,GAGpB,UAFFD,EAAMC,GADmBA,KAOpCtN,EAAMd,YAAc0N,IACtB5M,EAAMqD,cAAc3W,GAAMkf,OAAQ,EAClC5L,EAAMd,UAAY0N,EAClB5M,EAAMwN,OAAQ,KAUhB/I,iBAAkB,CAAC,UACnBlX,KAAM,CACJqe,OAAO,IC7IX,SAAS6B,GAAehG,EAAUlS,EAAMmY,GAQtC,YAPyB,IAArBA,IACFA,EAAmB,CACjBzM,EAAG,EACHC,EAAG,IAIA,CACLzL,IAAKgS,EAAShS,IAAMF,EAAK8L,OAASqM,EAAiBxM,EACnDrC,MAAO4I,EAAS5I,MAAQtJ,EAAK4L,MAAQuM,EAAiBzM,EACtDrC,OAAQ6I,EAAS7I,OAASrJ,EAAK8L,OAASqM,EAAiBxM,EACzDvL,KAAM8R,EAAS9R,KAAOJ,EAAK4L,MAAQuM,EAAiBzM,GAIxD,SAAS0M,GAAsBlG,GAC7B,MAAO,CAAChS,GAAKoJ,GAAOD,GAAQjJ,IAAMiY,MAAK,SAAUC,GAC/C,OAAOpG,EAASoG,IAAS,KAiC7B,IAAAC,GAAe,CACbphB,KAAM,OACNoT,SAAS,EACTC,MAAO,OACP0E,iBAAkB,CAAC,mBACnB1X,GAlCF,SAAckJ,GACZ,IAAI+J,EAAQ/J,EAAK+J,MACbtT,EAAOuJ,EAAKvJ,KACZ8f,EAAgBxM,EAAM6D,MAAMlD,UAC5BkE,EAAa7E,EAAM6D,MAAMvD,OACzBoN,EAAmB1N,EAAMqD,cAAc0K,gBACvCC,EAAoB5E,GAAepJ,EAAO,CAC5C4J,eAAgB,cAEdqE,EAAoB7E,GAAepJ,EAAO,CAC5C8J,aAAa,IAEXoE,EAA2BT,GAAeO,EAAmBxB,GAC7D2B,EAAsBV,GAAeQ,EAAmBpJ,EAAY6I,GACpEU,EAAoBT,GAAsBO,GAC1CG,EAAmBV,GAAsBQ,GAC7CnO,EAAMqD,cAAc3W,GAAQ,CAC1BwhB,yBAA0BA,EAC1BC,oBAAqBA,EACrBC,kBAAmBA,EACnBC,iBAAkBA,GAEpBrO,EAAMhL,WAAWsL,OAAS7V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIH,EAAMhL,WAAWsL,QAAS,GAAI,CACtFgO,+BAAgCF,EAChCG,sBAAuBF,MCH3BG,GAAe,CACb9hB,KAAM,SACNoT,SAAS,EACTC,MAAO,OACPe,SAAU,CAAC,iBACX/T,GA5BF,SAAgBsJ,GACd,IAAI2J,EAAQ3J,EAAM2J,MACdO,EAAUlK,EAAMkK,QAChB7T,EAAO2J,EAAM3J,KACb+hB,EAAkBlO,EAAQjL,OAC1BA,OAA6B,IAApBmZ,EAA6B,CAAC,EAAG,GAAKA,EAC/ClhB,EAAO4R,GAAWH,QAAO,SAAUC,EAAKC,GAE1C,OADAD,EAAIC,GA5BD,SAAiCA,EAAW2E,EAAOvO,GACxD,IAAIgO,EAAgBvC,GAAiB7B,GACjCwP,EAAiB,CAAC/Y,GAAMF,IAAKiF,QAAQ4I,IAAkB,GAAK,EAAI,EAEhErN,EAAyB,mBAAXX,EAAwBA,EAAO7K,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI0D,GAAQ,GAAI,CAC3F3E,UAAWA,KACP5J,EACFqZ,EAAW1Y,EAAK,GAChB2Y,EAAW3Y,EAAK,GAIpB,OAFA0Y,EAAWA,GAAY,EACvBC,GAAYA,GAAY,GAAKF,EACtB,CAAC/Y,GAAMkJ,IAAOnE,QAAQ4I,IAAkB,EAAI,CACjDrC,EAAG2N,EACH1N,EAAGyN,GACD,CACF1N,EAAG0N,EACHzN,EAAG0N,GAWcC,CAAwB3P,EAAWc,EAAM6D,MAAOvO,GAC1D2J,IACN,IACC6P,EAAwBvhB,EAAKyS,EAAMd,WACnC+B,EAAI6N,EAAsB7N,EAC1BC,EAAI4N,EAAsB5N,EAEW,MAArClB,EAAMqD,cAAcD,gBACtBpD,EAAMqD,cAAcD,cAAcnC,GAAKA,EACvCjB,EAAMqD,cAAcD,cAAclC,GAAKA,GAGzClB,EAAMqD,cAAc3W,GAAQa,ICxB9BwhB,GAAe,CACbriB,KAAM,gBACNoT,SAAS,EACTC,MAAO,OACPhT,GApBF,SAAuBkJ,GACrB,IAAI+J,EAAQ/J,EAAK+J,MACbtT,EAAOuJ,EAAKvJ,KAKhBsT,EAAMqD,cAAc3W,GAAQqc,GAAe,CACzCpI,UAAWX,EAAM6D,MAAMlD,UACvBzY,QAAS8X,EAAM6D,MAAMvD,OACrBE,SAAU,WACVtB,UAAWc,EAAMd,aAUnB3R,KAAM,ICyFRyhB,GAAe,CACbtiB,KAAM,kBACNoT,SAAS,EACTC,MAAO,OACPhT,GAzGF,SAAyBkJ,GACvB,IAAI+J,EAAQ/J,EAAK+J,MACbO,EAAUtK,EAAKsK,QACf7T,EAAOuJ,EAAKvJ,KACZmf,EAAoBtL,EAAQ4I,SAC5B2C,OAAsC,IAAtBD,GAAsCA,EACtDE,EAAmBxL,EAAQyL,QAC3BC,OAAoC,IAArBF,GAAsCA,EACrDvC,EAAWjJ,EAAQiJ,SACnBE,EAAenJ,EAAQmJ,aACvBI,EAAcvJ,EAAQuJ,YACtBtG,EAAUjD,EAAQiD,QAClByL,EAAkB1O,EAAQ2O,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7CE,EAAwB5O,EAAQ6O,aAChCA,OAAyC,IAA1BD,EAAmC,EAAIA,EACtD1H,EAAW2B,GAAepJ,EAAO,CACnCwJ,SAAUA,EACVE,aAAcA,EACdlG,QAASA,EACTsG,YAAaA,IAEXxG,EAAgBvC,GAAiBf,EAAMd,WACvC8J,EAAYF,GAAa9I,EAAMd,WAC/BmQ,GAAmBrG,EACnBG,EAAW1G,GAAyBa,GACpC0I,ECpCY,MDoCS7C,ECpCH,IAAM,IDqCxB/F,EAAgBpD,EAAMqD,cAAcD,cACpCoJ,EAAgBxM,EAAM6D,MAAMlD,UAC5BkE,EAAa7E,EAAM6D,MAAMvD,OACzBgP,EAA4C,mBAAjBF,EAA8BA,EAAa3kB,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIH,EAAM6D,OAAQ,GAAI,CAC1H3E,UAAWc,EAAMd,aACbkQ,EACF7hB,EAAO,CACT0T,EAAG,EACHC,EAAG,GAGL,GAAKkC,EAAL,CAIA,GAAI0I,EAAe,CACjB,IAAIyD,EAAwB,MAAbpG,EAAmB1T,GAAME,GACpC6Z,EAAuB,MAAbrG,EAAmBvK,GAASC,GACtC5P,EAAmB,MAAbka,EAAmB,SAAW,QACpC7T,EAAS8N,EAAc+F,GACvBxG,EAAMS,EAAc+F,GAAY1B,EAAS8H,GACzC3M,EAAMQ,EAAc+F,GAAY1B,EAAS+H,GACzCC,EAAWP,GAAUrK,EAAW5V,GAAO,EAAI,EAC3CygB,EzCvDW,UyCuDF1G,EAAsBwD,EAAcvd,GAAO4V,EAAW5V,GAC/D0gB,EzCxDW,UyCwDF3G,GAAuBnE,EAAW5V,IAAQud,EAAcvd,GAGjEkU,EAAenD,EAAMC,SAASS,MAC9B+C,EAAYyL,GAAU/L,EAAenC,GAAcmC,GAAgB,CACrEhC,MAAO,EACPE,OAAQ,GAENuO,EAAqB5P,EAAMqD,cAAc,oBAAsBrD,EAAMqD,cAAc,oBAAoBG,QzBrEtG,CACL/N,IAAK,EACLoJ,MAAO,EACPD,OAAQ,EACRjJ,KAAM,GyBkEFka,EAAkBD,EAAmBL,GACrCO,EAAkBF,EAAmBJ,GAMrCO,EAAWrN,GAAO,EAAG8J,EAAcvd,GAAMwU,EAAUxU,IACnD+gB,EAAYX,EAAkB7C,EAAcvd,GAAO,EAAIwgB,EAAWM,EAAWF,EAAkBP,EAAoBI,EAASK,EAAWF,EAAkBP,EACzJW,EAAYZ,GAAmB7C,EAAcvd,GAAO,EAAIwgB,EAAWM,EAAWD,EAAkBR,EAAoBK,EAASI,EAAWD,EAAkBR,EAC1JvL,EAAoB/D,EAAMC,SAASS,OAASwB,GAAgBlC,EAAMC,SAASS,OAC3EwP,EAAenM,EAAiC,MAAboF,EAAmBpF,EAAkBwE,WAAa,EAAIxE,EAAkByE,YAAc,EAAI,EAC7H2H,EAAsBnQ,EAAMqD,cAAc/N,OAAS0K,EAAMqD,cAAc/N,OAAO0K,EAAMd,WAAWiK,GAAY,EAC3GiH,EAAYhN,EAAc+F,GAAY6G,EAAYG,EAAsBD,EACxEG,EAAYjN,EAAc+F,GAAY8G,EAAYE,EAClDG,EAAkB5N,GAAOwM,EAAStnB,KAAK+a,IAAIA,EAAKyN,GAAazN,EAAKrN,EAAQ4Z,EAAStnB,KAAKgb,IAAIA,EAAKyN,GAAazN,GAClHQ,EAAc+F,GAAYmH,EAC1B/iB,EAAK4b,GAAYmH,EAAkBhb,EAGrC,GAAI2W,EAAc,CAChB,IAAIsE,EAAyB,MAAbpH,EAAmB1T,GAAME,GAErC6a,EAAwB,MAAbrH,EAAmBvK,GAASC,GAEvC4R,EAAUrN,EAAc4I,GAMxB0E,EAAmBhO,GAJZ+N,EAAUhJ,EAAS8I,GAIME,EAFzBA,EAAUhJ,EAAS+I,IAI9BpN,EAAc4I,GAAW0E,EACzBnjB,EAAKye,GAAW0E,EAAmBD,EAGrCzQ,EAAMqD,cAAc3W,GAAQa,IAS5BkX,iBAAkB,CAAC,WE5GN,SAASkM,GAAiBC,EAAyB5O,EAAc6O,QAC9D,IAAZA,IACFA,GAAU,GAGZ,ICVoCrR,ECJOtX,EFcvCqE,EAAkBqV,GAAmBI,GACrCzM,EAAOC,GAAsBob,GAC7BE,EAA0BnR,GAAcqC,GACxCyE,EAAS,CACX7Q,WAAY,EACZF,UAAW,GAEToP,EAAU,CACZ7D,EAAG,EACHC,EAAG,GAkBL,OAfI4P,IAA4BA,IAA4BD,MACxB,SAA9BxR,GAAY2C,IAChBuF,GAAehb,MACbka,GCzBgCjH,EDyBTwC,KCxBdzC,GAAUC,IAAUG,GAAcH,GCJxC,CACL5J,YAFyC1N,EDQbsX,GCNR5J,WACpBF,UAAWxN,EAAQwN,WDGZyR,GAAgB3H,ID0BnBG,GAAcqC,KAChB8C,EAAUtP,GAAsBwM,IACxBf,GAAKe,EAAawG,WAC1B1D,EAAQ5D,GAAKc,EAAauG,WACjBhc,IACTuY,EAAQ7D,EAAIqG,GAAoB/a,KAI7B,CACL0U,EAAG1L,EAAKI,KAAO8Q,EAAO7Q,WAAakP,EAAQ7D,EAC3CC,EAAG3L,EAAKE,IAAMgR,EAAO/Q,UAAYoP,EAAQ5D,EACzCC,MAAO5L,EAAK4L,MACZE,OAAQ9L,EAAK8L,QG7BjB,IAAI0P,GAAkB,CACpB7R,UAAW,SACX8R,UAAW,GACXxQ,SAAU,YAGZ,SAASyQ,KACP,IAAK,IAAIC,EAAOC,UAAUjiB,OAAQ0C,EAAO,IAAIwf,MAAMF,GAAOG,EAAO,EAAGA,EAAOH,EAAMG,IAC/Ezf,EAAKyf,GAAQF,UAAUE,GAGzB,OAAQzf,EAAKgc,MAAK,SAAU1lB,GAC1B,QAASA,GAAoD,mBAAlCA,EAAQsN,0BAIhC,SAAS8b,GAAgBC,QACL,IAArBA,IACFA,EAAmB,IAGrB,IAAIC,EAAoBD,EACpBE,EAAwBD,EAAkBE,iBAC1CA,OAA6C,IAA1BD,EAAmC,GAAKA,EAC3DE,EAAyBH,EAAkBI,eAC3CA,OAA4C,IAA3BD,EAAoCZ,GAAkBY,EAC3E,OAAO,SAAsBhR,EAAWL,EAAQC,QAC9B,IAAZA,IACFA,EAAUqR,GAGZ,IC/C6B7kB,EAC3B8kB,ED8CE7R,EAAQ,CACVd,UAAW,SACX4S,iBAAkB,GAClBvR,QAAS9V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI4Q,IAAkBa,GAC3DvO,cAAe,GACfpD,SAAU,CACRU,UAAWA,EACXL,OAAQA,GAEVtL,WAAY,GACZkL,OAAQ,IAEN6R,EAAmB,GACnBC,GAAc,EACdnkB,EAAW,CACbmS,MAAOA,EACPiS,WAAY,SAAoB1R,GAC9B2R,IACAlS,EAAMO,QAAU9V,OAAO0V,OAAO1V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAIyR,GAAiB5R,EAAMO,SAAUA,GAC/FP,EAAM4G,cAAgB,CACpBjG,UAAWjX,GAAUiX,GAAaiH,GAAkBjH,GAAaA,EAAU+J,eAAiB9C,GAAkBjH,EAAU+J,gBAAkB,GAC1IpK,OAAQsH,GAAkBtH,IAI5B,IExE4B0Q,EAC9BmB,EFuEML,EGtCG,SAAwBd,GAErC,IAAIc,EAlCN,SAAed,GACb,IAAIoB,EAAM,IAAI1F,IACV2F,EAAU,IAAI9jB,IACd+jB,EAAS,GA0Bb,OAzBAtB,EAAUrmB,SAAQ,SAAU4nB,GAC1BH,EAAI/kB,IAAIklB,EAAS7lB,KAAM6lB,MAkBzBvB,EAAUrmB,SAAQ,SAAU4nB,GACrBF,EAAQziB,IAAI2iB,EAAS7lB,OAhB5B,SAAS8e,EAAK+G,GACZF,EAAQ9X,IAAIgY,EAAS7lB,MACN,GAAGwJ,OAAOqc,EAASzR,UAAY,GAAIyR,EAAS9N,kBAAoB,IACtE9Z,SAAQ,SAAU6nB,GACzB,IAAKH,EAAQziB,IAAI4iB,GAAM,CACrB,IAAIC,EAAcL,EAAI3kB,IAAI+kB,GAEtBC,GACFjH,EAAKiH,OAIXH,EAAOlV,KAAKmV,GAMV/G,CAAK+G,MAGFD,EAKgBI,CAAM1B,GAE7B,OAAO5R,GAAeJ,QAAO,SAAUC,EAAKc,GAC1C,OAAOd,EAAI/I,OAAO4b,EAAiB5c,QAAO,SAAUqd,GAClD,OAAOA,EAASxS,QAAUA,QAE3B,IH8B0B4S,EExEK3B,EFwEsB,GAAG9a,OAAOwb,EAAkB1R,EAAMO,QAAQyQ,WEvE9FmB,EAASnB,EAAUhS,QAAO,SAAUmT,EAAQS,GAC9C,IAAIC,EAAWV,EAAOS,EAAQlmB,MAK9B,OAJAylB,EAAOS,EAAQlmB,MAAQmmB,EAAWpoB,OAAO0V,OAAO1V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI0S,GAAWD,GAAU,GAAI,CACvGrS,QAAS9V,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI0S,EAAStS,SAAUqS,EAAQrS,SACpEhT,KAAM9C,OAAO0V,OAAO1V,OAAO0V,OAAO,GAAI0S,EAAStlB,MAAOqlB,EAAQrlB,QAC3DqlB,EACET,IACN,IAEI1nB,OAAOC,KAAKynB,GAAQC,KAAI,SAAU9kB,GACvC,OAAO6kB,EAAO7kB,QFsGV,OAvCA0S,EAAM8R,iBAAmBA,EAAiB5c,QAAO,SAAU4d,GACzD,OAAOA,EAAEhT,WAqJbE,EAAM8R,iBAAiBnnB,SAAQ,SAAUsa,GACvC,IAAIvY,EAAOuY,EAAMvY,KACbqmB,EAAgB9N,EAAM1E,QACtBA,OAA4B,IAAlBwS,EAA2B,GAAKA,EAC1C3S,EAAS6E,EAAM7E,OAEnB,GAAsB,mBAAXA,EAAuB,CAChC,IAAI4S,EAAY5S,EAAO,CACrBJ,MAAOA,EACPtT,KAAMA,EACNmB,SAAUA,EACV0S,QAASA,IAKXwR,EAAiB3U,KAAK4V,GAFT,kBA7HRnlB,EAASiZ,UAOlBmM,YAAa,WACX,IAAIjB,EAAJ,CAIA,IAAIkB,EAAkBlT,EAAMC,SACxBU,EAAYuS,EAAgBvS,UAC5BL,EAAS4S,EAAgB5S,OAG7B,GAAK2Q,GAAiBtQ,EAAWL,GAAjC,CASAN,EAAM6D,MAAQ,CACZlD,UAAWgQ,GAAiBhQ,EAAWuB,GAAgB5B,GAAoC,UAA3BN,EAAMO,QAAQC,UAC9EF,OAAQU,GAAcV,IAOxBN,EAAMwN,OAAQ,EACdxN,EAAMd,UAAYc,EAAMO,QAAQrB,UAKhCc,EAAM8R,iBAAiBnnB,SAAQ,SAAU4nB,GACvC,OAAOvS,EAAMqD,cAAckP,EAAS7lB,MAAQjC,OAAO0V,OAAO,GAAIoS,EAAShlB,SAIzE,IAAK,IAAI2L,EAAQ,EAAGA,EAAQ8G,EAAM8R,iBAAiB5iB,OAAQgK,IAUzD,IAAoB,IAAhB8G,EAAMwN,MAAV,CAMA,IAAI2F,EAAwBnT,EAAM8R,iBAAiB5Y,GAC/CnM,EAAKomB,EAAsBpmB,GAC3BqmB,EAAyBD,EAAsB5S,QAC/C8I,OAAsC,IAA3B+J,EAAoC,GAAKA,EACpD1mB,EAAOymB,EAAsBzmB,KAEf,mBAAPK,IACTiT,EAAQjT,EAAG,CACTiT,MAAOA,EACPO,QAAS8I,EACT3c,KAAMA,EACNmB,SAAUA,KACNmS,QAjBNA,EAAMwN,OAAQ,EACdtU,GAAS,KAsBf4N,QCjM2B/Z,EDiMV,WACf,OAAO,IAAIsmB,SAAQ,SAAUC,GAC3BzlB,EAASolB,cACTK,EAAQtT,OClMT,WAUL,OATK6R,IACHA,EAAU,IAAIwB,SAAQ,SAAUC,GAC9BD,QAAQC,UAAUC,MAAK,WACrB1B,OAAU2B,EACVF,EAAQvmB,YAKP8kB,ID2LL4B,QAAS,WACPvB,IACAF,GAAc,IAIlB,IAAKf,GAAiBtQ,EAAWL,GAK/B,OAAOzS,EAmCT,SAASqkB,IACPH,EAAiBpnB,SAAQ,SAAUoC,GACjC,OAAOA,OAETglB,EAAmB,GAGrB,OAvCAlkB,EAASokB,WAAW1R,GAASgT,MAAK,SAAUvT,IACrCgS,GAAezR,EAAQmT,eAC1BnT,EAAQmT,cAAc1T,MAqCnBnS,GAGJ,IAAI8lB,GAA4BrC,KIzPnCqC,GAA4BrC,GAAgB,CAC9CI,iBAFqB,CAACnL,GAAgBnD,GAAewQ,GAAeC,MCMlEF,GAA4BrC,GAAgB,CAC9CI,iBAFqB,CAACnL,GAAgBnD,GAAewQ,GAAeC,GAAave,GAAQwe,GAAM/F,GAAiBrN,GAAOlD,2KnDNvG,+BAEC,YACF,sBACY,2BACP,kBACF,mBACG,4DAQC,kBACN,iBACK,uBAEC,kBACN,iBACK,wBAEE,oBACN,mBACK,0JoDalBuW,GAAiB,IAAI3oB,OAAU4oB,4BAwB/BC,GAAgB3nB,EAAQ,UAAY,YACpC4nB,GAAmB5nB,EAAQ,YAAc,UACzC6nB,GAAmB7nB,EAAQ,aAAe,eAC1C8nB,GAAsB9nB,EAAQ,eAAiB,aAC/C+nB,GAAkB/nB,EAAQ,aAAe,cACzCgoB,GAAiBhoB,EAAQ,cAAgB,aAEzCqK,GAAU,CACdrB,OAAQ,CAAC,EAAG,GACZwe,MAAM,EACNtK,SAAU,kBACV7I,UAAW,SACX9U,QAAS,UACT0oB,aAAc,MAGVrd,GAAc,CAClB5B,OAAQ,0BACRwe,KAAM,UACNtK,SAAU,mBACV7I,UAAW,0BACX9U,QAAS,SACT0oB,aAAc,0BASVC,GAAAA,SAAAA,GACJ,SAAAA,EAAYtsB,EAASqC,GAAQ,IAAAmJ,EAAA,OAC3BA,EAAA0D,EAAAnM,KAAAoF,KAAMnI,IAANmI,MAEKokB,QAAU,KACf/gB,EAAKmE,QAAUnE,EAAKoE,WAAWvN,GAC/BmJ,EAAKghB,MAAQhhB,EAAKihB,kBAClBjhB,EAAKkhB,UAAYlhB,EAAKmhB,gBAEtBnhB,EAAK2E,qBARsB3E,oCA2B7BU,OAAA,WACE,IAAI/D,KAAKwC,SAASiiB,WAAYzkB,KAAKwC,SAASc,UAAUE,SAzE9B,YAyExB,CAIA,IAAMkhB,EAAW1kB,KAAKwC,SAASc,UAAUE,SA5ErB,QA8EpB2gB,EAASQ,aAELD,GAIJ1kB,KAAKoN,WAGPA,KAAA,WACE,KAAIpN,KAAKwC,SAASiiB,UAAYzkB,KAAKwC,SAASc,UAAUE,SAzF9B,aAyF+DxD,KAAKqkB,MAAM/gB,UAAUE,SAxFxF,SAwFpB,CAIA,IAAM6I,EAAS8X,EAASS,qBAAqB5kB,KAAKwC,UAC5CqI,EAAgB,CACpBA,cAAe7K,KAAKwC,UAKtB,IAFkBtC,EAAaoB,QAAQtB,KAAKwC,SAzGhC,mBAyGsDqI,GAEpDjJ,iBAAd,CAKA,GAAI5B,KAAKukB,UACPjgB,EAAYC,iBAAiBvE,KAAKqkB,MAAO,SAAU,YAC9C,CACL,QAAsB,IAAXQ,GACT,MAAM,IAAI5pB,UAAU,gEAGtB,IAAI0e,EAAmB3Z,KAAKwC,SAEG,WAA3BxC,KAAKwH,QAAQ8I,UACfqJ,EAAmBtN,EACVhT,EAAU2G,KAAKwH,QAAQ8I,YAChCqJ,EAAmB3Z,KAAKwH,QAAQ8I,eAGa,IAAlCtQ,KAAKwH,QAAQ8I,UAAUpC,SAChCyL,EAAmB3Z,KAAKwH,QAAQ8I,UAAU,KAED,iBAA3BtQ,KAAKwH,QAAQ8I,YAC7BqJ,EAAmB3Z,KAAKwH,QAAQ8I,WAGlC,IAAM4T,EAAelkB,KAAK8kB,mBACpBC,EAAkBb,EAAavD,UAAUlT,MAAK,SAAAyU,GAAQ,MAAsB,gBAAlBA,EAAS7lB,OAA+C,IAArB6lB,EAASzS,WAE5GzP,KAAKokB,QAAUS,GAAoBlL,EAAkB3Z,KAAKqkB,MAAOH,GAE7Da,GACFzgB,EAAYC,iBAAiBvE,KAAKqkB,MAAO,SAAU,UASf,IAAAze,EADpC,iBAAkBlO,SAASwE,kBAC5BmQ,EAAOjJ,QApIc,iBAqItBwC,EAAA,IAAGC,OAAHxF,MAAAuF,EAAalO,SAASqE,KAAKkK,UACxB3L,SAAQ,SAAAqS,GAAI,OAAIzM,EAAaQ,GAAGiM,EAAM,YAAa,M9DnBzC,kB8DsBf3M,KAAKwC,SAASwiB,QACdhlB,KAAKwC,SAASwB,aAAa,iBAAiB,GAE5ChE,KAAKqkB,MAAM/gB,UAAUS,OArJD,QAsJpB/D,KAAKwC,SAASc,UAAUS,OAtJJ,QAuJpB7D,EAAaoB,QAAQtB,KAAKwC,SA9Jb,oBA8JoCqI,QAGnDsC,KAAA,WACE,IAAInN,KAAKwC,SAASiiB,WAAYzkB,KAAKwC,SAASc,UAAUE,SA5J9B,aA4JgExD,KAAKqkB,MAAM/gB,UAAUE,SA3JzF,QA2JpB,CAIA,IAAMqH,EAAgB,CACpBA,cAAe7K,KAAKwC,UAGJtC,EAAaoB,QAAQtB,KAAKwC,SA7KhC,mBA6KsDqI,GAEpDjJ,mBAIV5B,KAAKokB,SACPpkB,KAAKokB,QAAQhB,UAGfpjB,KAAKqkB,MAAM/gB,UAAUS,OA7KD,QA8KpB/D,KAAKwC,SAASc,UAAUS,OA9KJ,QA+KpBO,EAAYE,oBAAoBxE,KAAKqkB,MAAO,UAC5CnkB,EAAaoB,QAAQtB,KAAKwC,SAzLZ,qBAyLoCqI,QAGpDlI,QAAA,WACEoE,EAAAhB,UAAMpD,QAAN/H,KAAAoF,MACAE,EAAaC,IAAIH,KAAKwC,SA3MX,gBA4MXxC,KAAKqkB,MAAQ,KAETrkB,KAAKokB,UACPpkB,KAAKokB,QAAQhB,UACbpjB,KAAKokB,QAAU,SAInB3N,OAAA,WACEzW,KAAKukB,UAAYvkB,KAAKwkB,gBAClBxkB,KAAKokB,SACPpkB,KAAKokB,QAAQ3N,YAMjBzO,mBAAA,WAAqB,IAAAc,EAAA9I,KACnBE,EAAaQ,GAAGV,KAAKwC,SA9MR,qBA8M+B,SAAA1D,GAC1CA,EAAMwD,iBACNxD,EAAMmmB,kBACNnc,EAAK/E,eAIT0D,WAAA,SAAWvN,GAST,GARAA,EAAMgP,EAAA,GACDlJ,KAAKyC,YAAY6D,QACjBhC,EAAYI,kBAAkB1E,KAAKwC,UACnCtI,GAGLF,EA9OS,WA8OaE,EAAQ8F,KAAKyC,YAAYoE,aAEf,iBAArB3M,EAAOoW,YAA2BjX,EAAUa,EAAOoW,YACV,mBAA3CpW,EAAOoW,UAAUnL,sBAGxB,MAAM,IAAIlK,UApPH,WAoPqBC,cAAtB,kGAGR,OAAOhB,KAGToqB,gBAAA,WACE,OvD1QmB,SA4ChBzsB,EAASC,GAGZ,IAFA,IAAImQ,EAAOpQ,EAAQqtB,mBAEZjd,GAAM,CACX,GAAIA,EAAK9B,QAAQrO,GACf,MAAO,CAACmQ,GAGVA,EAAOA,EAAKid,mBAGd,MAAO,GuDmNAvf,CAAoB3F,KAAKwC,SA3Nd,kBA2NuC,MAG3D2iB,cAAA,WACE,IAAMC,EAAiBplB,KAAKwC,SAASnH,WAErC,GAAI+pB,EAAe9hB,UAAUE,SAvON,WAwOrB,OAAOwgB,GAGT,GAAIoB,EAAe9hB,UAAUE,SA1OJ,aA2OvB,OAAOygB,GAIT,IAAMoB,EAAkF,QAA1E1sB,iBAAiBqH,KAAKqkB,OAAOiB,iBAAiB,iBAAiBltB,OAE7E,OAAIgtB,EAAe9hB,UAAUE,SAnPP,UAoPb6hB,EAAQxB,GAAmBD,GAG7ByB,EAAQtB,GAAsBD,MAGvCU,cAAA,WACE,OAA0D,OAAnDxkB,KAAKwC,SAASY,QAAd,cAGTmiB,WAAA,WAAa,IAAAjc,EAAAtJ,KACHiF,EAAWjF,KAAKwH,QAAhBvC,OAER,MAAsB,iBAAXA,EACFA,EAAO9M,MAAM,KAAK4pB,KAAI,SAAA7d,GAAG,OAAInL,OAAOsS,SAASnH,EAAK,OAGrC,mBAAXe,EACF,SAAAugB,GAAU,OAAIvgB,EAAOugB,EAAYlc,EAAK9G,WAGxCyC,KAGT6f,iBAAA,WACE,IAAMW,EAAwB,CAC5B5W,UAAW7O,KAAKmlB,gBAChBxE,UAAW,CAAC,CACVtkB,KAAM,kBACN6T,QAAS,CACPuJ,YAAazZ,KAAKwH,QAAQic,KAC1BtK,SAAUnZ,KAAKwH,QAAQ2R,WAG3B,CACE9c,KAAM,SACN6T,QAAS,CACPjL,OAAQjF,KAAKulB,iBAanB,MAP6B,WAAzBvlB,KAAKwH,QAAQhM,UACfiqB,EAAsB9E,UAAY,CAAC,CACjCtkB,KAAM,cACNoT,SAAS,KAIbvG,EAAA,GACKuc,EACsC,mBAA9BzlB,KAAKwH,QAAQ0c,aAA8BlkB,KAAKwH,QAAQ0c,aAAauB,GAAyBzlB,KAAKwH,QAAQ0c,iBAMnHwB,kBAAP,SAAyB7tB,EAASqC,GAChC,IAAIgD,EAAOK,EAAa1F,EAvUX,eA8Ub,GAJKqF,IACHA,EAAO,IAAIinB,EAAStsB,EAHY,iBAAXqC,EAAsBA,EAAS,OAMhC,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,SAIFyC,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACfwgB,EAASuB,kBAAkB1lB,KAAM9F,SAI9ByqB,WAAP,SAAkB7lB,GAChB,IAAIA,GArVmB,IAqVTA,EAAMuF,SAAiD,UAAfvF,EAAMsB,MAxVhD,QAwVoEtB,EAAM7B,KAMtF,IAFA,IAAM0oB,EAAUhgB,EArUS,+BAuUhBhH,EAAI,EAAGC,EAAM+mB,EAAQ9mB,OAAQF,EAAIC,EAAKD,IAAK,CAClD,IAAMinB,EAAUroB,EAAaooB,EAAQhnB,GArW1B,eAsWLkM,EAAgB,CACpBA,cAAe8a,EAAQhnB,IAOzB,GAJIG,GAAwB,UAAfA,EAAMsB,OACjByK,EAAcgb,WAAa/mB,GAGxB8mB,EAAL,CAIA,IAmBgD5f,EAnB1C8f,EAAeF,EAAQvB,MAC7B,GAAKsB,EAAQhnB,GAAG2E,UAAUE,SA5VR,WAgWd1E,IAA0B,UAAfA,EAAMsB,MACjB,kBAAkBpF,KAAK8D,EAAMiB,OAAOqK,UACpB,UAAftL,EAAMsB,MAnXD,QAmXqBtB,EAAM7B,MACjC6oB,EAAatiB,SAAS1E,EAAMiB,SAIdG,EAAaoB,QAAQqkB,EAAQhnB,GAjXrC,mBAiXqDkM,GACjDjJ,kBAMV,iBAAkBlK,SAASwE,kBAC7B8J,EAAA,IAAGH,OAAHxF,MAAA2F,EAAatO,SAASqE,KAAKkK,UACxB3L,SAAQ,SAAAqS,GAAI,OAAIzM,EAAaC,IAAIwM,EAAM,YAAa,M9DpP5C,kB8DuPbgZ,EAAQhnB,GAAGqF,aAAa,gBAAiB,SAErC4hB,EAAQxB,SACVwB,EAAQxB,QAAQhB,UAGlB0C,EAAaxiB,UAAUC,OAzXL,QA0XlBoiB,EAAQhnB,GAAG2E,UAAUC,OA1XH,QA2XlBe,EAAYE,oBAAoBshB,EAAc,UAC9C5lB,EAAaoB,QAAQqkB,EAAQhnB,GArYjB,qBAqYmCkM,QAI5C+Z,qBAAP,SAA4B/sB,GAC1B,OAAOU,EAAuBV,IAAYA,EAAQwD,cAG7C0qB,sBAAP,SAA6BjnB,GAQ3B,KAAI,kBAAkB9D,KAAK8D,EAAMiB,OAAOqK,SA9Z1B,UA+ZZtL,EAAM7B,KAhaO,WAgae6B,EAAM7B,MA5ZjB,cA6Zf6B,EAAM7B,KA9ZO,YA8ZmB6B,EAAM7B,KACtC6B,EAAMiB,OAAOqD,QAvYC,oBAwYfsgB,GAAe1oB,KAAK8D,EAAM7B,QAI7B6B,EAAMwD,iBACNxD,EAAMmmB,mBAEFjlB,KAAKykB,WAAYzkB,KAAKsD,UAAUE,SAxZZ,aAwZxB,CAIA,IAAM6I,EAAS8X,EAASS,qBAAqB5kB,MACvC0kB,EAAW1kB,KAAKsD,UAAUE,SA5ZZ,QA8ZpB,GAjbe,WAibX1E,EAAM7B,IAIR,OAHe+C,KAAKmG,QAzZG,+BAyZ6BnG,KAAO2F,EAAoB3F,KAzZxD,+BAyZoF,IACpGglB,aACPb,EAASQ,aAIX,GAAKD,GArbY,YAqbC5lB,EAAM7B,KApbL,cAob6B6B,EAAM7B,IAMtD,GAAKynB,GA7bS,UA6bG5lB,EAAM7B,IAAvB,CAKA,IAAM+oB,EAAQrgB,EAtaa,8DAsa+B0G,GAAQxH,OAAO1J,GAEzE,GAAK6qB,EAAMnnB,OAAX,CAIA,IAAIgK,EAAQmd,EAAM3b,QAAQvL,EAAMiB,QAtcf,YAycbjB,EAAM7B,KAAwB4L,EAAQ,GACxCA,IAzciB,cA6cf/J,EAAM7B,KAA0B4L,EAAQmd,EAAMnnB,OAAS,GACzDgK,IAMFmd,EAFAnd,GAAmB,IAAXA,EAAe,EAAIA,GAEdmc,cAzBXb,EAASQ,kBANM3kB,KAAKmG,QAhaG,+BAga6BnG,KAAO2F,EAAoB3F,KAhaxD,+BAgaoF,IACpGimB,uCA9WX,WACE,OAAO3f,4BAGT,WACE,OAAOO,yBAGT,WACE,MAzFa,oBAkEXsd,CAAiB5hB,GAoavBrC,EAAaQ,GAAGhJ,SAndY,+BAUC,8BAyc2CysB,GAAS4B,uBACjF7lB,EAAaQ,GAAGhJ,SApdY,+BAYN,iBAwc2CysB,GAAS4B,uBAC1E7lB,EAAaQ,GAAGhJ,SAtdU,6BAsdsBysB,GAASQ,YACzDzkB,EAAaQ,GAAGhJ,SArdU,6BAqdsBysB,GAASQ,YACzDzkB,EAAaQ,GAAGhJ,SAxdU,6BAWG,+BA6cyC,SAAUoH,GAC9EA,EAAMwD,iBACNxD,EAAMmmB,kBACNd,GAASuB,kBAAkB1lB,KAAM,aAEnCE,EAAaQ,GAAGhJ,SA7dU,6BAYE,kBAidyC,SAAAuS,GAAC,OAAIA,EAAEgb,qBAS5E7oB,EAzfa,WAyfY+nB,IC1fzB,IAMM7d,GAAU,CACd4f,UAAU,EACV1f,UAAU,EACVwe,OAAO,GAGHne,GAAc,CAClBqf,SAAU,mBACV1f,SAAU,UACVwe,MAAO,WAoCHmB,GAAAA,SAAAA,GACJ,SAAAA,EAAYtuB,EAASqC,GAAQ,IAAAmJ,EAAA,OAC3BA,EAAA0D,EAAAnM,KAAAoF,KAAMnI,IAANmI,MAEKwH,QAAUnE,EAAKoE,WAAWvN,GAC/BmJ,EAAK+iB,QAAUzgB,EAlBK,gBAkBmC9N,GACvDwL,EAAKgjB,UAAY,KACjBhjB,EAAKijB,UAAW,EAChBjjB,EAAKkjB,oBAAqB,EAC1BljB,EAAKmjB,sBAAuB,EAC5BnjB,EAAKkJ,kBAAmB,EACxBlJ,EAAKojB,gBAAkB,EAVIpjB,oCAyB7BU,OAAA,SAAO8G,GACL,OAAO7K,KAAKsmB,SAAWtmB,KAAKmN,OAASnN,KAAKoN,KAAKvC,MAGjDuC,KAAA,SAAKvC,GAAe,IAAA/B,EAAA9I,KAClB,IAAIA,KAAKsmB,WAAYtmB,KAAKuM,iBAA1B,CAIIvM,KAAKwC,SAASc,UAAUE,SApDR,UAqDlBxD,KAAKuM,kBAAmB,GAG1B,IAAMma,EAAYxmB,EAAaoB,QAAQtB,KAAKwC,SArEhC,gBAqEsD,CAChEqI,cAAAA,IAGE7K,KAAKsmB,UAAYI,EAAU9kB,mBAI/B5B,KAAKsmB,UAAW,EAEhBtmB,KAAK2mB,kBACL3mB,KAAK4mB,gBAEL5mB,KAAK6mB,gBAEL7mB,KAAK8mB,kBACL9mB,KAAK+mB,kBAEL7mB,EAAaQ,GAAGV,KAAKwC,SAnFA,yBAgBK,6BAmEiD,SAAA1D,GAAK,OAAIgK,EAAKqE,KAAKrO,MAE9FoB,EAAaQ,GAAGV,KAAKomB,QAlFI,8BAkF8B,WACrDlmB,EAAaS,IAAImI,EAAKtG,SApFD,4BAoFkC,SAAA1D,GACjDA,EAAMiB,SAAW+I,EAAKtG,WACxBsG,EAAK0d,sBAAuB,SAKlCxmB,KAAKgnB,eAAc,WAAA,OAAMle,EAAKme,aAAapc,WAG7CsC,KAAA,SAAKrO,GAAO,IAAAwK,EAAAtJ,KAKV,GAJIlB,GACFA,EAAMwD,iBAGHtC,KAAKsmB,WAAYtmB,KAAKuM,mBAITrM,EAAaoB,QAAQtB,KAAKwC,SAhHhC,iBAkHEZ,iBAAd,CAIA5B,KAAKsmB,UAAW,EAChB,IAAMY,EAAalnB,KAAKwC,SAASc,UAAUE,SAvGvB,QAuHpB,GAdI0jB,IACFlnB,KAAKuM,kBAAmB,GAG1BvM,KAAK8mB,kBACL9mB,KAAK+mB,kBAEL7mB,EAAaC,IAAIzI,SA3HF,oBA6HfsI,KAAKwC,SAASc,UAAUC,OAjHJ,QAmHpBrD,EAAaC,IAAIH,KAAKwC,SA7HD,0BA8HrBtC,EAAaC,IAAIH,KAAKomB,QA3HG,8BA6HrBc,EAAY,CACd,IAAMtuB,EAAqBJ,EAAiCwH,KAAKwC,UAEjEtC,EAAaS,IAAIX,KAAKwC,SAAU,iBAAiB,SAAA1D,GAAK,OAAIwK,EAAK6d,WAAWroB,MAC1EtF,EAAqBwG,KAAKwC,SAAU5J,QAEpCoH,KAAKmnB,iBAITxkB,QAAA,WACE,CAACjK,OAAQsH,KAAKwC,SAAUxC,KAAKomB,SAC1B9rB,SAAQ,SAAA8sB,GAAW,OAAIlnB,EAAaC,IAAIinB,EAnKhC,gBAqKXrgB,EAAAhB,UAAMpD,QAAN/H,KAAAoF,MAOAE,EAAaC,IAAIzI,SAvJF,oBAyJfsI,KAAKwH,QAAU,KACfxH,KAAKomB,QAAU,KACfpmB,KAAKqmB,UAAY,KACjBrmB,KAAKsmB,SAAW,KAChBtmB,KAAKumB,mBAAqB,KAC1BvmB,KAAKwmB,qBAAuB,KAC5BxmB,KAAKuM,iBAAmB,KACxBvM,KAAKymB,gBAAkB,QAGzBY,aAAA,WACErnB,KAAK6mB,mBAKPpf,WAAA,SAAWvN,GAMT,OALAA,EAAMgP,EAAA,GACD5C,GACApM,GAELF,EArMS,QAqMaE,EAAQ2M,IACvB3M,KAGT+sB,aAAA,SAAapc,GAAe,IAAApB,EAAAzJ,KACpBknB,EAAalnB,KAAKwC,SAASc,UAAUE,SAxKvB,QAyKd8jB,EAAY3hB,EApKM,cAoKsC3F,KAAKomB,SAE9DpmB,KAAKwC,SAASnH,YAAc2E,KAAKwC,SAASnH,WAAW9B,WAAaguB,KAAKC,cAE1E9vB,SAASqE,KAAK0rB,YAAYznB,KAAKwC,UAGjCxC,KAAKwC,SAASpH,MAAMI,QAAU,QAC9BwE,KAAKwC,SAASiC,gBAAgB,eAC9BzE,KAAKwC,SAASwB,aAAa,cAAc,GACzChE,KAAKwC,SAASwB,aAAa,OAAQ,UACnChE,KAAKwC,SAAS6C,UAAY,EAEtBiiB,IACFA,EAAUjiB,UAAY,GAGpB6hB,GACFvrB,EAAOqE,KAAKwC,UAGdxC,KAAKwC,SAASc,UAAU4G,IA7LJ,QA+LhBlK,KAAKwH,QAAQwd,OACfhlB,KAAK0nB,gBAGP,IAAMC,EAAqB,WACrBle,EAAKjC,QAAQwd,OACfvb,EAAKjH,SAASwiB,QAGhBvb,EAAK8C,kBAAmB,EACxBrM,EAAaoB,QAAQmI,EAAKjH,SAtNf,iBAsNsC,CAC/CqI,cAAAA,KAIJ,GAAIqc,EAAY,CACd,IAAMtuB,EAAqBJ,EAAiCwH,KAAKomB,SAEjElmB,EAAaS,IAAIX,KAAKomB,QAAS,gBAAiBuB,GAChDnuB,EAAqBwG,KAAKomB,QAASxtB,QAEnC+uB,OAIJD,cAAA,WAAgB,IAAAlc,EAAAxL,KACdE,EAAaC,IAAIzI,SArOF,oBAsOfwI,EAAaQ,GAAGhJ,SAtOD,oBAsO0B,SAAAoH,GACnCpH,WAAaoH,EAAMiB,QACnByL,EAAKhJ,WAAa1D,EAAMiB,QACvByL,EAAKhJ,SAASgB,SAAS1E,EAAMiB,SAChCyL,EAAKhJ,SAASwiB,cAKpB8B,gBAAA,WAAkB,IAAAc,EAAA5nB,KACZA,KAAKsmB,SACPpmB,EAAaQ,GAAGV,KAAKwC,SA9OA,4BA8OiC,SAAA1D,GAChD8oB,EAAKpgB,QAAQhB,UArQN,WAqQkB1H,EAAM7B,KACjC6B,EAAMwD,iBACNslB,EAAKza,QACKya,EAAKpgB,QAAQhB,UAxQd,WAwQ0B1H,EAAM7B,KACzC2qB,EAAKC,gCAIT3nB,EAAaC,IAAIH,KAAKwC,SAvPD,+BA2PzBukB,gBAAA,WAAkB,IAAAe,EAAA9nB,KACZA,KAAKsmB,SACPpmB,EAAaQ,GAAGhI,OA/PJ,mBA+P0B,WAAA,OAAMovB,EAAKjB,mBAEjD3mB,EAAaC,IAAIzH,OAjQL,sBAqQhByuB,WAAA,WAAa,IAAAY,EAAA/nB,KACXA,KAAKwC,SAASpH,MAAMI,QAAU,OAC9BwE,KAAKwC,SAASwB,aAAa,eAAe,GAC1ChE,KAAKwC,SAASiC,gBAAgB,cAC9BzE,KAAKwC,SAASiC,gBAAgB,QAC9BzE,KAAKuM,kBAAmB,EACxBvM,KAAKgnB,eAAc,WACjBtvB,SAASqE,KAAKuH,UAAUC,OAnQN,cAoQlBwkB,EAAKC,oBACLD,EAAKE,kBACL/nB,EAAaoB,QAAQymB,EAAKvlB,SAnRd,yBAuRhB0lB,gBAAA,WACEloB,KAAKqmB,UAAUhrB,WAAWqI,YAAY1D,KAAKqmB,WAC3CrmB,KAAKqmB,UAAY,QAGnBW,cAAA,SAAczqB,GAAU,IAAA4rB,EAAAnoB,KAChBooB,EAAUpoB,KAAKwC,SAASc,UAAUE,SA/QpB,QAAA,OAiRlB,GAEF,GAAIxD,KAAKsmB,UAAYtmB,KAAKwH,QAAQ0e,SAAU,CAiC1C,GAhCAlmB,KAAKqmB,UAAY3uB,SAAS2wB,cAAc,OACxCroB,KAAKqmB,UAAUiC,UAvRO,iBAyRlBF,GACFpoB,KAAKqmB,UAAU/iB,UAAU4G,IAAIke,GAG/B1wB,SAASqE,KAAK0rB,YAAYznB,KAAKqmB,WAE/BnmB,EAAaQ,GAAGV,KAAKwC,SAtSF,0BAsSiC,SAAA1D,GAC9CqpB,EAAK3B,qBACP2B,EAAK3B,sBAAuB,EAI1B1nB,EAAMiB,SAAWjB,EAAMypB,gBAIG,WAA1BJ,EAAK3gB,QAAQ0e,SACfiC,EAAKN,6BAELM,EAAKhb,WAILib,GACFzsB,EAAOqE,KAAKqmB,WAGdrmB,KAAKqmB,UAAU/iB,UAAU4G,IAjTP,SAmTbke,EAEH,YADA7rB,IAIF,IAAMisB,EAA6BhwB,EAAiCwH,KAAKqmB,WAEzEnmB,EAAaS,IAAIX,KAAKqmB,UAAW,gBAAiB9pB,GAClD/C,EAAqBwG,KAAKqmB,UAAWmC,QAChC,IAAKxoB,KAAKsmB,UAAYtmB,KAAKqmB,UAAW,CAC3CrmB,KAAKqmB,UAAU/iB,UAAUC,OA7TP,QA+TlB,IAAMklB,EAAiB,WACrBN,EAAKD,kBACL3rB,KAGF,GAAIyD,KAAKwC,SAASc,UAAUE,SArUV,QAqUqC,CACrD,IAAMglB,EAA6BhwB,EAAiCwH,KAAKqmB,WACzEnmB,EAAaS,IAAIX,KAAKqmB,UAAW,gBAAiBoC,GAClDjvB,EAAqBwG,KAAKqmB,UAAWmC,QAErCC,SAGFlsB,OAIJsrB,2BAAA,WAA6B,IAAAa,EAAA1oB,KAE3B,IADkBE,EAAaoB,QAAQtB,KAAKwC,SAjWtB,0BAkWRZ,iBAAd,CAIA,IAAM+mB,EAAqB3oB,KAAKwC,SAAS+V,aAAe7gB,SAASwE,gBAAgB0X,aAE5E+U,IACH3oB,KAAKwC,SAASpH,MAAMkc,UAAY,UAGlCtX,KAAKwC,SAASc,UAAU4G,IA3VF,gBA4VtB,IAAM0e,EAA0BpwB,EAAiCwH,KAAKomB,SACtElmB,EAAaC,IAAIH,KAAKwC,SAAU,iBAChCtC,EAAaS,IAAIX,KAAKwC,SAAU,iBAAiB,WAC/CkmB,EAAKlmB,SAASc,UAAUC,OA/VJ,gBAgWfolB,IACHzoB,EAAaS,IAAI+nB,EAAKlmB,SAAU,iBAAiB,WAC/CkmB,EAAKlmB,SAASpH,MAAMkc,UAAY,MAElC9d,EAAqBkvB,EAAKlmB,SAAUomB,OAGxCpvB,EAAqBwG,KAAKwC,SAAUomB,GACpC5oB,KAAKwC,SAASwiB,YAOhB6B,cAAA,WACE,IAAM8B,EACJ3oB,KAAKwC,SAAS+V,aAAe7gB,SAASwE,gBAAgB0X,eAElD5T,KAAKumB,oBAAsBoC,IAAuB1sB,GAAW+D,KAAKumB,qBAAuBoC,GAAsB1sB,KACnH+D,KAAKwC,SAASpH,MAAMytB,YAAiB7oB,KAAKymB,gBAA1C,OAGGzmB,KAAKumB,qBAAuBoC,IAAuB1sB,IAAY+D,KAAKumB,oBAAsBoC,GAAsB1sB,KACnH+D,KAAKwC,SAASpH,MAAM0tB,aAAkB9oB,KAAKymB,gBAA3C,SAIJuB,kBAAA,WACEhoB,KAAKwC,SAASpH,MAAMytB,YAAc,GAClC7oB,KAAKwC,SAASpH,MAAM0tB,aAAe,MAGrCnC,gBAAA,WACE,IAAMzhB,EAAOxN,SAASqE,KAAKoJ,wBAC3BnF,KAAKumB,mBAAqBhvB,KAAKyd,MAAM9P,EAAKI,KAAOJ,EAAKsJ,OAAS9V,OAAOqwB,WACtE/oB,KAAKymB,gBAAkBzmB,KAAKgpB,wBAG9BpC,cAAA,WAAgB,IAAAqC,EAAAjpB,KACVA,KAAKumB,qBACPvmB,KAAKkpB,sBAnYoB,oDAmY0B,gBAAgB,SAAAC,GAAe,OAAIA,EAAkBF,EAAKxC,mBAC7GzmB,KAAKkpB,sBAnYqB,cAmY0B,eAAe,SAAAC,GAAe,OAAIA,EAAkBF,EAAKxC,mBAC7GzmB,KAAKkpB,sBAAsB,OAAQ,gBAAgB,SAAAC,GAAe,OAAIA,EAAkBF,EAAKxC,oBAG/F/uB,SAASqE,KAAKuH,UAAU4G,IAjZJ,iBAoZtBgf,sBAAA,SAAsBpxB,EAAUsxB,EAAW7sB,GACzCoJ,EAAoB7N,GACjBwC,SAAQ,SAAAzC,GACP,IAAMwxB,EAAcxxB,EAAQuD,MAAMguB,GAC5BD,EAAkBzwB,OAAOC,iBAAiBd,GAASuxB,GACzD9kB,EAAYC,iBAAiB1M,EAASuxB,EAAWC,GACjDxxB,EAAQuD,MAAMguB,GAAa7sB,EAASxD,OAAOC,WAAWmwB,IAAoB,WAIhFlB,gBAAA,WACEjoB,KAAKspB,wBAtZsB,oDAsZ0B,gBACrDtpB,KAAKspB,wBAtZuB,cAsZ0B,eACtDtpB,KAAKspB,wBAAwB,OAAQ,mBAGvCA,wBAAA,SAAwBxxB,EAAUsxB,GAChCzjB,EAAoB7N,GAAUwC,SAAQ,SAAAzC,GACpC,IAAM4C,EAAQ6J,EAAYU,iBAAiBnN,EAASuxB,QAC/B,IAAV3uB,GAAyB5C,IAAYH,SAASqE,KACvDlE,EAAQuD,MAAMguB,GAAa,IAE3B9kB,EAAYE,oBAAoB3M,EAASuxB,GACzCvxB,EAAQuD,MAAMguB,GAAa3uB,SAKjCuuB,mBAAA,WACE,IAAMO,EAAY7xB,SAAS2wB,cAAc,OACzCkB,EAAUjB,UApbwB,0BAqblC5wB,SAASqE,KAAK0rB,YAAY8B,GAC1B,IAAMC,EAAiBD,EAAUpkB,wBAAwB2L,MAAQyY,EAAU1V,YAE3E,OADAnc,SAASqE,KAAK2H,YAAY6lB,GACnBC,KAKF7sB,gBAAP,SAAuBzC,EAAQ2Q,GAC7B,OAAO7K,KAAK2D,MAAK,WACf,IAAIzG,EAAOK,EAAayC,KA7db,YA8dLwH,EAAO0B,EAAA,GACR5C,GACAhC,EAAYI,kBAAkB1E,MACX,iBAAX9F,GAAuBA,EAASA,EAAS,IAOtD,GAJKgD,IACHA,EAAO,IAAIipB,EAAMnmB,KAAMwH,IAGH,iBAAXtN,EAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,GAAQ2Q,qCA3anB,WACE,OAAOvE,yBAGT,WACE,MAvEa,iBAkDX6f,CAAc5jB,GAucpBrC,EAAaQ,GAAGhJ,SA7dU,0BAWG,4BAkdyC,SAAUoH,GAAO,IAAA2qB,EAAAzpB,KAC/ED,EAASxH,EAAuByH,MAEjB,MAAjBA,KAAKoK,SAAoC,SAAjBpK,KAAKoK,SAC/BtL,EAAMwD,iBAGRpC,EAAaS,IAAIZ,EA5eH,iBA4euB,SAAA2mB,GAC/BA,EAAU9kB,kBAKd1B,EAAaS,IAAIZ,EAnfH,mBAmfyB,WACjC5E,EAAUsuB,IACZA,EAAKzE,cAKX,IAAI9nB,EAAOK,EAAawC,EA7gBT,YA8gBf,IAAK7C,EAAM,CACT,IAAMhD,EAAMgP,EAAA,GACP5E,EAAYI,kBAAkB3E,GAC9BuE,EAAYI,kBAAkB1E,OAGnC9C,EAAO,IAAIipB,GAAMpmB,EAAQ7F,GAG3BgD,EAAK6G,OAAO/D,SAUd5D,EAliBa,QAkiBY+pB,ICxjBzB,IAAMuD,GAAW,IAAIxrB,IAAI,CACvB,aACA,OACA,OACA,WACA,WACA,SACA,MACA,eAUIyrB,GAAmB,8DAOnBC,GAAmB,qIA2DlB,SAASC,GAAaC,EAAYC,EAAWC,GAAY,IAAApkB,EAC9D,IAAKkkB,EAAWjrB,OACd,OAAOirB,EAGT,GAAIE,GAAoC,mBAAfA,EACvB,OAAOA,EAAWF,GAQpB,IALA,IACMG,GADY,IAAIvxB,OAAOwxB,WACKC,gBAAgBL,EAAY,aACxDM,EAAgBhwB,OAAOC,KAAK0vB,GAC5Bna,GAAWhK,EAAA,IAAGC,OAAHxF,MAAAuF,EAAaqkB,EAAgBluB,KAAK+D,iBAAiB,MAZNkd,EAAA,SAcrDre,EAAOC,GAd8C,IAAAoH,EAetDqkB,EAAKza,EAASjR,GACd2rB,EAASD,EAAGpb,SAASnU,cAE3B,IAAKsvB,EAAcnyB,SAASqyB,GAG1B,OAFAD,EAAGhvB,WAAWqI,YAAY2mB,GAE1B,WAGF,IAAME,GAAgBvkB,EAAA,IAAGH,OAAHxF,MAAA2F,EAAaqkB,EAAG1lB,YAChC6lB,EAAoB,GAAG3kB,OAAOkkB,EAAU,MAAQ,GAAIA,EAAUO,IAAW,IAE/EC,EAAcjwB,SAAQ,SAAAmwB,IApFD,SAACA,EAAMC,GAC9B,IAAMC,EAAWF,EAAKxb,SAASnU,cAE/B,GAAI4vB,EAAqBzyB,SAAS0yB,GAChC,OAAIjB,GAASnqB,IAAIorB,IACRlqB,QAAQkpB,GAAiB3uB,KAAKyvB,EAAKG,YAAchB,GAAiB5uB,KAAKyvB,EAAKG,YASvF,IAHA,IAAMC,EAASH,EAAqB7lB,QAAO,SAAAimB,GAAS,OAAIA,aAAqB/vB,UAGpE4D,EAAI,EAAGC,EAAMisB,EAAOhsB,OAAQF,EAAIC,EAAKD,IAC5C,GAAIksB,EAAOlsB,GAAG3D,KAAK2vB,GACjB,OAAO,EAIX,OAAO,GAiEEI,CAAiBN,EAAMD,IAC1BH,EAAG5lB,gBAAgBgmB,EAAKxb,cAfrBtQ,EAAI,EAAGC,EAAMgR,EAAS/Q,OAAQF,EAAIC,EAAKD,IAAKqe,EAA5Cre,GAoBT,OAAOsrB,EAAgBluB,KAAKivB,UCzF9B,IAIMC,GAAqB,IAAIlwB,OAAJ,wBAAyC,KAC9DmwB,GAAwB,IAAIhtB,IAAI,CAAC,WAAY,YAAa,eAE1D2I,GAAc,CAClBskB,UAAW,UACXC,SAAU,SACVC,MAAO,4BACP/pB,QAAS,SACTgqB,MAAO,kBACP1Z,KAAM,UACN9Z,SAAU,mBACV+W,UAAW,oBACX5J,OAAQ,0BACRsI,UAAW,2BACXuO,mBAAoB,QACpB3C,SAAU,mBACVoS,YAAa,oBACbC,SAAU,UACVxB,WAAY,kBACZD,UAAW,SACX7F,aAAc,0BAGVuH,GAAgB,CACpBC,KAAM,OACNC,IAAK,MACLC,MAAO3vB,EAAQ,OAAS,QACxB4vB,OAAQ,SACRC,KAAM7vB,EAAQ,QAAU,QAGpBqK,GAAU,CACd6kB,WAAW,EACXC,SAAU,+GAIV9pB,QAAS,cACT+pB,MAAO,GACPC,MAAO,EACP1Z,MAAM,EACN9Z,UAAU,EACV+W,UAAW,MACX5J,OAAQ,CAAC,EAAG,GACZsI,WAAW,EACXuO,mBAAoB,CAAC,MAAO,QAAS,SAAU,QAC/C3C,SAAU,kBACVoS,YAAa,GACbC,UAAU,EACVxB,WAAY,KACZD,UDjC8B,CAE9BgC,IAAK,CAAC,QAAS,MAAO,KAAM,OAAQ,OAzCP,kBA0C7B3Q,EAAG,CAAC,SAAU,OAAQ,QAAS,OAC/B4Q,KAAM,GACN3Q,EAAG,GACH4Q,GAAI,GACJC,IAAK,GACLC,KAAM,GACNC,IAAK,GACLC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJjuB,EAAG,GACHkuB,IAAK,CAAC,MAAO,SAAU,MAAO,QAAS,QAAS,UAChDC,GAAI,GACJC,GAAI,GACJC,EAAG,GACHC,IAAK,GACLC,EAAG,GACHC,MAAO,GACPC,KAAM,GACNC,IAAK,GACLC,IAAK,GACLC,OAAQ,GACRC,EAAG,GACHC,GAAI,ICGJvJ,aAAc,MAGV9qB,GAAQ,CACZs0B,KAAI,kBACJC,OAAM,oBACNC,KAAI,kBACJC,MAAK,mBACLC,SAAQ,sBACRC,MAAK,mBACLC,QAAO,qBACPC,SAAQ,sBACRC,WAAU,wBACVC,WAAU,yBAuBNC,GAAAA,SAAAA,GACJ,SAAAA,EAAYv2B,EAASqC,GAAQ,IAAAmJ,EAC3B,QAAsB,IAAXwhB,GACT,MAAM,IAAI5pB,UAAU,+DAFK,OAK3BoI,EAAA0D,EAAAnM,KAAAoF,KAAMnI,IAANmI,MAGKquB,YAAa,EAClBhrB,EAAKirB,SAAW,EAChBjrB,EAAKkrB,YAAc,GACnBlrB,EAAKmrB,eAAiB,GACtBnrB,EAAK+gB,QAAU,KAGf/gB,EAAKnJ,OAASmJ,EAAKoE,WAAWvN,GAC9BmJ,EAAKorB,IAAM,KAEXprB,EAAKqrB,gBAlBsBrrB,oCAiD7BsrB,OAAA,WACE3uB,KAAKquB,YAAa,KAGpBO,QAAA,WACE5uB,KAAKquB,YAAa,KAGpBQ,cAAA,WACE7uB,KAAKquB,YAAcruB,KAAKquB,cAG1BtqB,OAAA,SAAOjF,GACL,GAAKkB,KAAKquB,WAIV,GAAIvvB,EAAO,CACT,IAAM8mB,EAAU5lB,KAAK8uB,6BAA6BhwB,GAElD8mB,EAAQ4I,eAAevI,OAASL,EAAQ4I,eAAevI,MAEnDL,EAAQmJ,uBACVnJ,EAAQoJ,OAAO,KAAMpJ,GAErBA,EAAQqJ,OAAO,KAAMrJ,OAElB,CACL,GAAI5lB,KAAKkvB,gBAAgB5rB,UAAUE,SAhGjB,QAkGhB,YADAxD,KAAKivB,OAAO,KAAMjvB,MAIpBA,KAAKgvB,OAAO,KAAMhvB,UAItB2C,QAAA,WACEoH,aAAa/J,KAAKsuB,UAElBpuB,EAAaC,IAAIH,KAAKwC,SAAUxC,KAAKyC,YAAY0sB,WACjDjvB,EAAaC,IAAIH,KAAKwC,SAASY,QAAd,UAA+C,gBAAiBpD,KAAKovB,mBAElFpvB,KAAKyuB,KAAOzuB,KAAKyuB,IAAIpzB,YACvB2E,KAAKyuB,IAAIpzB,WAAWqI,YAAY1D,KAAKyuB,KAGvCzuB,KAAKquB,WAAa,KAClBruB,KAAKsuB,SAAW,KAChBtuB,KAAKuuB,YAAc,KACnBvuB,KAAKwuB,eAAiB,KAClBxuB,KAAKokB,SACPpkB,KAAKokB,QAAQhB,UAGfpjB,KAAKokB,QAAU,KACfpkB,KAAK9F,OAAS,KACd8F,KAAKyuB,IAAM,KACX1nB,EAAAhB,UAAMpD,QAAN/H,KAAAoF,SAGFoN,KAAA,WAAO,IAAAtE,EAAA9I,KACL,GAAoC,SAAhCA,KAAKwC,SAASpH,MAAMI,QACtB,MAAM,IAAI6zB,MAAM,uCAGlB,GAAMrvB,KAAKsvB,iBAAmBtvB,KAAKquB,WAAnC,CAIA,IAAM3H,EAAYxmB,EAAaoB,QAAQtB,KAAKwC,SAAUxC,KAAKyC,YAAYrJ,MAAMw0B,MACvE2B,EjE7Fa,SAAjBC,EAAiB33B,GACrB,IAAKH,SAASwE,gBAAgBuzB,aAC5B,OAAO,KAIT,GAAmC,mBAAxB53B,EAAQqZ,YAA4B,CAC7C,IAAMwe,EAAO73B,EAAQqZ,cACrB,OAAOwe,aAAgBve,WAAaue,EAAO,KAG7C,OAAI73B,aAAmBsZ,WACdtZ,EAIJA,EAAQwD,WAINm0B,EAAe33B,EAAQwD,YAHrB,KiE4EYm0B,CAAexvB,KAAKwC,UACjCmtB,EAA4B,OAAfJ,EACjBvvB,KAAKwC,SAAS4M,cAAclT,gBAAgBsH,SAASxD,KAAKwC,UAC1D+sB,EAAW/rB,SAASxD,KAAKwC,UAE3B,IAAIkkB,EAAU9kB,kBAAqB+tB,EAAnC,CAIA,IAAMlB,EAAMzuB,KAAKkvB,gBACXU,EAAQv4B,EAAO2I,KAAKyC,YAAYotB,MAEtCpB,EAAIzqB,aAAa,KAAM4rB,GACvB5vB,KAAKwC,SAASwB,aAAa,mBAAoB4rB,GAE/C5vB,KAAK8vB,aAED9vB,KAAK9F,OAAOixB,WACdsD,EAAInrB,UAAU4G,IA/JI,QAkKpB,IAAM2E,EAA6C,mBAA1B7O,KAAK9F,OAAO2U,UACnC7O,KAAK9F,OAAO2U,UAAUjU,KAAKoF,KAAMyuB,EAAKzuB,KAAKwC,UAC3CxC,KAAK9F,OAAO2U,UAERkhB,EAAa/vB,KAAKgwB,eAAenhB,GACvC7O,KAAKiwB,oBAAoBF,GAEzB,IAAMxiB,EAAYvN,KAAKkwB,gBACvB3yB,EAAakxB,EAAKzuB,KAAKyC,YAAYC,SAAU1C,MAExCA,KAAKwC,SAAS4M,cAAclT,gBAAgBsH,SAASxD,KAAKyuB,MAC7DlhB,EAAUka,YAAYgH,GAGxBvuB,EAAaoB,QAAQtB,KAAKwC,SAAUxC,KAAKyC,YAAYrJ,MAAM00B,UAE3D9tB,KAAKokB,QAAUS,GAAoB7kB,KAAKwC,SAAUisB,EAAKzuB,KAAK8kB,iBAAiBiL,IAE7EtB,EAAInrB,UAAU4G,IAlLM,QAoLpB,IACiBimB,EAQ+BvqB,EAT1C2lB,EAAiD,mBAA5BvrB,KAAK9F,OAAOqxB,YAA6BvrB,KAAK9F,OAAOqxB,cAAgBvrB,KAAK9F,OAAOqxB,YACxGA,IACF4E,EAAA1B,EAAInrB,WAAU4G,IAAd7J,MAAA8vB,EAAqB5E,EAAYpzB,MAAM,MAOrC,iBAAkBT,SAASwE,kBAC7B0J,EAAA,IAAGC,OAAHxF,MAAAuF,EAAalO,SAASqE,KAAKkK,UAAU3L,SAAQ,SAAAzC,GAC3CqI,EAAaQ,GAAG7I,EAAS,ajE1Hd,kBiE8Hf,IAAMu4B,EAAW,WACf,IAAMC,EAAiBvnB,EAAKylB,YAE5BzlB,EAAKylB,YAAc,KACnBruB,EAAaoB,QAAQwH,EAAKtG,SAAUsG,EAAKrG,YAAYrJ,MAAMy0B,OApMzC,QAsMdwC,GACFvnB,EAAKmmB,OAAO,KAAMnmB,IAItB,GAAI9I,KAAKyuB,IAAInrB,UAAUE,SAhNH,QAgN8B,CAChD,IAAM5K,EAAqBJ,EAAiCwH,KAAKyuB,KACjEvuB,EAAaS,IAAIX,KAAKyuB,IAAK,gBAAiB2B,GAC5C52B,EAAqBwG,KAAKyuB,IAAK71B,QAE/Bw3B,SAIJjjB,KAAA,WAAO,IAAA7D,EAAAtJ,KACL,GAAKA,KAAKokB,QAAV,CAIA,IAAMqK,EAAMzuB,KAAKkvB,gBACXkB,EAAW,WA3NI,SA4Nf9mB,EAAKilB,aAAoCE,EAAIpzB,YAC/CozB,EAAIpzB,WAAWqI,YAAY+qB,GAG7BnlB,EAAKgnB,iBACLhnB,EAAK9G,SAASiC,gBAAgB,oBAC9BvE,EAAaoB,QAAQgI,EAAK9G,SAAU8G,EAAK7G,YAAYrJ,MAAMu0B,QAEvDrkB,EAAK8a,UACP9a,EAAK8a,QAAQhB,UACb9Z,EAAK8a,QAAU,OAKnB,IADkBlkB,EAAaoB,QAAQtB,KAAKwC,SAAUxC,KAAKyC,YAAYrJ,MAAMs0B,MAC/D9rB,iBAAd,CAQgD,IAAAoE,EAShD,GAbAyoB,EAAInrB,UAAUC,OAjPM,QAqPhB,iBAAkB7L,SAASwE,kBAC7B8J,EAAA,IAAGH,OAAHxF,MAAA2F,EAAatO,SAASqE,KAAKkK,UACxB3L,SAAQ,SAAAzC,GAAO,OAAIqI,EAAaC,IAAItI,EAAS,YAAa6D,MAG/DsE,KAAKwuB,eAAL,OAAqC,EACrCxuB,KAAKwuB,eAAL,OAAqC,EACrCxuB,KAAKwuB,eAAL,OAAqC,EAEjCxuB,KAAKyuB,IAAInrB,UAAUE,SAhQH,QAgQ8B,CAChD,IAAM5K,EAAqBJ,EAAiCi2B,GAE5DvuB,EAAaS,IAAI8tB,EAAK,gBAAiB2B,GACvC52B,EAAqBi1B,EAAK71B,QAE1Bw3B,IAGFpwB,KAAKuuB,YAAc,QAGrB9X,OAAA,WACuB,OAAjBzW,KAAKokB,SACPpkB,KAAKokB,QAAQ3N,YAMjB6Y,cAAA,WACE,OAAO7uB,QAAQT,KAAKuwB,eAGtBrB,cAAA,WACE,GAAIlvB,KAAKyuB,IACP,OAAOzuB,KAAKyuB,IAGd,IAAM52B,EAAUH,SAAS2wB,cAAc,OAIvC,OAHAxwB,EAAQmzB,UAAYhrB,KAAK9F,OAAOkxB,SAEhCprB,KAAKyuB,IAAM52B,EAAQoO,SAAS,GACrBjG,KAAKyuB,OAGdqB,WAAA,WACE,IAAMrB,EAAMzuB,KAAKkvB,gBACjBlvB,KAAKwwB,kBAAkB7qB,EA/RI,iBA+R2C8oB,GAAMzuB,KAAKuwB,YACjF9B,EAAInrB,UAAUC,OAvSM,OAEA,WAwStBitB,kBAAA,SAAkB34B,EAAS44B,GACzB,GAAgB,OAAZ54B,EAIJ,MAAuB,iBAAZ44B,GAAwBp3B,EAAUo3B,IACvCA,EAAQviB,SACVuiB,EAAUA,EAAQ,SAIhBzwB,KAAK9F,OAAO0X,KACV6e,EAAQp1B,aAAexD,IACzBA,EAAQmzB,UAAY,GACpBnzB,EAAQ4vB,YAAYgJ,IAGtB54B,EAAQ64B,YAAcD,EAAQC,mBAM9B1wB,KAAK9F,OAAO0X,MACV5R,KAAK9F,OAAOsxB,WACdiF,EAAU5G,GAAa4G,EAASzwB,KAAK9F,OAAO6vB,UAAW/pB,KAAK9F,OAAO8vB,aAGrEnyB,EAAQmzB,UAAYyF,GAEpB54B,EAAQ64B,YAAcD,MAI1BF,SAAA,WACE,IAAIlF,EAAQrrB,KAAKwC,SAASzK,aAAa,0BAQvC,OANKszB,IACHA,EAAqC,mBAAtBrrB,KAAK9F,OAAOmxB,MACzBrrB,KAAK9F,OAAOmxB,MAAMzwB,KAAKoF,KAAKwC,UAC5BxC,KAAK9F,OAAOmxB,OAGTA,KAGTsF,iBAAA,SAAiBZ,GACf,MAAmB,UAAfA,EACK,MAGU,SAAfA,EACK,QAGFA,KAKTjB,6BAAA,SAA6BhwB,EAAO8mB,GAClC,IAAMgL,EAAU5wB,KAAKyC,YAAYC,SAQjC,OAPAkjB,EAAUA,GAAWroB,EAAauB,EAAMmB,eAAgB2wB,MAGtDhL,EAAU,IAAI5lB,KAAKyC,YAAY3D,EAAMmB,eAAgBD,KAAK6wB,sBAC1DtzB,EAAauB,EAAMmB,eAAgB2wB,EAAShL,IAGvCA,KAGTL,WAAA,WAAa,IAAA9b,EAAAzJ,KACHiF,EAAWjF,KAAK9F,OAAhB+K,OAER,MAAsB,iBAAXA,EACFA,EAAO9M,MAAM,KAAK4pB,KAAI,SAAA7d,GAAG,OAAInL,OAAOsS,SAASnH,EAAK,OAGrC,mBAAXe,EACF,SAAAugB,GAAU,OAAIvgB,EAAOugB,EAAY/b,EAAKjH,WAGxCyC,KAGT6f,iBAAA,SAAiBiL,GAAY,IAAAvkB,EAAAxL,KACrBylB,EAAwB,CAC5B5W,UAAWkhB,EACXpP,UAAW,CACT,CACEtkB,KAAM,OACN6T,QAAS,CACPuJ,aAAa,EACbqC,mBAAoB9b,KAAK9F,OAAO4hB,qBAGpC,CACEzf,KAAM,SACN6T,QAAS,CACPjL,OAAQjF,KAAKulB,eAGjB,CACElpB,KAAM,kBACN6T,QAAS,CACPiJ,SAAUnZ,KAAK9F,OAAOif,WAG1B,CACE9c,KAAM,QACN6T,QAAS,CACPrY,QAAO,IAAMmI,KAAKyC,YAAYotB,KAAvB,WAGX,CACExzB,KAAM,WACNoT,SAAS,EACTC,MAAO,aACPhT,GAAI,SAAAQ,GAAI,OAAIsO,EAAKslB,6BAA6B5zB,MAGlDmmB,cAAe,SAAAnmB,GACTA,EAAKgT,QAAQrB,YAAc3R,EAAK2R,WAClCrD,EAAKslB,6BAA6B5zB,KAKxC,OAAAgM,EAAA,GACKuc,EACqC,mBAA7BzlB,KAAK9F,OAAOgqB,aAA8BlkB,KAAK9F,OAAOgqB,aAAauB,GAAyBzlB,KAAK9F,OAAOgqB,iBAIvH+L,oBAAA,SAAoBF,GAClB/vB,KAAKkvB,gBAAgB5rB,UAAU4G,IAAO6mB,cAAgB/wB,KAAK2wB,iBAAiBZ,OAG9EG,cAAA,WACE,OAA8B,IAA1BlwB,KAAK9F,OAAOqT,UACP7V,SAASqE,KAGd1C,EAAU2G,KAAK9F,OAAOqT,WACjBvN,KAAK9F,OAAOqT,UAGd5H,EAAuB3F,KAAK9F,OAAOqT,cAG5CyiB,eAAA,SAAenhB,GACb,OAAO4c,GAAc5c,EAAU3T,kBAGjCwzB,cAAA,WAAgB,IAAA9G,EAAA5nB,KACGA,KAAK9F,OAAOoH,QAAQnJ,MAAM,KAElCmC,SAAQ,SAAAgH,GACf,GAAgB,UAAZA,EACFpB,EAAaQ,GAAGknB,EAAKplB,SAAUolB,EAAKnlB,YAAYrJ,MAAM20B,MAAOnG,EAAK1tB,OAAOpC,UAAU,SAAAgH,GAAK,OAAI8oB,EAAK7jB,OAAOjF,WAEnG,GAhcU,WAgcNwC,EAA4B,CACrC,IAAM0vB,EApcQ,UAocE1vB,EACdsmB,EAAKnlB,YAAYrJ,MAAM80B,WACvBtG,EAAKnlB,YAAYrJ,MAAM40B,QACnBiD,EAvcQ,UAucG3vB,EACfsmB,EAAKnlB,YAAYrJ,MAAM+0B,WACvBvG,EAAKnlB,YAAYrJ,MAAM60B,SAEzB/tB,EAAaQ,GAAGknB,EAAKplB,SAAUwuB,EAASpJ,EAAK1tB,OAAOpC,UAAU,SAAAgH,GAAK,OAAI8oB,EAAKoH,OAAOlwB,MACnFoB,EAAaQ,GAAGknB,EAAKplB,SAAUyuB,EAAUrJ,EAAK1tB,OAAOpC,UAAU,SAAAgH,GAAK,OAAI8oB,EAAKqH,OAAOnwB,UAIxFkB,KAAKovB,kBAAoB,WACnBxH,EAAKplB,UACPolB,EAAKza,QAITjN,EAAaQ,GAAGV,KAAKwC,SAASY,QAAd,UAA+C,gBAAiBpD,KAAKovB,mBAEjFpvB,KAAK9F,OAAOpC,SACdkI,KAAK9F,OAALgP,EAAA,GACKlJ,KAAK9F,OADV,CAEEoH,QAAS,SACTxJ,SAAU,KAGZkI,KAAKkxB,eAITA,UAAA,WACE,IAAM7F,EAAQrrB,KAAKwC,SAASzK,aAAa,SACnCo5B,SAA2BnxB,KAAKwC,SAASzK,aAAa,2BAExDszB,GAA+B,WAAtB8F,KACXnxB,KAAKwC,SAASwB,aAAa,yBAA0BqnB,GAAS,KAC1DA,GAAUrrB,KAAKwC,SAASzK,aAAa,eAAkBiI,KAAKwC,SAASkuB,aACvE1wB,KAAKwC,SAASwB,aAAa,aAAcqnB,GAG3CrrB,KAAKwC,SAASwB,aAAa,QAAS,QAIxCgrB,OAAA,SAAOlwB,EAAO8mB,GACZA,EAAU5lB,KAAK8uB,6BAA6BhwB,EAAO8mB,GAE/C9mB,IACF8mB,EAAQ4I,eACS,YAAf1vB,EAAMsB,KArfQ,QADA,UAufZ,GAGFwlB,EAAQsJ,gBAAgB5rB,UAAUE,SAjgBlB,SAEC,SA+f8CoiB,EAAQ2I,YACzE3I,EAAQ2I,YAhgBW,QAogBrBxkB,aAAa6b,EAAQ0I,UAErB1I,EAAQ2I,YAtgBa,OAwgBhB3I,EAAQ1rB,OAAOoxB,OAAU1F,EAAQ1rB,OAAOoxB,MAAMle,KAKnDwY,EAAQ0I,SAAWv0B,YAAW,WA7gBT,SA8gBf6rB,EAAQ2I,aACV3I,EAAQxY,SAETwY,EAAQ1rB,OAAOoxB,MAAMle,MARtBwY,EAAQxY,WAWZ6hB,OAAA,SAAOnwB,EAAO8mB,GACZA,EAAU5lB,KAAK8uB,6BAA6BhwB,EAAO8mB,GAE/C9mB,IACF8mB,EAAQ4I,eACS,aAAf1vB,EAAMsB,KAnhBQ,QADA,UAqhBZ,GAGFwlB,EAAQmJ,yBAIZhlB,aAAa6b,EAAQ0I,UAErB1I,EAAQ2I,YAliBY,MAoiBf3I,EAAQ1rB,OAAOoxB,OAAU1F,EAAQ1rB,OAAOoxB,MAAMne,KAKnDyY,EAAQ0I,SAAWv0B,YAAW,WAziBV,QA0iBd6rB,EAAQ2I,aACV3I,EAAQzY,SAETyY,EAAQ1rB,OAAOoxB,MAAMne,MARtByY,EAAQzY,WAWZ4hB,qBAAA,WACE,IAAK,IAAMztB,KAAWtB,KAAKwuB,eACzB,GAAIxuB,KAAKwuB,eAAeltB,GACtB,OAAO,EAIX,OAAO,KAGTmG,WAAA,SAAWvN,GACT,IAAMk3B,EAAiB9sB,EAAYI,kBAAkB1E,KAAKwC,UAuC1D,OArCApI,OAAOC,KAAK+2B,GAAgB92B,SAAQ,SAAA+2B,GAC9BnG,GAAsB3rB,IAAI8xB,WACrBD,EAAeC,MAItBn3B,GAAsC,iBAArBA,EAAOqT,WAA0BrT,EAAOqT,UAAUW,SACrEhU,EAAOqT,UAAYrT,EAAOqT,UAAU,IASV,iBAN5BrT,EAAMgP,EAAA,GACDlJ,KAAKyC,YAAY6D,QACjB8qB,EACmB,iBAAXl3B,GAAuBA,EAASA,EAAS,KAGpCoxB,QAChBpxB,EAAOoxB,MAAQ,CACble,KAAMlT,EAAOoxB,MACbne,KAAMjT,EAAOoxB,QAIW,iBAAjBpxB,EAAOmxB,QAChBnxB,EAAOmxB,MAAQnxB,EAAOmxB,MAAM1wB,YAGA,iBAAnBT,EAAOu2B,UAChBv2B,EAAOu2B,QAAUv2B,EAAOu2B,QAAQ91B,YAGlCX,EAxqBS,UAwqBaE,EAAQ8F,KAAKyC,YAAYoE,aAE3C3M,EAAOsxB,WACTtxB,EAAOkxB,SAAWvB,GAAa3vB,EAAOkxB,SAAUlxB,EAAO6vB,UAAW7vB,EAAO8vB,aAGpE9vB,KAGT22B,mBAAA,WACE,IAAM32B,EAAS,GAEf,GAAI8F,KAAK9F,OACP,IAAK,IAAM+C,KAAO+C,KAAK9F,OACjB8F,KAAKyC,YAAY6D,QAAQrJ,KAAS+C,KAAK9F,OAAO+C,KAChD/C,EAAO+C,GAAO+C,KAAK9F,OAAO+C,IAKhC,OAAO/C,KAGTo2B,eAAA,WACE,IAAM7B,EAAMzuB,KAAKkvB,gBACXoC,EAAW7C,EAAI12B,aAAa,SAAS8C,MAAMowB,IAChC,OAAbqG,GAAqBA,EAASzyB,OAAS,GACzCyyB,EAASvP,KAAI,SAAAwP,GAAK,OAAIA,EAAMn5B,UACzBkC,SAAQ,SAAAk3B,GAAM,OAAI/C,EAAInrB,UAAUC,OAAOiuB,SAI9CV,6BAAA,SAA6BtL,GAAY,IAC/B7V,EAAU6V,EAAV7V,MAEHA,IAIL3P,KAAKyuB,IAAM9e,EAAMC,SAASK,OAC1BjQ,KAAKswB,iBACLtwB,KAAKiwB,oBAAoBjwB,KAAKgwB,eAAergB,EAAMd,gBAK9ClS,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf,IAAIzG,EAAOK,EAAayC,KAvtBb,cAwtBLwH,EAA4B,iBAAXtN,GAAuBA,EAE9C,IAAKgD,IAAQ,eAAelC,KAAKd,MAI5BgD,IACHA,EAAO,IAAIkxB,EAAQpuB,KAAMwH,IAGL,iBAAXtN,GAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,uCArnBX,WACE,OAAOoM,qBAGT,WACE,MAxHS,gCA2HX,WACE,MA3Ha,gCA8Hf,WACE,OAAOlN,0BAGT,WACE,MAlIW,uCAqIb,WACE,OAAOyN,SA7CLunB,CAAgB7rB,GA0pBtBnG,EArvBa,UAqvBYgyB,ICvwBzB,IAIMnD,GAAqB,IAAIlwB,OAAJ,wBAAyC,KAE9DuL,GAAO4C,EAAA,GACRklB,GAAQ9nB,QADA,CAEXuI,UAAW,QACX5J,OAAQ,CAAC,EAAG,GACZ3D,QAAS,QACTmvB,QAAS,GACTrF,SAAU,gJAONvkB,GAAWqC,EAAA,GACZklB,GAAQvnB,YADI,CAEf4pB,QAAS,8BAGLr3B,GAAQ,CACZs0B,KAAI,kBACJC,OAAM,oBACNC,KAAI,kBACJC,MAAK,mBACLC,SAAQ,sBACRC,MAAK,mBACLC,QAAO,qBACPC,SAAQ,sBACRC,WAAU,wBACVC,WAAU,yBAeNsD,GAAAA,SAAAA,uFA6BJnC,cAAA,WACE,OAAOtvB,KAAKuwB,YAAcvwB,KAAK0xB,iBAGjC5B,WAAA,WACE,IAAMrB,EAAMzuB,KAAKkvB,gBAGjBlvB,KAAKwwB,kBAAkB7qB,EA9CJ,kBA8C2C8oB,GAAMzuB,KAAKuwB,YACzE,IAAIE,EAAUzwB,KAAK0xB,cACI,mBAAZjB,IACTA,EAAUA,EAAQ71B,KAAKoF,KAAKwC,WAG9BxC,KAAKwwB,kBAAkB7qB,EAnDF,gBAmD2C8oB,GAAMgC,GAEtEhC,EAAInrB,UAAUC,OAzDM,OACA,WA6DtB0sB,oBAAA,SAAoBF,GAClB/vB,KAAKkvB,gBAAgB5rB,UAAU4G,IAAO6mB,cAAgB/wB,KAAK2wB,iBAAiBZ,OAG9E2B,YAAA,WACE,OAAO1xB,KAAKwC,SAASzK,aAAa,oBAAsBiI,KAAK9F,OAAOu2B,WAGtEH,eAAA,WACE,IAAM7B,EAAMzuB,KAAKkvB,gBACXoC,EAAW7C,EAAI12B,aAAa,SAAS8C,MAAMowB,IAChC,OAAbqG,GAAqBA,EAASzyB,OAAS,GACzCyyB,EAASvP,KAAI,SAAAwP,GAAK,OAAIA,EAAMn5B,UACzBkC,SAAQ,SAAAk3B,GAAM,OAAI/C,EAAInrB,UAAUC,OAAOiuB,SAMvC70B,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf,IAAIzG,EAAOK,EAAayC,KAvHb,cAwHLwH,EAA4B,iBAAXtN,EAAsBA,EAAS,KAEtD,IAAKgD,IAAQ,eAAelC,KAAKd,MAI5BgD,IACHA,EAAO,IAAIu0B,EAAQzxB,KAAMwH,GACzBjK,EAAayC,KAhIJ,aAgIoB9C,IAGT,iBAAXhD,GAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,uCArFX,WACE,OAAOoM,qBAGT,WACE,MAzDS,gCA4DX,WACE,MA5Da,gCA+Df,WACE,OAAOlN,0BAGT,WACE,MAnEW,uCAsEb,WACE,OAAOyN,SAxBL4qB,CAAgBrD,IAqGtBhyB,EAtJa,UAsJYq1B,IC9IzB,IAKMnrB,GAAU,CACdrB,OAAQ,GACR0sB,OAAQ,OACR5xB,OAAQ,IAGJ8G,GAAc,CAClB5B,OAAQ,SACR0sB,OAAQ,SACR5xB,OAAQ,oBA2BJ6xB,GAAAA,SAAAA,GACJ,SAAAA,EAAY/5B,EAASqC,GAAQ,IAAAmJ,EAAA,OAC3BA,EAAA0D,EAAAnM,KAAAoF,KAAMnI,IAANmI,MACK6xB,eAAqC,SAApBh6B,EAAQuS,QAAqB1R,OAASb,EAC5DwL,EAAKmE,QAAUnE,EAAKoE,WAAWvN,GAC/BmJ,EAAKyJ,UAAezJ,EAAKmE,QAAQzH,OAAbsD,eAA8CA,EAAKmE,QAAQzH,OAA3DsD,sBAA6FA,EAAKmE,QAAQzH,OAA1GsD,kBACpBA,EAAKyuB,SAAW,GAChBzuB,EAAK0uB,SAAW,GAChB1uB,EAAK2uB,cAAgB,KACrB3uB,EAAK4uB,cAAgB,EAErB/xB,EAAaQ,GAAG2C,EAAKwuB,eAlCP,uBAkCqC,WAAA,OAAMxuB,EAAK6uB,cAE9D7uB,EAAK8uB,UACL9uB,EAAK6uB,WAbsB7uB,oCA4B7B8uB,QAAA,WAAU,IAAArpB,EAAA9I,KACFoyB,EAAapyB,KAAK6xB,iBAAmB7xB,KAAK6xB,eAAen5B,OAvC7C,SACE,WA0Cd25B,EAAuC,SAAxBryB,KAAKwH,QAAQmqB,OAChCS,EACApyB,KAAKwH,QAAQmqB,OAETW,EA9Cc,aA8CDD,EACjBryB,KAAKuyB,gBACL,EAEFvyB,KAAK8xB,SAAW,GAChB9xB,KAAK+xB,SAAW,GAChB/xB,KAAKiyB,cAAgBjyB,KAAKwyB,mBAEV7sB,EAAoB3F,KAAK8M,WAEjCiV,KAAI,SAAAlqB,GACV,IAAM46B,EAAiBp6B,EAAuBR,GACxCkI,EAAS0yB,EAAiB9sB,EAAuB8sB,GAAkB,KAEzE,GAAI1yB,EAAQ,CACV,IAAM2yB,EAAY3yB,EAAOoF,wBACzB,GAAIutB,EAAU5hB,OAAS4hB,EAAU1hB,OAC/B,MAAO,CACL1M,EAAY+tB,GAActyB,GAAQqF,IAAMktB,EACxCG,GAKN,OAAO,QAEN5tB,QAAO,SAAA8tB,GAAI,OAAIA,KACfxX,MAAK,SAACC,EAAGC,GAAJ,OAAUD,EAAE,GAAKC,EAAE,MACxB/gB,SAAQ,SAAAq4B,GACP7pB,EAAKgpB,SAAS/kB,KAAK4lB,EAAK,IACxB7pB,EAAKipB,SAAShlB,KAAK4lB,EAAK,UAI9BhwB,QAAA,WACEoE,EAAAhB,UAAMpD,QAAN/H,KAAAoF,MACAE,EAAaC,IAAIH,KAAK6xB,eAjHX,iBAmHX7xB,KAAK6xB,eAAiB,KACtB7xB,KAAKwH,QAAU,KACfxH,KAAK8M,UAAY,KACjB9M,KAAK8xB,SAAW,KAChB9xB,KAAK+xB,SAAW,KAChB/xB,KAAKgyB,cAAgB,KACrBhyB,KAAKiyB,cAAgB,QAKvBxqB,WAAA,SAAWvN,GAMT,GAA6B,iBAL7BA,EAAMgP,EAAA,GACD5C,GACmB,iBAAXpM,GAAuBA,EAASA,EAAS,KAGpC6F,QAAuB1G,EAAUa,EAAO6F,QAAS,CAAA,IAC3D3I,EAAO8C,EAAO6F,OAAd3I,GACDA,IACHA,EAAKC,EAzIA,aA0IL6C,EAAO6F,OAAO3I,GAAKA,GAGrB8C,EAAO6F,OAAP,IAAoB3I,EAKtB,OAFA4C,EAhJS,YAgJaE,EAAQ2M,IAEvB3M,KAGTq4B,cAAA,WACE,OAAOvyB,KAAK6xB,iBAAmBn5B,OAC7BsH,KAAK6xB,eAAe7a,YACpBhX,KAAK6xB,eAAexsB,aAGxBmtB,iBAAA,WACE,OAAOxyB,KAAK6xB,eAAetZ,cAAgBhhB,KAAKgb,IAC9C7a,SAASqE,KAAKwc,aACd7gB,SAASwE,gBAAgBqc,iBAI7Bqa,iBAAA,WACE,OAAO5yB,KAAK6xB,iBAAmBn5B,OAC7BA,OAAOm6B,YACP7yB,KAAK6xB,eAAe1sB,wBAAwB6L,UAGhDkhB,SAAA,WACE,IAAM7sB,EAAYrF,KAAKuyB,gBAAkBvyB,KAAKwH,QAAQvC,OAChDsT,EAAevY,KAAKwyB,mBACpBM,EAAY9yB,KAAKwH,QAAQvC,OAASsT,EAAevY,KAAK4yB,mBAM5D,GAJI5yB,KAAKiyB,gBAAkB1Z,GACzBvY,KAAKmyB,UAGH9sB,GAAaytB,EAAjB,CACE,IAAM/yB,EAASC,KAAK+xB,SAAS/xB,KAAK+xB,SAASlzB,OAAS,GAEhDmB,KAAKgyB,gBAAkBjyB,GACzBC,KAAK+yB,UAAUhzB,OAJnB,CAUA,GAAIC,KAAKgyB,eAAiB3sB,EAAYrF,KAAK8xB,SAAS,IAAM9xB,KAAK8xB,SAAS,GAAK,EAG3E,OAFA9xB,KAAKgyB,cAAgB,UACrBhyB,KAAKgzB,SAIP,IAAK,IAAIr0B,EAAIqB,KAAK8xB,SAASjzB,OAAQF,KACVqB,KAAKgyB,gBAAkBhyB,KAAK+xB,SAASpzB,IACxD0G,GAAarF,KAAK8xB,SAASnzB,UACM,IAAzBqB,KAAK8xB,SAASnzB,EAAI,IAAsB0G,EAAYrF,KAAK8xB,SAASnzB,EAAI,KAGhFqB,KAAK+yB,UAAU/yB,KAAK+xB,SAASpzB,QAKnCo0B,UAAA,SAAUhzB,GACRC,KAAKgyB,cAAgBjyB,EAErBC,KAAKgzB,SAEL,IAAMC,EAAUjzB,KAAK8M,UAAU3U,MAAM,KAClC4pB,KAAI,SAAAjqB,GAAQ,OAAOA,EAAP,oBAAmCiI,EAAnC,MAA+CjI,EAA/C,UAAiEiI,EAAjE,QAETmzB,EAAOvtB,EAAuBstB,EAAQE,KAAK,MAE7CD,EAAK5vB,UAAUE,SAjMU,kBAkM3BmC,EAzL2B,mBAyLsButB,EAAK9vB,QA1LlC,cA2LjBE,UAAU4G,IAlMO,UAoMpBgpB,EAAK5vB,UAAU4G,IApMK,YAuMpBgpB,EAAK5vB,UAAU4G,IAvMK,U5DjCH,SAcbrS,EAASC,GAKf,IAJA,IAAMs7B,EAAU,GAEZC,EAAWx7B,EAAQwD,WAEhBg4B,GAAYA,EAAS95B,WAAaguB,KAAKC,cArBhC,IAqBgD6L,EAAS95B,UACjE85B,EAASltB,QAAQrO,IACnBs7B,EAAQrmB,KAAKsmB,GAGfA,EAAWA,EAASh4B,WAGtB,OAAO+3B,E4D+MLztB,CAAuButB,EAtMG,qBAuMvB54B,SAAQ,SAAAg5B,GAGP3tB,EAAoB2tB,EAAcC,+BAC/Bj5B,SAAQ,SAAAq4B,GAAI,OAAIA,EAAKrvB,UAAU4G,IA9MlB,aAiNhBvE,EAAoB2tB,EA5MH,aA6Mdh5B,SAAQ,SAAAk5B,GACP7tB,EAAwB6tB,EA/MX,aAgNVl5B,SAAQ,SAAAq4B,GAAI,OAAIA,EAAKrvB,UAAU4G,IApNtB,oBAyNtBhK,EAAaoB,QAAQtB,KAAK6xB,eA9NV,wBA8N0C,CACxDhnB,cAAe9K,OAInBizB,OAAA,WACErtB,EAAoB3F,KAAK8M,WACtBjI,QAAO,SAAAsK,GAAI,OAAIA,EAAK7L,UAAUE,SAhOX,aAiOnBlJ,SAAQ,SAAA6U,GAAI,OAAIA,EAAK7L,UAAUC,OAjOZ,gBAsOjB5G,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf,IAAIzG,EAAOK,EAAayC,KA7Pb,gBAoQX,GAJK9C,IACHA,EAAO,IAAI00B,EAAU5xB,KAHW,iBAAX9F,GAAuBA,IAMxB,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,uCA9MX,WACE,OAAOoM,yBAGT,WACE,MAhEa,qBAwCXsrB,CAAkBrvB,GA6OxBrC,EAAaQ,GAAGhI,OAnQS,8BAmQoB,WAC3CiN,EA/PwB,0BAgQrBrL,SAAQ,SAAAm5B,GAAG,OAAI,IAAI7B,GAAU6B,EAAKnvB,EAAYI,kBAAkB+uB,UAUrEr3B,EAlSa,YAkSYw1B,ICnSzB,IA+BM8B,GAAAA,SAAAA,uFASJtmB,KAAA,WAAO,IAAA/J,EAAArD,KACL,KAAKA,KAAKwC,SAASnH,YACjB2E,KAAKwC,SAASnH,WAAW9B,WAAaguB,KAAKC,cAC3CxnB,KAAKwC,SAASc,UAAUE,SA/BJ,WAgCpBxD,KAAKwC,SAASc,UAAUE,SA/BF,aA4BxB,CAOA,IAAI4C,EACErG,EAASxH,EAAuByH,KAAKwC,UACrCmxB,EAAc3zB,KAAKwC,SAASY,QAhCN,qBAkC5B,GAAIuwB,EAAa,CACf,IAAMC,EAAwC,OAAzBD,EAAY1kB,UAA8C,OAAzB0kB,EAAY1kB,SAjC7C,wBADH,UAoClB7I,GADAA,EAAWT,EAAoBiuB,EAAcD,IACzBvtB,EAASvH,OAAS,GAGxC,IAAMg1B,EAAYztB,EAChBlG,EAAaoB,QAAQ8E,EAtDX,cAsDiC,CACzCyE,cAAe7K,KAAKwC,WAEtB,KAMF,KAJkBtC,EAAaoB,QAAQtB,KAAKwC,SAzDhC,cAyDsD,CAChEqI,cAAezE,IAGHxE,kBAAmC,OAAdiyB,GAAsBA,EAAUjyB,kBAAnE,CAIA5B,KAAK+yB,UAAU/yB,KAAKwC,SAAUmxB,GAE9B,IAAMvD,EAAW,WACflwB,EAAaoB,QAAQ8E,EArET,gBAqEiC,CAC3CyE,cAAexH,EAAKb,WAEtBtC,EAAaoB,QAAQ+B,EAAKb,SAtEf,eAsEsC,CAC/CqI,cAAezE,KAIfrG,EACFC,KAAK+yB,UAAUhzB,EAAQA,EAAO1E,WAAY+0B,GAE1CA,SAMJ2C,UAAA,SAAUl7B,EAAS0V,EAAWhR,GAAU,IAAAuM,EAAA9I,KAKhC8zB,IAJiBvmB,GAAqC,OAAvBA,EAAU0B,UAA4C,OAAvB1B,EAAU0B,SAE5EtJ,EAAwB4H,EA5EN,WA2ElB5H,EA1EqB,wBA0EmB4H,IAGZ,GACxBU,EAAkB1R,GAAau3B,GAAUA,EAAOxwB,UAAUE,SApF5C,QAsFd4sB,EAAW,WAAA,OAAMtnB,EAAKirB,oBAAoBl8B,EAASi8B,EAAQv3B,IAEjE,GAAIu3B,GAAU7lB,EAAiB,CAC7B,IAAMrV,EAAqBJ,EAAiCs7B,GAC5DA,EAAOxwB,UAAUC,OAzFC,QA2FlBrD,EAAaS,IAAImzB,EAAQ,gBAAiB1D,GAC1C52B,EAAqBs6B,EAAQl7B,QAE7Bw3B,OAIJ2D,oBAAA,SAAoBl8B,EAASi8B,EAAQv3B,GACnC,GAAIu3B,EAAQ,CACVA,EAAOxwB,UAAUC,OAvGG,UAyGpB,IAAMywB,EAAgBruB,EA9FW,kCA8F4CmuB,EAAOz4B,YAEhF24B,GACFA,EAAc1wB,UAAUC,OA5GN,UA+GgB,QAAhCuwB,EAAO/7B,aAAa,SACtB+7B,EAAO9vB,aAAa,iBAAiB,GAIzCnM,EAAQyL,UAAU4G,IApHI,UAqHe,QAAjCrS,EAAQE,aAAa,SACvBF,EAAQmM,aAAa,iBAAiB,GAGxCrI,EAAO9D,GAEHA,EAAQyL,UAAUE,SAzHF,SA0HlB3L,EAAQyL,UAAU4G,IAzHA,QA4HhBrS,EAAQwD,YAAcxD,EAAQwD,WAAWiI,UAAUE,SAhI1B,mBAiIH3L,EAAQuL,QA3HZ,cA8HlBuC,EAzHyB,oBA0HtBrL,SAAQ,SAAA25B,GAAQ,OAAIA,EAAS3wB,UAAU4G,IApIxB,aAuIpBrS,EAAQmM,aAAa,iBAAiB,IAGpCzH,GACFA,OAMGI,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf,IAAMzG,EAAOK,EAAayC,KA9Jf,WA8JkC,IAAI0zB,EAAI1zB,MAErD,GAAsB,iBAAX9F,EAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,wCApIX,WACE,MAlCa,eA8BXw5B,CAAYnxB,GAmJlBrC,EAAaQ,GAAGhJ,SAzKU,wBAYG,4EA6JyC,SAAUoH,GAC9EA,EAAMwD,kBAEO/E,EAAayC,KApLX,WAoL8B,IAAI0zB,GAAI1zB,OAChDoN,UAUPhR,EAhMa,MAgMYs3B,IChMzB,IAeM7sB,GAAc,CAClBskB,UAAW,UACX+I,SAAU,UACV5I,MAAO,UAGHhlB,GAAU,CACd6kB,WAAW,EACX+I,UAAU,EACV5I,MAAO,KAWH6I,GAAAA,SAAAA,GACJ,SAAAA,EAAYt8B,EAASqC,GAAQ,IAAAmJ,EAAA,OAC3BA,EAAA0D,EAAAnM,KAAAoF,KAAMnI,IAANmI,MAEKwH,QAAUnE,EAAKoE,WAAWvN,GAC/BmJ,EAAKirB,SAAW,KAChBjrB,EAAKqrB,gBALsBrrB,oCAwB7B+J,KAAA,WAAO,IAAAtE,EAAA9I,KAGL,IAFkBE,EAAaoB,QAAQtB,KAAKwC,SAtDhC,iBAwDEZ,iBAAd,CAIA5B,KAAKo0B,gBAEDp0B,KAAKwH,QAAQ2jB,WACfnrB,KAAKwC,SAASc,UAAU4G,IA5DN,QA+DpB,IAAMkmB,EAAW,WACftnB,EAAKtG,SAASc,UAAUC,OA7DH,WA8DrBuF,EAAKtG,SAASc,UAAU4G,IA/DN,QAiElBhK,EAAaoB,QAAQwH,EAAKtG,SArEf,kBAuEPsG,EAAKtB,QAAQ0sB,WACfprB,EAAKwlB,SAAWv0B,YAAW,WACzB+O,EAAKqE,SACJrE,EAAKtB,QAAQ8jB,SAOpB,GAHAtrB,KAAKwC,SAASc,UAAUC,OA3EJ,QA4EpB5H,EAAOqE,KAAKwC,UACZxC,KAAKwC,SAASc,UAAU4G,IA3ED,WA4EnBlK,KAAKwH,QAAQ2jB,UAAW,CAC1B,IAAMvyB,EAAqBJ,EAAiCwH,KAAKwC,UAEjEtC,EAAaS,IAAIX,KAAKwC,SAAU,gBAAiB4tB,GACjD52B,EAAqBwG,KAAKwC,SAAU5J,QAEpCw3B,QAIJjjB,KAAA,WAAO,IAAA7D,EAAAtJ,KACL,GAAKA,KAAKwC,SAASc,UAAUE,SAxFT,UA4FFtD,EAAaoB,QAAQtB,KAAKwC,SAnGhC,iBAqGEZ,iBAAd,CAIA,IAAMwuB,EAAW,WACf9mB,EAAK9G,SAASc,UAAU4G,IApGN,QAqGlBhK,EAAaoB,QAAQgI,EAAK9G,SA1Gd,oBA8Gd,GADAxC,KAAKwC,SAASc,UAAUC,OAvGJ,QAwGhBvD,KAAKwH,QAAQ2jB,UAAW,CAC1B,IAAMvyB,EAAqBJ,EAAiCwH,KAAKwC,UAEjEtC,EAAaS,IAAIX,KAAKwC,SAAU,gBAAiB4tB,GACjD52B,EAAqBwG,KAAKwC,SAAU5J,QAEpCw3B,QAIJztB,QAAA,WACE3C,KAAKo0B,gBAEDp0B,KAAKwC,SAASc,UAAUE,SArHR,SAsHlBxD,KAAKwC,SAASc,UAAUC,OAtHN,QAyHpBrD,EAAaC,IAAIH,KAAKwC,SAjID,0BAmIrBuE,EAAAhB,UAAMpD,QAAN/H,KAAAoF,MACAA,KAAKwH,QAAU,QAKjBC,WAAA,SAAWvN,GAST,OARAA,EAAMgP,EAAA,GACD5C,GACAhC,EAAYI,kBAAkB1E,KAAKwC,UAChB,iBAAXtI,GAAuBA,EAASA,EAAS,IAGtDF,EApJS,QAoJaE,EAAQ8F,KAAKyC,YAAYoE,aAExC3M,KAGTw0B,cAAA,WAAgB,IAAAjlB,EAAAzJ,KACdE,EAAaQ,GAAGV,KAAKwC,SAtJA,yBAuBK,6BA+HiD,WAAA,OAAMiH,EAAK0D,aAGxFinB,cAAA,WACErqB,aAAa/J,KAAKsuB,UAClBtuB,KAAKsuB,SAAW,QAKX3xB,gBAAP,SAAuBzC,GACrB,OAAO8F,KAAK2D,MAAK,WACf,IAAIzG,EAAOK,EAAayC,KArKb,YA4KX,GAJK9C,IACHA,EAAO,IAAIi3B,EAAMn0B,KAHe,iBAAX9F,GAAuBA,IAMxB,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjBgD,EAAKhD,GACd,MAAM,IAAIe,UAAJ,oBAAkCf,EAAlC,KAGRgD,EAAKhD,GAAQ8F,4CApInB,WACE,OAAO6G,wBAGT,WACE,OAAOP,yBAGT,WACE,MAtDa,iBAkCX6tB,CAAc5xB,UA4JpBnG,EA/La,QA+LY+3B,ICrMV,CACbtxB,MAAAA,EACAiB,OAAAA,EACAgD,SAAAA,EACAwF,SAAAA,EACA6X,SAAAA,GACAgC,MAAAA,GACAsL,QAAAA,GACAG,UAAAA,GACA8B,IAAAA,GACAS,MAAAA,GACA/F,QAAAA","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = '#' + hrefAttr.split('#')[1]\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => (obj[0] || obj).nodeType\n\nconst emulateTransitionEnd = (element, duration) => {\n let called = false\n const durationPadding = 5\n const emulatedDuration = duration + durationPadding\n\n function listener() {\n called = true\n element.removeEventListener(TRANSITION_END, listener)\n }\n\n element.addEventListener(TRANSITION_END, listener)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(element)\n }\n }, emulatedDuration)\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!element) {\n return false\n }\n\n if (element.style && element.parentNode && element.parentNode.style) {\n const elementStyle = getComputedStyle(element)\n const parentNodeStyle = getComputedStyle(element.parentNode)\n\n return elementStyle.display !== 'none' &&\n parentNodeStyle.display !== 'none' &&\n elementStyle.visibility !== 'hidden'\n }\n\n return false\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => function () {}\n\nconst reflow = element => element.offsetHeight\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = (name, plugin) => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nexport {\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n emulateTransitionEnd,\n typeCheckConfig,\n isVisible,\n findShadowRoot,\n noop,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst mapData = (() => {\n const storeData = {}\n let id = 1\n return {\n set(element, key, data) {\n if (typeof element.bsKey === 'undefined') {\n element.bsKey = {\n key,\n id\n }\n id++\n }\n\n storeData[element.bsKey.id] = data\n },\n get(element, key) {\n if (!element || typeof element.bsKey === 'undefined') {\n return null\n }\n\n const keyProperties = element.bsKey\n if (keyProperties.key === key) {\n return storeData[keyProperties.id]\n }\n\n return null\n },\n delete(element, key) {\n if (typeof element.bsKey === 'undefined') {\n return\n }\n\n const keyProperties = element.bsKey\n if (keyProperties.key === key) {\n delete storeData[keyProperties.id]\n delete element.bsKey\n }\n }\n }\n})()\n\nconst Data = {\n setData(instance, key, data) {\n mapData.set(instance, key, data)\n },\n getData(instance, key) {\n return mapData.get(instance, key)\n },\n removeData(instance, key) {\n mapData.delete(instance, key)\n }\n}\n\nexport default Data\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n // eslint-disable-next-line unicorn/consistent-destructuring\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n let typeEvent = originalTypeEvent.replace(stripNameRegex, '')\n const custom = customEvents[typeEvent]\n\n if (custom) {\n typeEvent = custom\n }\n\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = event.replace(stripNameRegex, '')\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.0.0-beta2'\n\nclass BaseComponent {\n constructor(element) {\n if (!element) {\n return\n }\n\n this._element = element\n Data.setData(element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.removeData(this._element, this.constructor.DATA_KEY)\n this._element = null\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.getData(element, this.DATA_KEY)\n }\n\n static get VERSION() {\n return VERSION\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n emulateTransitionEnd,\n getElementFromSelector,\n getTransitionDurationFromElement\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst SELECTOR_DISMISS = '[data-bs-dismiss=\"alert\"]'\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_ALERT = 'alert'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n // Public\n\n close(element) {\n const rootElement = element ? this._getRootElement(element) : this._element\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent === null || customEvent.defaultPrevented) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n // Private\n\n _getRootElement(element) {\n return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`)\n }\n\n _triggerCloseEvent(element) {\n return EventHandler.trigger(element, EVENT_CLOSE)\n }\n\n _removeElement(element) {\n element.classList.remove(CLASS_NAME_SHOW)\n\n if (!element.classList.contains(CLASS_NAME_FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = getTransitionDurationFromElement(element)\n\n EventHandler.one(element, 'transitionend', () => this._destroyElement(element))\n emulateTransitionEnd(element, transitionDuration)\n }\n\n _destroyElement(element) {\n if (element.parentNode) {\n element.parentNode.removeChild(element)\n }\n\n EventHandler.trigger(element, EVENT_CLOSED)\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n let data = Data.getData(this, DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert()))\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n let data = Data.getData(this, DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n\n let data = Data.getData(button, DATA_KEY)\n if (!data) {\n data = new Button(button)\n }\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + document.body.scrollTop,\n left: rect.left + document.body.scrollLeft\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n emulateTransitionEnd,\n getElementFromSelector,\n getTransitionDurationFromElement,\n isVisible,\n isRTL,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst DIRECTION_NEXT = 'next'\nconst DIRECTION_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(DIRECTION_NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(DIRECTION_PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex ?\n DIRECTION_NEXT :\n DIRECTION_PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n super.dispose()\n EventHandler.off(this._element, EVENT_KEY)\n\n this._items = null\n this._config = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n // swipe left\n if (direction > 0) {\n if (isRTL) {\n this.next()\n } else {\n this.prev()\n }\n }\n\n // swipe right\n if (direction < 0) {\n if (isRTL) {\n this.prev()\n } else {\n this.next()\n }\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const start = event => {\n if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n if (event.touches && event.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = event => {\n if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n if (event.key === ARROW_LEFT_KEY) {\n event.preventDefault()\n if (isRTL) {\n this.next()\n } else {\n this.prev()\n }\n } else if (event.key === ARROW_RIGHT_KEY) {\n event.preventDefault()\n if (isRTL) {\n this.prev()\n } else {\n this.next()\n }\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === DIRECTION_NEXT\n const isPrevDirection = direction === DIRECTION_PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = (isPrevDirection && activeIndex === 0) ||\n (isNextDirection && activeIndex === lastItemIndex)\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === DIRECTION_PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1 ?\n this._items[this._items.length - 1] :\n this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(direction, element) {\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || (activeElement && this._getItemByDirection(direction, activeElement))\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const directionalClassName = direction === DIRECTION_NEXT ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = direction === DIRECTION_NEXT ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = direction === DIRECTION_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const transitionDuration = getTransitionDurationFromElement(activeElement)\n\n EventHandler.one(activeElement, 'transitionend', () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(() => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }, 0)\n })\n\n emulateTransitionEnd(activeElement, transitionDuration)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static carouselInterface(element, config) {\n let data = Data.getData(element, DATA_KEY)\n let _config = {\n ...Default,\n ...Manipulator.getDataAttributes(element)\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(element, _config)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Data.getData(target, DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Data.getData(carousels[i], DATA_KEY))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n emulateTransitionEnd,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n isElement,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: ''\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(string|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.show, .collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = SelectorEngine.find(\n `${SELECTOR_DATA_TOGGLE}[href=\"#${element.id}\"],` +\n `${SELECTOR_DATA_TOGGLE}[data-bs-target=\"#${element.id}\"]`\n )\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n // Public\n\n toggle() {\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._parent)\n .filter(elem => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-bs-parent') === this._config.parent\n }\n\n return elem.classList.contains(CLASS_NAME_COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Data.getData(tempActiveData, DATA_KEY) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n if (actives) {\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.collapseInterface(elemActive, 'hide')\n }\n\n if (!activesData) {\n Data.setData(elemActive, DATA_KEY, null)\n }\n })\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n this._triggerArray.forEach(element => {\n element.classList.remove(CLASS_NAME_COLLAPSED)\n element.setAttribute('aria-expanded', true)\n })\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = getTransitionDurationFromElement(this._element)\n\n EventHandler.one(this._element, 'transitionend', complete)\n\n emulateTransitionEnd(this._element, transitionDuration)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) {\n trigger.classList.add(CLASS_NAME_COLLAPSED)\n trigger.setAttribute('aria-expanded', false)\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = getTransitionDurationFromElement(this._element)\n\n EventHandler.one(this._element, 'transitionend', complete)\n emulateTransitionEnd(this._element, transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n super.dispose()\n this._config = null\n this._parent = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT\n }\n\n _getParent() {\n let { parent } = this._config\n\n if (isElement(parent)) {\n // it's a jQuery object\n if (typeof parent.jquery !== 'undefined' || typeof parent[0] !== 'undefined') {\n parent = parent[0]\n }\n } else {\n parent = SelectorEngine.findOne(parent)\n }\n\n const selector = `${SELECTOR_DATA_TOGGLE}[data-bs-parent=\"${parent}\"]`\n\n SelectorEngine.find(selector, parent)\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n this._addAriaAndCollapsedClass(\n selected,\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n if (!element || !triggerArray.length) {\n return\n }\n\n const isOpen = element.classList.contains(CLASS_NAME_SHOW)\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static collapseInterface(element, config) {\n let data = Data.getData(element, DATA_KEY)\n const _config = {\n ...Default,\n ...Manipulator.getDataAttributes(element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(element, _config)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Collapse.collapseInterface(this, config)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const triggerData = Manipulator.getDataAttributes(this)\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n const data = Data.getData(element, DATA_KEY)\n let config\n if (data) {\n // update parent attribute\n if (data._parent === null && typeof triggerData.parent === 'string') {\n data._config.parent = triggerData.parent\n data._parent = data._getParent()\n }\n\n config = 'toggle'\n } else {\n config = triggerData\n }\n\n Collapse.collapseInterface(element, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","/*:: import type { Window } from '../types'; */\n\n/*:: declare function getWindow(node: Node | Window): Window; */\nexport default function getWindow(node) {\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n/*:: declare function isElement(node: mixed): boolean %checks(node instanceof\n Element); */\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n/*:: declare function isHTMLElement(node: mixed): boolean %checks(node instanceof\n HTMLElement); */\n\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n/*:: declare function isShadowRoot(node: mixed): boolean %checks(node instanceof\n ShadowRoot); */\n\n\nfunction isShadowRoot(node) {\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","// Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\nexport default function getLayoutRect(element) {\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || // DOM Element detected\n // $FlowFixMe[incompatible-return]: need a better way to handle this...\n element.host || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n var offsetParent = element.offsetParent;\n\n if (offsetParent) {\n var html = getDocumentElement(offsetParent);\n\n if (getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && getComputedStyle(html).position !== 'static') {\n return html;\n }\n }\n\n return offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.willChange && css.willChange !== 'auto') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static') {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","export default function within(min, value, max) {\n return Math.max(min, Math.min(value, max));\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign(Object.assign({}, getFreshSideObject()), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport within from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = state.modifiersData[name + \"#persistent\"].padding;\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element,\n _options$padding = options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n state.modifiersData[name + \"#persistent\"] = {\n padding: mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements))\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","import { top, left, right, bottom } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: Math.round(x * dpr) / dpr || 0,\n y: Math.round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets;\n\n var _ref3 = roundOffsets ? roundOffsetsByDPR(offsets) : offsets,\n _ref3$x = _ref3.x,\n x = _ref3$x === void 0 ? 0 : _ref3$x,\n _ref3$y = _ref3.y,\n y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n /*:: offsetParent = (offsetParent: Element); */\n\n\n if (placement === top) {\n sideY = bottom;\n y -= offsetParent.clientHeight - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left) {\n sideX = right;\n x -= offsetParent.clientWidth - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n var state = _ref4.state,\n options = _ref4.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign(Object.assign({}, state.styles.popper), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign(Object.assign({}, state.styles.arrow), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","export default function getBoundingClientRect(element) {\n var rect = element.getBoundingClientRect();\n return {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n x: rect.left,\n y: rect.top\n };\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = getNodeName(scrollParent) === 'body';\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","export default function rectToClientRect(rect) {\n return Object.assign(Object.assign({}, rect), {}, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = Math.max(rect.top, accRect.top);\n accRect.right = Math.min(rect.right, accRect.right);\n accRect.bottom = Math.min(rect.bottom, accRect.bottom);\n accRect.left = Math.max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = element.ownerDocument.body;\n var width = Math.max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = Math.max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += Math.max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var referenceElement = state.elements.reference;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(referenceElement);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign(Object.assign({}, popperRect), popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\n\n/*:: type OverflowsMap = { [ComputedPlacement]: number }; */\n\n/*;; type OverflowsMap = { [key in ComputedPlacement]: number }; */\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign(Object.assign({}, rects), {}, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport within from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign(Object.assign({}, state.rects), {}, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? Math.min(min, tetherMin) : min, offset, tether ? Math.max(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(_min, _offset, _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\"; // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement);\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign(Object.assign({}, DEFAULT_OPTIONS), defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(options) {\n cleanupModifierEffects();\n state.options = Object.assign(Object.assign(Object.assign({}, defaultOptions), state.options), options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign(Object.assign(Object.assign({}, existing), current), {}, {\n options: Object.assign(Object.assign({}, existing.options), current.options),\n data: Object.assign(Object.assign({}, existing.data), current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isElement,\n isVisible,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DISABLED = 'disabled'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_FORM_CHILD = '.dropdown form'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n flip: true,\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n flip: 'boolean',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {\n return\n }\n\n const isActive = this._element.classList.contains(CLASS_NAME_SHOW)\n\n Dropdown.clearMenus()\n\n if (isActive) {\n return\n }\n\n this.show()\n }\n\n show() {\n if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', null, noop()))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.toggle(CLASS_NAME_SHOW)\n this._element.classList.toggle(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.toggle(CLASS_NAME_SHOW)\n this._element.classList.toggle(CLASS_NAME_SHOW)\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n dispose() {\n super.dispose()\n EventHandler.off(this._element, EVENT_KEY)\n this._menu = null\n\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_CLICK, event => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n altBoundary: this._config.flip,\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n // Static\n\n static dropdownInterface(element, config) {\n let data = Data.getData(element, DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(element, _config)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Dropdown.dropdownInterface(this, config)\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Data.getData(toggles[i], DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {\n continue\n }\n\n if (event && ((event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName)) ||\n (event.type === 'keyup' && event.key === TAB_KEY)) &&\n dropdownMenu.contains(event.target)) {\n continue\n }\n\n const hideEvent = EventHandler.trigger(toggles[i], EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', null, noop()))\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n if (context._popper) {\n context._popper.destroy()\n }\n\n dropdownMenu.classList.remove(CLASS_NAME_SHOW)\n toggles[i].classList.remove(CLASS_NAME_SHOW)\n Manipulator.removeDataAttribute(dropdownMenu, 'popper')\n EventHandler.trigger(toggles[i], EVENT_HIDDEN, relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this)\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (event.key === ESCAPE_KEY) {\n const button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n button.focus()\n Dropdown.clearMenus()\n return\n }\n\n if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {\n const button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n button.click()\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n return\n }\n\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, parent).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n // Up\n if (event.key === ARROW_UP_KEY && index > 0) {\n index--\n }\n\n // Down\n if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {\n index++\n }\n\n // index is -1 if the first keydown is an ArrowUp\n index = index === -1 ? 0 : index\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown.dropdownInterface(this, 'toggle')\n})\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e => e.stopPropagation())\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n emulateTransitionEnd,\n getElementFromSelector,\n getTransitionDurationFromElement,\n isVisible,\n isRTL,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'\nconst CLASS_NAME_BACKDROP = 'modal-backdrop'\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\nconst SELECTOR_DATA_DISMISS = '[data-bs-dismiss=\"modal\"]'\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, element)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if (this._element.classList.contains(CLASS_NAME_FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (this._isShown || showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event))\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const transition = this._element.classList.contains(CLASS_NAME_FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.off(document, EVENT_FOCUSIN)\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n if (transition) {\n const transitionDuration = getTransitionDurationFromElement(this._element)\n\n EventHandler.one(this._element, 'transitionend', event => this._hideModal(event))\n emulateTransitionEnd(this._element, transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n super.dispose()\n\n /**\n * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `EVENT_CLICK_DATA_API` event that should remain\n */\n EventHandler.off(document, EVENT_FOCUSIN)\n\n this._config = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = this._element.classList.contains(CLASS_NAME_FADE)\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (transition) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n if (transition) {\n const transitionDuration = getTransitionDurationFromElement(this._dialog)\n\n EventHandler.one(this._dialog, 'transitionend', transitionComplete)\n emulateTransitionEnd(this._dialog, transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n EventHandler.off(document, EVENT_FOCUSIN) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => {\n if (document !== event.target &&\n this._element !== event.target &&\n !this._element.contains(event.target)) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._showBackdrop(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._resetScrollbar()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _removeBackdrop() {\n this._backdrop.parentNode.removeChild(this._backdrop)\n this._backdrop = null\n }\n\n _showBackdrop(callback) {\n const animate = this._element.classList.contains(CLASS_NAME_FADE) ?\n CLASS_NAME_FADE :\n ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = CLASS_NAME_BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n document.body.appendChild(this._backdrop)\n\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n reflow(this._backdrop)\n }\n\n this._backdrop.classList.add(CLASS_NAME_SHOW)\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop)\n\n EventHandler.one(this._backdrop, 'transitionend', callback)\n emulateTransitionEnd(this._backdrop, backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n this._backdrop.classList.remove(CLASS_NAME_SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n callback()\n }\n\n if (this._element.classList.contains(CLASS_NAME_FADE)) {\n const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop)\n EventHandler.one(this._backdrop, 'transitionend', callbackRemove)\n emulateTransitionEnd(this._backdrop, backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else {\n callback()\n }\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n const modalTransitionDuration = getTransitionDurationFromElement(this._dialog)\n EventHandler.off(this._element, 'transitionend')\n EventHandler.one(this._element, 'transitionend', () => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n EventHandler.one(this._element, 'transitionend', () => {\n this._element.style.overflowY = ''\n })\n emulateTransitionEnd(this._element, modalTransitionDuration)\n }\n })\n emulateTransitionEnd(this._element, modalTransitionDuration)\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing =\n this._element.scrollHeight > document.documentElement.clientHeight\n\n if ((!this._isBodyOverflowing && isModalOverflowing && !isRTL) || (this._isBodyOverflowing && !isModalOverflowing && isRTL)) {\n this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n }\n\n if ((this._isBodyOverflowing && !isModalOverflowing && !isRTL) || (!this._isBodyOverflowing && isModalOverflowing && isRTL)) {\n this._element.style.paddingRight = `${this._scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + this._scrollbarWidth)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - this._scrollbarWidth)\n this._setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + this._scrollbarWidth)\n }\n\n document.body.classList.add(CLASS_NAME_OPEN)\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n SelectorEngine.find(selector)\n .forEach(element => {\n const actualValue = element.style[styleProp]\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px'\n })\n }\n\n _resetScrollbar() {\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n this._resetElementAttributes('body', 'paddingRight')\n }\n\n _resetElementAttributes(selector, styleProp) {\n SelectorEngine.find(selector).forEach(element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined' && element === document.body) {\n element.style[styleProp] = ''\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n })\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = Data.getData(this, DATA_KEY)\n const _config = {\n ...Default,\n ...Manipulator.getDataAttributes(this),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (!data) {\n data = new Modal(this, _config)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n let data = Data.getData(target, DATA_KEY)\n if (!data) {\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n\n data = new Modal(target, config)\n }\n\n data.toggle(this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attr, allowedAttributeList) => {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attrName)) {\n if (uriAttrs.has(attrName)) {\n return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attrName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const allowlistKeys = Object.keys(allowList)\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (!allowlistKeys.includes(elName)) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].concat(...el.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || [])\n\n attributeList.forEach(attr => {\n if (!allowedAttribute(attr, allowedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n emulateTransitionEnd,\n findShadowRoot,\n getTransitionDurationFromElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport {\n DefaultAllowlist,\n sanitizeHtml\n} from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '
    ' +\n '
    ' +\n '
    ' +\n '
    ',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler)\n\n if (this.tip && this.tip.parentNode) {\n this.tip.parentNode.removeChild(this.tip)\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.config = null\n this.tip = null\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this.config.placement === 'function' ?\n this.config.placement.call(this, tip, this._element) :\n this.config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const container = this._getContainer()\n Data.setData(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.appendChild(tip)\n }\n\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = typeof this.config.customClass === 'function' ? this.config.customClass() : this.config.customClass\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop())\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n if (this.tip.classList.contains(CLASS_NAME_FADE)) {\n const transitionDuration = getTransitionDurationFromElement(this.tip)\n EventHandler.one(this.tip, 'transitionend', complete)\n emulateTransitionEnd(this.tip, transitionDuration)\n } else {\n complete()\n }\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n if (this.tip.classList.contains(CLASS_NAME_FADE)) {\n const transitionDuration = getTransitionDurationFromElement(tip)\n\n EventHandler.one(tip, 'transitionend', complete)\n emulateTransitionEnd(tip, transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this.config.template\n\n this.tip = element.children[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent(SelectorEngine.findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle())\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (typeof content === 'object' && isElement(content)) {\n if (content.jquery) {\n content = content[0]\n }\n\n // content is a DOM node or a jQuery\n if (this.config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.appendChild(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.allowList, this.config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n let title = this._element.getAttribute('data-bs-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function' ?\n this.config.title.call(this._element) :\n this.config.title\n }\n\n return title\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || Data.getData(event.delegateTarget, dataKey)\n\n if (!context) {\n context = new this.constructor(event.delegateTarget, this._getDelegateConfig())\n Data.setData(event.delegateTarget, dataKey, context)\n }\n\n return context\n }\n\n _getOffset() {\n const { offset } = this.config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n altBoundary: true,\n fallbackPlacements: this.config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this.config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this.config.popperConfig === 'function' ? this.config.popperConfig(defaultBsPopperConfig) : this.config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`)\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (isElement(this.config.container)) {\n return this.config.container\n }\n\n return SelectorEngine.findOne(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this.config.selector, event => this.toggle(event)\n )\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this.config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this.config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler)\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n if (config && typeof config.container === 'object' && config.container.jquery) {\n config.container = config.container[0]\n }\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n let data = Data.getData(this, DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Data from './dom/data'\nimport SelectorEngine from './dom/selector-engine'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '
    ' +\n '
    ' +\n '

    ' +\n '
    ' +\n '
    '\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent() {\n const tip = this.getTipElement()\n\n // we use append for html objects to maintain js events\n this.setElementContent(SelectorEngine.findOne(SELECTOR_TITLE, tip), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this._element)\n }\n\n this.setElementContent(SelectorEngine.findOne(SELECTOR_CONTENT, tip), content)\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n }\n\n // Private\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`)\n }\n\n _getContent() {\n return this._element.getAttribute('data-bs-content') || this.config.content\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n let data = Data.getData(this, DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n Data.setData(this, DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(NAME, Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getSelectorFromElement,\n getUID,\n isElement,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(this._selector)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n super.dispose()\n EventHandler.off(this._scrollElement, EVENT_KEY)\n\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (typeof config.target !== 'string' && isElement(config.target)) {\n let { id } = config.target\n if (!id) {\n id = getUID(NAME)\n config.target.id = id\n }\n\n config.target = `#${id}`\n }\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','))\n\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n } else {\n // Set triggered link as active\n link.classList.add(CLASS_NAME_ACTIVE)\n\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both