diff --git a/.coveragerc b/.coveragerc index d489af09a5..2afac8dc60 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,6 +1,8 @@ [run] omit = rich/jupyter.py rich/_windows.py + rich/_timer.py + rich/diagnose.py [report] exclude_lines = diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 2d926775af..7c92f61f11 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,3 @@ # These are supported funding model platforms -github: willmcgugan -custom: https://www.willmcgugan.com/sponsorship/ +ko_fi: textualize diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 8d1af54e7e..6d6f45677f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -3,15 +3,38 @@ name: Bug report about: Create a report to help us improve title: "[BUG]" labels: Needs triage -assignees: '' - +assignees: "" --- +You may find a solution to your problem in the [docs](https://rich.readthedocs.io/en/latest/introduction.html) or [issues](https://github.com/willmcgugan/rich/issues). + **Describe the bug** -A clear and concise description of what the bug is. -**To Reproduce** -A minimal code example that reproduces the problem would be a big help if you can provide it. If the issue is visual in nature, consider posting a screenshot. +Edit this with a clear and concise description of what the bug. + +Provide a minimal code example that demonstrates the issue if you can. If the issue is visual in nature, consider posting a screenshot. **Platform** -What platform (Win/Linux/Mac) are you running on? What terminal software are you using. Which version of Rich? +
+Click to expand + +What platform (Win/Linux/Mac) are you running on? What terminal software are you using? + +I may ask you to copy and paste the output of the following commands. It may save some time if you do it now. + +If you're using Rich in a terminal: + +``` +python -m rich.diagnose +pip freeze | grep rich +``` + +If you're using Rich in a Jupyter Notebook, run the following snippet in a cell +and paste the output in your bug report. + +```python +from rich.diagnose import report +report() +``` + +
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 5315f76fe1..6e2ca38c29 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,12 +7,14 @@ assignees: '' --- +Consider posting in https://github.com/willmcgugan/rich/discussions for feedback before raising a feature request. + Have you checked the issues for a similar suggestions? **How would you improve Rich?** Give as much detail as you can. Example code of how you would like it to work would help. -**What problem does it solved for you?** +**What problem does it solve for you?** What problem do you have that this feature would solve? I may be able to suggest an existing way of solving it. diff --git a/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from pull_request_template.md rename to .github/pull_request_template.md diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml new file mode 100644 index 0000000000..c21f7a6420 --- /dev/null +++ b/.github/workflows/codespell.yml @@ -0,0 +1,10 @@ +name: codespell +on: [pull_request, push] +jobs: + codespell: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: python3 -m pip install codespell + - run: codespell --ignore-words-list="ba,fo,hel,revered,womens" + --skip="./README.*.md,*.svg,./benchmarks/snippets.py" diff --git a/.github/workflows/comment.yml b/.github/workflows/comment.yml new file mode 100644 index 0000000000..8da8617c52 --- /dev/null +++ b/.github/workflows/comment.yml @@ -0,0 +1,18 @@ +name: issues +on: + issues: + types: [closed] +jobs: + add-comment: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Did I solve your problem? + uses: peter-evans/create-or-update-comment@a35cf36e5301d70b76f316e867e7788a55a31dae + with: + issue-number: ${{ github.event.issue.number }} + body: | + Did I solve your problem? + + Why not buy the devs a [coffee](https://ko-fi.com/textualize) to say thanks? diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index a4cae13bb9..93b44bc377 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -8,33 +8,39 @@ jobs: strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] - python-version: [3.6, 3.7, 3.8, 3.9] - + python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"] + defaults: + run: + shell: bash steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} architecture: x64 + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.1.11 + virtualenvs-in-project: true - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements-dev.txt - poetry install + run: poetry install + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - name: Format check with black run: | + source $VENV make format-check - name: Typecheck with mypy run: | + source $VENV make typecheck - name: Test with pytest run: | - pip install . - python -m pytest tests -v --cov=./rich --cov-report=xml:./coverage.xml --cov-report term-missing - + source $VENV + pytest tests -v --cov=./rich --cov-report=xml:./coverage.xml --cov-report term-missing - name: Upload code coverage - uses: codecov/codecov-action@v1.0.10 + uses: codecov/codecov-action@v2 with: token: ${{ secrets.CODECOV_TOKEN }} file: ./coverage.xml diff --git a/.github/workflows/readmechanged.yml b/.github/workflows/readmechanged.yml new file mode 100644 index 0000000000..e4729f6a78 --- /dev/null +++ b/.github/workflows/readmechanged.yml @@ -0,0 +1,24 @@ +name: README.md Changed + +on: + push: + branches: + - master + paths: + - 'README.md' + +jobs: + send_notification: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Send notification to README Authors + env: + GITHUB_TOKEN: ${{ secrets.GHP_README_WORKFLOW }} + GIT_SHA: ${{ github.sha }} + run: | + COMMIT=$(git rev-parse --short "$GIT_SHA") + AUTHORS='@willmcgugan @oleksis @Adilius' + BODY="🤓 $AUTHORS README.md changed 📝. Check the [commit $COMMIT](https://github.com/willmcgugan/rich/commit/$GIT_SHA) 👀" + DISCUSSIONID='MDEwOkRpc2N1c3Npb24zMzI2NzM0' + gh api graphql -H 'GraphQL-Features: discussions_api' -f body="$BODY" -F discussionId="$DISCUSSIONID" -f query='mutation($body: String!, $discussionId: ID!){addDiscussionComment(input:{body: $body , discussionId: $discussionId}){comment{id}}}' diff --git a/.github/workflows/update_benchmark_website.yml b/.github/workflows/update_benchmark_website.yml new file mode 100644 index 0000000000..d2185039c1 --- /dev/null +++ b/.github/workflows/update_benchmark_website.yml @@ -0,0 +1,24 @@ +on: + release: + types: [ released ] + + +jobs: + asv-publish-and-copy: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: '3.10.2' + - run: 'pip install asv' + - run: 'asv publish' + - uses: cpina/github-action-push-to-another-repository@v1.4.1 + name: 'Copy files to Textualize/rich-benchmarks repo' + env: + API_TOKEN_GITHUB: ${{ secrets.PUBLISH_ASV }} + with: + source-directory: /benchmarks/html + destination-github-username: Textualize + destination-repository-name: rich-benchmarks + user-email: darren@textualize.io diff --git a/.gitignore b/.gitignore index 233804adff..b291d4c2a5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,12 @@ .pytype .DS_Store .vscode +.idea/ mypy_report docs/build docs/source/_build tools/*.txt +playground/ # Byte-compiled / optimized / DLL files __pycache__/ @@ -111,3 +113,7 @@ venv.bak/ # mypy .mypy_cache/ + +# airspeed velocity +benchmarks/env/ +benchmarks/html/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..e241d35539 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,43 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.0.1 + hooks: + - id: check-ast + - id: check-builtin-literals + - id: check-case-conflict + - id: check-docstring-first + - id: check-merge-conflict + - id: check-json + - id: check-toml + - id: check-yaml + - id: end-of-file-fixer + - id: mixed-line-ending + - id: trailing-whitespace + - id: check-vcs-permalinks + - id: check-shebang-scripts-are-executable + - repo: https://github.com/pre-commit/pygrep-hooks + rev: v1.9.0 + hooks: + - id: python-check-mock-methods + - id: python-no-log-warn + - id: python-use-type-annotations + - id: rst-directive-colons + - id: rst-inline-touching-normal + - repo: https://github.com/hadialqattan/pycln + rev: v1.2.5 + hooks: + - id: pycln + args: [--all] + - repo: https://github.com/psf/black + rev: 22.1.0 + hooks: + - id: black + exclude: ^benchmarks/ + - repo: https://github.com/PyCQA/isort + rev: 5.10.1 + hooks: + - id: isort + exclude: ^benchmarks/ + args: ["--profile", "black"] diff --git a/CHANGELOG.md b/CHANGELOG.md index a5d1be52a3..1484ecf08e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,736 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [9.3.0] - Unreleased +## [12.4.1] - 2022-05-08 -### Added +### Fixed + +- Fix for https://github.com/Textualize/rich/issues/2260 + +### Changed + +- Added a keyline around SVG terminals which is visible on dark backgrounds + +## [12.4.0] - 2022-05-07 + +### Changed + +- Rebuilt SVG export to create a simpler SVG that is more portable +- Fix render_lines crash when render height was negative https://github.com/Textualize/rich/pull/2246 + +### Added + +- Add `padding` to Syntax constructor https://github.com/Textualize/rich/pull/2247 + +## [12.3.0] - 2022-04-26 + +### Added + +- Ability to change terminal window title https://github.com/Textualize/rich/pull/2200 +- Added show_speed parameter to progress.track which will show the speed when the total is not known +- Python blocks can now opt out from being rendered in tracebacks's frames, by setting a `_rich_traceback_omit = True` in their local scope https://github.com/Textualize/rich/issues/2207 + +### Fixed + +- Fall back to `sys.__stderr__` on POSIX systems when trying to get the terminal size (fix issues when Rich is piped to another process) +- Fixed markup escaping issue https://github.com/Textualize/rich/issues/2187 +- Safari - Box appearing around SVG export https://github.com/Textualize/rich/pull/2201 +- Fixed recursion error in Jupyter progress bars https://github.com/Textualize/rich/issues/2047 +- Complex numbers are now identified by the highlighter https://github.com/Textualize/rich/issues/2214 +- Fix crash on IDLE and forced is_terminal detection to False because IDLE can't do escape codes https://github.com/Textualize/rich/issues/2222 +- Fixed missing blank line in traceback rendering https://github.com/Textualize/rich/issues/2206 +- Fixed running Rich with the current working dir was deleted https://github.com/Textualize/rich/issues/2197 + +### Changed + +- Setting `total=None` on progress is now possible, and will display pulsing animation +- Micro-optimization for Segment.divide + +## [12.2.0] - 2022-04-05 + +### Changed + +- Bumped typing-extensions minimum to 4.0.0 +- Bumped minimum Python version to 3.6.3 + +## [12.1.0] - 2022-04-03 + +### Added + +- Progress.open and Progress.wrap_file method to track the progress while reading from a file or file-like object https://github.com/willmcgugan/rich/pull/1759 +- SVG export functionality https://github.com/Textualize/rich/pull/2101 +- Adding Indonesian translation + +### Fixed + +- Add missing `end` keyword argument to `Text.from_markup` https://github.com/Textualize/rich/pull/2095 +- Fallback to text lexer when no lexer guessed https://github.com/Textualize/rich/pull/2133 +- Fixed issue with decoding ANSI reset https://github.com/Textualize/rich/issues/2112 + +## [12.0.1] - 2022-03-22 + +### Changed + +- Improve performance of cell_length https://github.com/Textualize/rich/pull/2061 +- Improve performance of chop_cells https://github.com/Textualize/rich/pull/2077 + +### Fixed + +- Fix capturing stdout on legacy Windows https://github.com/Textualize/rich/pull/2066 + +## [12.0.0] - 2022-03-10 + +### Added + +- Added options to TimeRemainingColumn to render a compact time format and render elapsed time when a task is + finished. https://github.com/Textualize/rich/pull/1992 +- Added ProgressColumn `MofNCompleteColumn` to display raw `completed/total` column (similar to DownloadColumn, + but displays values as ints, does not convert to floats or add bit/bytes units). + https://github.com/Textualize/rich/pull/1941 +- Replace Colorama with win32 renderer https://github.com/Textualize/rich/pull/1993 +- Add support for namedtuples to `Pretty` https://github.com/Textualize/rich/pull/2031 + +### Fixed + +- In Jupyter mode make the link target be set to "\_blank" +- Fix some issues with markup handling around "[" characters https://github.com/Textualize/rich/pull/1950 +- Fix syntax lexer guessing. +- Fixed Pretty measure not respecting expand_all https://github.com/Textualize/rich/issues/1998 +- Collapsed definitions for single-character spinners, to save memory and reduce import time. +- Fix print_json indent type in `__init__.py` +- Fix error when inspecting object defined in REPL https://github.com/Textualize/rich/pull/2037 +- Fix incorrect highlighting of non-indented JSON https://github.com/Textualize/rich/pull/2038 +- Fixed height reset in complex renderables https://github.com/Textualize/rich/issues/2042 + +### Changed + +- Improved support for enum.Flag in ReprHighlighter https://github.com/Textualize/rich/pull/1920 +- Tree now respects justify=None, i.e. won't pad to right https://github.com/Textualize/rich/issues/1690 +- Removed rich.tabulate which was marked for deprecation +- Deprecated rich.align.AlignValues in favor of AlignMethod + +## [11.2.0] - 2022-02-08 + +### Added + +- Add support for US spelling of "gray" in ANSI color names https://github.com/Textualize/rich/issues/1890 +- Added `rich.diagnose.report` to expose environment debugging logic as function https://github.com/Textualize/rich/pull/1917 +- Added classmethod `Progress.get_default_columns()` to get the default list of progress bar columns https://github.com/Textualize/rich/pull/1894 + +### Fixed + +- Fixed performance issue in measuring text + +### Fixed + +- Fixed test failures on PyPy3 https://github.com/Textualize/rich/pull/1904 + +## [11.1.0] - 2022-01-28 + +### Added + +- Workaround for edge case of object from Faiss with no `__class__` https://github.com/Textualize/rich/issues/1838 +- Add Traditional Chinese readme +- Add `Syntax.guess_lexer`, add support for more lexers (e.g. Django templates etc.) https://github.com/Textualize/rich/pull/1869 +- Add `lexer` parameter to `Syntax.from_path` to allow for overrides https://github.com/Textualize/rich/pull/1873 + +### Fixed + +- Workaround for edge case of object from Faiss with no `__class__` https://github.com/Textualize/rich/issues/1838 +- Ensure `Syntax` always justifies left https://github.com/Textualize/rich/pull/1872 +- Handle classes in inspect when methods=True https://github.com/Textualize/rich/pull/1874 + +## [11.0.0] - 2022-01-09 + +### Added + +- Added max_depth arg to pretty printing https://github.com/Textualize/rich/issues/1585 +- Added `vertical_align` to Table.add_row https://github.com/Textualize/rich/issues/1590 + +### Fixed + +- Fixed issue with pretty repr in jupyter notebook https://github.com/Textualize/rich/issues/1717 +- Fix Traceback theme defaults override user supplied styles https://github.com/Textualize/rich/issues/1786 + +### Changed + +- **breaking** Deprecated rich.console.RenderGroup, now named rich.console.Group +- **breaking** `Syntax.__init__` parameter `lexer_name` renamed to `lexer` +- Syntax constructor accepts both str and now a pygments lexer https://github.com/Textualize/rich/pull/1748 + +## [10.16.2] - 2021-01-02 + +### Fixed + +- Fixed @ not being escaped in markup + +## [10.16.1] - 2021-12-15 + +### Fixed + +- Fixed issues with overlapping tags https://github.com/willmcgugan/rich/issues/1755 + +## [10.16.0] - 2021-12-12 + +### Fixed + +- Double print of progress bar in Jupyter https://github.com/willmcgugan/rich/issues/1737 + +### Added + +- Added Text.markup property https://github.com/willmcgugan/rich/issues/1751 + +## [10.15.2] - 2021-12-02 + +### Fixed + +- Deadlock issue https://github.com/willmcgugan/rich/issues/1734 + +## [10.15.1] - 2021-11-29 + +### Fixed + +- Reverted thread-safety fix for Live that introduced deadlock potential + +## [10.15.0] - 2021-11-28 + +### Added + +- Added dynamic_progress.py to examples +- Added ConsoleOptions.update_height +- Fixed Padding not respecting height + +### Changed + +- Some optimizations for simple strings (with only single cell widths) + +### Fixed + +- Fixed issue with progress bar not rendering markup https://github.com/willmcgugan/rich/issues/1721 +- Fixed race condition when exiting Live https://github.com/willmcgugan/rich/issues/1530 + +## [10.14.0] - 2021-11-16 + +### Fixed + +- Fixed progress speed not updating when total doesn't change +- Fixed superfluous new line in Status https://github.com/willmcgugan/rich/issues/1662 +- Fixed Windows legacy width again +- Fixed infinite loop in set_cell_size https://github.com/willmcgugan/rich/issues/1682 + +### Added + +- Added file protocol to URL highlighter https://github.com/willmcgugan/rich/issues/1681 +- Added rich.protocol.rich_cast + +### Changed + +- Allowed `__rich__` to work recursively +- Allowed Text classes to work with sep in print https://github.com/willmcgugan/rich/issues/1689 + +### Added + +- Added a `rich.text.Text.from_ansi` helper method for handling pre-formatted input strings https://github.com/willmcgugan/rich/issues/1670 + +## [10.13.0] - 2021-11-07 + +### Added + +- Added json.dumps parameters to print_json https://github.com/willmcgugan/rich/issues/1638 + +### Fixed + +- Fixed an edge case bug when console module try to detect if they are in a tty at the end of a pytest run +- Fixed a bug where logging handler raises an exception when running with pythonw (related to https://bugs.python.org/issue13807) +- Fixed issue with TERM env vars that have more than one hyphen https://github.com/willmcgugan/rich/issues/1640 +- Fixed missing new line after progress bar when terminal is not interactive https://github.com/willmcgugan/rich/issues/1606 +- Fixed exception in IPython when disabling pprint with %pprint https://github.com/willmcgugan/rich/issues/1646 +- Fixed issue where values longer than the console width produced invalid JSON https://github.com/willmcgugan/rich/issues/1653 +- Fixes trailing comma when pretty printing dataclass with last field repr=False https://github.com/willmcgugan/rich/issues/1599 + +## Changed + +- Markdown codeblocks now word-wrap https://github.com/willmcgugan/rich/issues/1515 + +## [10.12.0] - 2021-10-06 + +### Updated + +- Official Py3.10 release + +### Fixed + +- Fixed detection of custom repr when pretty printing dataclasses + +## [10.11.0] - 2021-09-24 + +### Added + +- Added `suppress` parameter to tracebacks +- Added `max_frames` parameter to tracebacks + +## [10.10.0] - 2021-09-18 + +### Added + +- Added stdin support to `rich.json` + +### Fixed + +- Fixed pretty printing of objects with fo magic with **getattr** https://github.com/willmcgugan/rich/issues/1492 + +## [10.9.0] - 2021-08-29 + +### Added + +- Added data parameter to print_json method / function +- Added an --indent parameter to python -m rich.json + +### Changed + +- Changed default indent of JSON to 2 (down from 4) +- Changed highlighting of JSON keys to new style (bold blue) + +## [10.8.0] - 2021-08-28 + +### Added + +- Added Panel.subtitle +- Added Panel.subtitle_align +- Added rich.json.JSON +- Added rich.print_json and Console.print_json + +### Fixed + +- Fixed a bug where calling `rich.reconfigure` within a `pytest_configure` hook would lead to a crash +- Fixed highlight not being passed through options https://github.com/willmcgugan/rich/issues/1404 + +## [10.7.0] - 2021-08-05 + +### Added + +- Added Text.apply_meta +- Added meta argument to Text.assemble +- Added Style.from_meta +- Added Style.on +- Added Text.on + +### Changed + +- Changed `RenderGroup` to `Group` and `render_group` to `group` (old names remain for compatibility but will be deprecated in the future) +- Changed `rich.repr.RichReprResult` to `rich.repr.Result` (old names remain for compatibility but will be deprecated in the future) +- Changed meta serialization to use pickle rather than marshal to permit callables + +## [10.6.0] - 2021-07-12 + +### Deprecated + +- Added deprecation warning for tabulate_mapping which will be removed in v11.0.0 + +### Added + +- Added precision argument to filesize.decimal +- Added separator argument to filesize.decimal +- Added \_rich_traceback_guard to Traceback +- Added emoji_variant to Console +- Added -emoji and -text variant selectors to emoji code + +### Fixed + +- Fixed issue with adjoining color tags https://github.com/willmcgugan/rich/issues/1334 + +### Changed + +- Changed Console.size to use unproxied stdin and stdout + +## [10.5.0] - 2021-07-05 + +### Fixed + +- Fixed Pandas objects not pretty printing https://github.com/willmcgugan/rich/issues/1305 +- Fixed https://github.com/willmcgugan/rich/issues/1256 +- Fixed typing with rich.repr.auto decorator +- Fixed repr error formatting https://github.com/willmcgugan/rich/issues/1326 + +### Added + +- Added new_line_start argument to Console.print +- Added Segment.divide method +- Added Segment.split_cells method +- Added segment.SegmentLines class + +## [10.4.0] - 2021-06-18 + +### Added + +- Added Style.meta +- Added rich.repr.auto decorator + +### Fixed + +- Fixed error pretty printing classes with special **rich_repr** method + +## [10.3.0] - 2021-06-09 + +### Added + +- Added Console.size setter +- Added Console.width setter +- Added Console.height setter +- Added angular style Rich reprs +- Added an IPython extension. Load via `%load_ext rich` + +### Changed + +- Changed the logic for retrieving the calling frame in console logs to a faster one for the Python implementations that support it. + +## [10.2.2] - 2021-05-19 + +### Fixed + +- Fixed status not rendering console markup https://github.com/willmcgugan/rich/issues/1244 + +## [10.2.1] - 2021-05-17 + +### Fixed + +- Fixed panel in Markdown exploding https://github.com/willmcgugan/rich/issues/1234 + +## [10.2.0] - 2021-05-12 + +### Added + +- Added syntax for call, i.e. "Foo(bar)" +- Added Console.measure as a convenient alias for Measurement.get +- Added support for pretty printing attrs objects +- Added mappingproxy to pretty print +- Added UserDict and UserList support to pretty printer + +### Changed + +- Changed colorama init to set strip=False +- Changed highlighter for False, True, None to not match in the middle of a word. i.e. NoneType is no longer highlighted as None + +### Fixed + +- Fixed initial blank lines removed from Syntax https://github.com/willmcgugan/rich/issues/1214 + +## [10.1.0] - 2021-04-03 + +### Fixed + +- Fixed support for jupyter qtconsole and similar Jupyter environments + +## [10.0.1] - 2021-03-30 + +### Fixed + +- Fixed race condition that duplicated lines in progress https://github.com/willmcgugan/rich/issues/1144 + +## [10.0.0] - 2021-03-27 + +### Changed + +- Made pydoc import lazy as at least one use found it slow to import https://github.com/willmcgugan/rich/issues/1104 +- Modified string highlighting to not match in the middle of a word, so that apostrophes are not considered strings +- New way of encoding control codes in Segment +- New signature for Control class +- Changed Layout.split to use new Splitter class +- Improved layout.tree +- Changed default theme color for repr.number to cyan +- `__rich_measure__` signature changed to accept ConsoleOptions rather than max_width +- `text` parameter to rich.spinner.Spinner changed to RenderableType + +### Added + +- Added `__rich_repr__` protocol method to Pretty +- Added rich.region.Region +- Added ConsoleOptions.update_dimensions +- Added rich.console.ScreenUpdate +- Added Console.is_alt_screen +- Added Control.segment, Control.bell, Control.home, Control.move_to, Control.clear, Control.show_cursor, Control.alt_screen +- Added Console.update_screen and Console.update_screen_lines +- Added Layout.add_split, Layout.split_column, Layout.split_row, layout.refresh +- Added new Rich repr protocol `__rich_repr__` + +### Fixed + +- Fixed table style taking precedence over row style https://github.com/willmcgugan/rich/issues/1129 +- Fixed incorrect measurement of Text with new lines and whitespace https://github.com/willmcgugan/rich/issues/1133 +- Made type annotations consistent for various `total` keyword arguments in `rich.progress` and rich.`progress_bar` +- Disabled Progress no longer displays itself when starting https://github.com/willmcgugan/rich/pull/1125 +- Animations no longer reset when updating rich.status.Status + +## [9.13.0] - 2021-03-06 + +### Added + +- Pretty printer now supports dataclasses + +### Fixed + +- Fixed Syntax background https://github.com/willmcgugan/rich/issues/1088 +- Fix for double tracebacks when no formatter https://github.com/willmcgugan/rich/issues/1079 + +### Changed + +- Added ws and wss to url highlighter + +## [9.12.4] - 2021-03-01 + +### Fixed + +- Fixed custom formatters with rich tracebacks in RichHandler https://github.com/willmcgugan/rich/issues/1079 + +### Changed + +- Allow highly compressed table cells to go to 0 width +- Optimization to remove empty styles in various places + +## [9.12.3] - 2021-02-28 + +### Changed + +- Optimized Padding + +## [9.12.2] - 2021-02-27 + +### Added + +- Added ConsoleOptions.copy + +### Changed + +- Optimized ConsoleOptions.update + +## [9.12.1] - 2021-02-27 + +### Fixed + +- Fixed deadlock in Progress https://github.com/willmcgugan/rich/issues/1061 + +### Added + +- Added Task.finished_speed + +### Changed + +- Froze TransferSpeedColumn speed when task is finished +- Added SIGINT handler to downloader.py example +- Optimization for large tables + +## [9.12.0] - 2021-02-24 + +### Fixed + +- Fixed issue with Syntax and missing lines in Layout https://github.com/willmcgugan/rich/issues/1050 +- Fixed issue with nested markdown elements https://github.com/willmcgugan/rich/issues/1036 +- Fixed new lines not invoking render hooks https://github.com/willmcgugan/rich/issues/1052 +- Fixed Align setting height to child https://github.com/willmcgugan/rich/issues/1057 + +### Changed + +- Printing a table with no columns now result in a blank line https://github.com/willmcgugan/rich/issues/1044 + +### Added + +- Added height to Panel + +## [9.11.1] - 2021-02-20 + +### Fixed + +- Fixed table with expand=False not expanding when justify="center" +- Fixed single renderable in Layout not respecting height +- Fixed COLUMNS and LINES env var https://github.com/willmcgugan/rich/issues/1019 +- Layout now respects minimum_size when fixes sizes are greater than available space +- HTML export now changes link underline score to match terminal https://github.com/willmcgugan/rich/issues/1009 + +### Changed + +- python -m rich.markdown and rich.syntax show usage with no file + +### Added + +- Added height parameter to Layout +- Added python -m rich.segment + +## [9.11.0] - 2021-02-15 + +### Fixed + +- Fixed error message for tracebacks with broken `__str__` https://github.com/willmcgugan/rich/issues/980 +- Fixed markup edge case https://github.com/willmcgugan/rich/issues/987 + +### Added + +- Added cheeky sponsorship request to test card +- Added `quiet` argument to Console constructor +- Added support for a callback function to format timestamps (allows presentation of milliseconds) +- Added Console.set_alt_screen and Console.screen +- Added height to ConsoleOptions +- Added `vertical` parameter to Align +- Added Layout class + +### Changed + +- Pretty.overflow now defaults to None +- Panel now respects options.height +- Traceback lexer defaults to Python if no extension on source +- Added ConsoleDimensions size attribute to ConsoleOptions so that size can't change mid-render + +## [9.10.0] - 2021-01-27 + +### Changed + +- Some optimizations for Text +- Further optimized Tracebacks by not tokenizing code more that necessary +- Table Column.header_style and Column.footer_style are now added to Table header/footer style + +## [9.9.0] - 2021-01-23 + +### Changed + +- Extended Windows palette to 16 colors +- Modified windows palette to Windows 10 colors +- Change regex for attrib_name to be more performant +- Optimized traceback generation + +### Fixed + +- Fix double line tree guides on Windows +- Fixed Tracebacks ignoring initial blank lines +- Partial fix for tracebacks not finding source after chdir +- Fixed error message when code in tracebacks doesn't have an extension https://github.com/willmcgugan/rich/issues/996 + +### Added + +- Added post_style argument to Segment.apply_style + +## [9.8.2] - 2021-01-15 + +### Fixed + +- Fixed deadlock in live https://github.com/willmcgugan/rich/issues/927 + +## [9.8.1] - 2021-01-13 + +### Fixed + +- Fixed rich.inspect failing with attributes that claim to be callable but aren't https://github.com/willmcgugan/rich/issues/916 + +## [9.8.0] - 2021-01-11 + +### Added + +- Added **rich_measure** for tree +- Added rich.align.VerticalCenter + +### Changed + +- The `style` argument on Align now applies to background only +- Changed display of progress bars in no_color mode for clarity +- Console property `size` will fall back to getting the terminal size of stdout it stdin fails, this allows size to be correctly determined when piping + +### Fixed + +- Fixed panel cropping when shrunk too bar +- Allow passing markdown over STDIN when using `python -m rich.markdown` +- Fix printing MagicMock.mock_calls https://github.com/willmcgugan/rich/issues/903 + +## [9.7.0] - 2021-01-09 + +### Added + +- Added rich.tree +- Added no_color argument to Console + +## [9.6.2] - 2021-01-07 + +### Fixed + +- Fixed markup escaping edge case https://github.com/willmcgugan/rich/issues/878 +- Double tag escape, i.e. `"\\[foo]"` results in a backslash plus `[foo]` tag +- Fixed header_style not applying to headers in positional args https://github.com/willmcgugan/rich/issues/953 + +## [9.6.1] - 2020-12-31 + +### Fixed + +- Fixed encoding error on Windows when loading code for Tracebacks + +## [9.6.0] - 2020-12-30 + +### Changed + +- MarkupError exception raise from None to omit internal exception +- Factored out RichHandler.render and RichHandler.render_message for easier extending +- Display pretty printed value in rich.inspect + +### Added + +- Added Progress.TimeElapsedColumn +- Added IPython support to pretty.install + +### Fixed + +- Fixed display of locals in Traceback for stdin + +## [9.5.1] - 2020-12-19 + +### Fixed + +- Fixed terminal size detection on Windows https://github.com/willmcgugan/rich/issues/836 +- Fixed hex number highlighting + +## [9.5.0] - 2020-12-18 + +### Changed + +- If file is not specified on Console then the Console.file will return the current sys.stdout. Prior to 9.5.0 sys.stdout was cached on the Console, which could break code that wrapped sys.stdout after the Console was constructed. +- Changed `Color.__str__` to not include ansi codes +- Changed Console.size to get the terminal dimensions via sys.stdin. This means that if you set file to be an io.StringIO file then the width will be set to the current terminal dimensions and not a default of 80. + +### Added + +- Added stderr parameter to Console +- Added rich.reconfigure +- Added `Color.__rich__` +- Added Console.soft_wrap +- Added Console.style parameter +- Added Table.highlight parameter to enable highlighting of cells +- Added Panel.highlight parameter to enable highlighting of panel title +- Added highlight to ConsoleOptions + +### Fixed + +- Fixed double output in rich.live https://github.com/willmcgugan/rich/issues/485 +- Fixed Console.out highlighting not reflecting defaults https://github.com/willmcgugan/rich/issues/827 +- FileProxy now raises TypeError for empty non-str arguments https://github.com/willmcgugan/rich/issues/828 + +## [9.4.0] - 2020-12-12 + +### Added + +- Added rich.live https://github.com/willmcgugan/rich/pull/382 +- Added algin parameter to Rule and Console.rule +- Added rich.Status class and Console.status +- Added getitem to Text +- Added style parameter to Console.log +- Added rich.diagnose command + +### Changed + +- Table.add_row style argument now applies to entire line and not just cells +- Added end_section parameter to Table.add_row to force a line underneath row + +## Fixed + +- Fixed suppressed traceback context https://github.com/willmcgugan/rich/issues/468 + +## [9.3.0] - 2020-12-1 + +### Added - Added get_datetime parameter to Console, to allow for repeatable tests - Added get_time parameter to Console @@ -25,6 +752,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed redirecting of stderr in Progress - Fixed broken expanded tuple of one https://github.com/willmcgugan/rich/issues/445 +- Fixed traceback message with `from` exceptions - Fixed justify argument not working in console.log https://github.com/willmcgugan/rich/issues/460 ## [9.2.0] - 2020-11-08 @@ -106,7 +834,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [8.0.0] - 2020-10-03 -### Added +### Added - Added Console.bell method - Added Set to types that Console.print will automatically pretty print @@ -131,7 +859,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added Console.begin_capture, Console.end_capture and Console.capture - Added Table.title_justify and Table.caption_justify https://github.com/willmcgugan/rich/issues/301 -### Changed +### Changed - Improved formatting of exceptions - Enabled Rich exceptions in logging https://github.com/taliraj @@ -150,7 +878,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added Text.remove_suffix - Added Text.append_tokens -### Changed +### Changed - Text.tabs_to_spaces was renamed to Text.expand_tabs, which works in place rather than returning a new instance - Renamed Column.index to Column.\_index @@ -434,7 +1162,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr ## [3.0.2] - 2020-07-02 -### Added +### Added - Added rich.styled.Styled class to apply styles to renderable - Table.add_row now has an optional style parameter @@ -547,7 +1275,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr - Added 'transient' option to Progress -### Changed +### Changed - Truncated overly long text in Rule with ellipsis overflow @@ -669,7 +1397,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr - Optimizations for Segment, Console and Table -### Added +### Added - Added Console.clear method - Added exporting of links to HTML @@ -691,7 +1419,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr ## [1.1.6] - 2020-05-17 -### Added +### Added - Added rich.align.Align class - Added justify argument to Console.print and console.log @@ -710,7 +1438,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr - Fixes for legacy windows: Bar, Panel, and Rule now use ASCII characters - show_cursor is now a no-op on legacy windows -### Added +### Added - Added Console.input @@ -972,7 +1700,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr ### Fixed -- Readme links in Pypi +- Readme links in PyPI ## [0.4.0] - 2020-02-22 @@ -1011,3 +1739,150 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr ### Added - First official release, API still to be stabilized + +[unreleased]: https://github.com/willmcgugan/rich/compare/v12.4.1...HEAD +[12.4.1]: https://github.com/willmcgugan/rich/compare/v12.4.0...v12.4.1 +[12.4.0]: https://github.com/willmcgugan/rich/compare/v12.3.0...v12.4.0 +[12.3.0]: https://github.com/willmcgugan/rich/compare/v12.2.0...v12.3.0 +[12.2.0]: https://github.com/willmcgugan/rich/compare/v12.1.0...v12.2.0 +[12.1.0]: https://github.com/willmcgugan/rich/compare/v12.0.1...v12.1.0 +[12.0.1]: https://github.com/willmcgugan/rich/compare/v12.0.0...v12.0.1 +[12.0.0]: https://github.com/willmcgugan/rich/compare/v11.2.0...v12.0.0 +[11.2.0]: https://github.com/willmcgugan/rich/compare/v11.1.0...v11.2.0 +[11.1.0]: https://github.com/willmcgugan/rich/compare/v11.0.0...v11.1.0 +[11.0.0]: https://github.com/willmcgugan/rich/compare/v10.16.1...v11.0.0 +[10.16.2]: https://github.com/willmcgugan/rich/compare/v10.16.1...v10.16.2 +[10.16.1]: https://github.com/willmcgugan/rich/compare/v10.16.0...v10.16.1 +[10.16.0]: https://github.com/willmcgugan/rich/compare/v10.15.2...v10.16.0 +[10.15.2]: https://github.com/willmcgugan/rich/compare/v10.15.1...v10.15.2 +[10.15.1]: https://github.com/willmcgugan/rich/compare/v10.15.0...v10.15.1 +[10.15.0]: https://github.com/willmcgugan/rich/compare/v10.14.0...v10.15.0 +[10.14.0]: https://github.com/willmcgugan/rich/compare/v10.13.0...v10.14.0 +[10.13.0]: https://github.com/willmcgugan/rich/compare/v10.12.0...v10.13.0 +[10.12.0]: https://github.com/willmcgugan/rich/compare/v10.11.0...v10.12.0 +[10.11.0]: https://github.com/willmcgugan/rich/compare/v10.10.0...v10.11.0 +[10.10.0]: https://github.com/willmcgugan/rich/compare/v10.9.0...v10.10.0 +[10.9.0]: https://github.com/willmcgugan/rich/compare/v10.8.0...v10.9.0 +[10.8.0]: https://github.com/willmcgugan/rich/compare/v10.7.0...v10.8.0 +[10.7.0]: https://github.com/willmcgugan/rich/compare/v10.6.0...v10.7.0 +[10.6.0]: https://github.com/willmcgugan/rich/compare/v10.5.0...v10.6.0 +[10.5.0]: https://github.com/willmcgugan/rich/compare/v10.4.0...v10.5.0 +[10.4.0]: https://github.com/willmcgugan/rich/compare/v10.3.0...v10.4.0 +[10.3.0]: https://github.com/willmcgugan/rich/compare/v10.2.2...v10.3.0 +[10.2.2]: https://github.com/willmcgugan/rich/compare/v10.2.1...v10.2.2 +[10.2.1]: https://github.com/willmcgugan/rich/compare/v10.2.0...v10.2.1 +[10.2.0]: https://github.com/willmcgugan/rich/compare/v10.1.0...v10.2.0 +[10.1.0]: https://github.com/willmcgugan/rich/compare/v10.0.1...v10.1.0 +[10.0.1]: https://github.com/willmcgugan/rich/compare/v10.0.0...v10.0.1 +[10.0.0]: https://github.com/willmcgugan/rich/compare/v9.13.0...v10.0.0 +[9.13.0]: https://github.com/willmcgugan/rich/compare/v9.12.4...v9.13.0 +[9.12.4]: https://github.com/willmcgugan/rich/compare/v9.12.3...v9.12.4 +[9.12.3]: https://github.com/willmcgugan/rich/compare/v9.12.2...v9.12.3 +[9.12.2]: https://github.com/willmcgugan/rich/compare/v9.12.1...v9.12.2 +[9.12.1]: https://github.com/willmcgugan/rich/compare/v9.12.0...v9.12.1 +[9.12.0]: https://github.com/willmcgugan/rich/compare/v9.11.1...v9.12.0 +[9.11.1]: https://github.com/willmcgugan/rich/compare/v9.11.0...v9.11.1 +[9.11.0]: https://github.com/willmcgugan/rich/compare/v9.10.0...v9.11.0 +[9.10.0]: https://github.com/willmcgugan/rich/compare/v9.9.0...v9.10.0 +[9.9.0]: https://github.com/willmcgugan/rich/compare/v9.8.2...v9.9.0 +[9.8.2]: https://github.com/willmcgugan/rich/compare/v9.8.1...v9.8.2 +[9.8.1]: https://github.com/willmcgugan/rich/compare/v9.8.0...v9.8.1 +[9.8.0]: https://github.com/willmcgugan/rich/compare/v9.7.0...v9.8.0 +[9.7.0]: https://github.com/willmcgugan/rich/compare/v9.6.2...v9.7.0 +[9.6.2]: https://github.com/willmcgugan/rich/compare/v9.6.1...v9.6.2 +[9.6.1]: https://github.com/willmcgugan/rich/compare/v9.6.0...v9.6.1 +[9.6.0]: https://github.com/willmcgugan/rich/compare/v9.5.1...v9.6.0 +[9.5.1]: https://github.com/willmcgugan/rich/compare/v9.5.0...v9.5.1 +[9.5.0]: https://github.com/willmcgugan/rich/compare/v9.4.0...v9.5.0 +[9.4.0]: https://github.com/willmcgugan/rich/compare/v9.3.0...v9.4.0 +[9.3.0]: https://github.com/willmcgugan/rich/compare/v9.2.0...v9.3.0 +[9.2.0]: https://github.com/willmcgugan/rich/compare/v9.1.0...v9.2.0 +[9.1.0]: https://github.com/willmcgugan/rich/compare/v9.0.1...v9.1.0 +[9.0.1]: https://github.com/willmcgugan/rich/compare/v9.0.0...v9.0.1 +[9.0.0]: https://github.com/willmcgugan/rich/compare/v8.0.0...v9.0.0 +[8.0.0]: https://github.com/willmcgugan/rich/compare/v7.1.0...v8.0.0 +[7.1.0]: https://github.com/willmcgugan/rich/compare/v7.0.0...v7.1.0 +[7.0.0]: https://github.com/willmcgugan/rich/compare/v6.2.0...v7.0.0 +[6.2.0]: https://github.com/willmcgugan/rich/compare/v6.1.2...v6.2.0 +[6.1.2]: https://github.com/willmcgugan/rich/compare/v6.1.1...v6.1.2 +[6.1.1]: https://github.com/willmcgugan/rich/compare/v6.1.0...v6.1.1 +[6.1.0]: https://github.com/willmcgugan/rich/compare/v6.0.0...v6.1.0 +[6.0.0]: https://github.com/willmcgugan/rich/compare/v5.2.1...v6.0.0 +[5.2.1]: https://github.com/willmcgugan/rich/compare/v5.2.0...v5.2.1 +[5.2.0]: https://github.com/willmcgugan/rich/compare/v5.1.2...v5.2.0 +[5.1.2]: https://github.com/willmcgugan/rich/compare/v5.1.1...v5.1.2 +[5.1.1]: https://github.com/willmcgugan/rich/compare/v5.1.0...v5.1.1 +[5.1.0]: https://github.com/willmcgugan/rich/compare/v5.0.0...v5.1.0 +[5.0.0]: https://github.com/willmcgugan/rich/compare/v4.2.2...v5.0.0 +[4.2.2]: https://github.com/willmcgugan/rich/compare/v4.2.1...v4.2.2 +[4.2.1]: https://github.com/willmcgugan/rich/compare/v4.2.0...v4.2.1 +[4.2.0]: https://github.com/willmcgugan/rich/compare/v4.1.0...v4.2.0 +[4.1.0]: https://github.com/willmcgugan/rich/compare/v4.0.0...v4.1.0 +[4.0.0]: https://github.com/willmcgugan/rich/compare/v3.4.1...v4.0.0 +[3.4.1]: https://github.com/willmcgugan/rich/compare/v3.4.0...v3.4.1 +[3.4.0]: https://github.com/willmcgugan/rich/compare/v3.3.2...v3.4.0 +[3.3.2]: https://github.com/willmcgugan/rich/compare/v3.3.1...v3.3.2 +[3.3.1]: https://github.com/willmcgugan/rich/compare/v3.3.0...v3.3.1 +[3.3.0]: https://github.com/willmcgugan/rich/compare/v3.2.0...v3.3.0 +[3.2.0]: https://github.com/willmcgugan/rich/compare/v3.1.0...v3.2.0 +[3.1.0]: https://github.com/willmcgugan/rich/compare/v3.0.5...v3.1.0 +[3.0.5]: https://github.com/willmcgugan/rich/compare/v3.0.4...v3.0.5 +[3.0.4]: https://github.com/willmcgugan/rich/compare/v3.0.3...v3.0.4 +[3.0.3]: https://github.com/willmcgugan/rich/compare/v3.0.2...v3.0.3 +[3.0.2]: https://github.com/willmcgugan/rich/compare/v3.0.1...v3.0.2 +[3.0.1]: https://github.com/willmcgugan/rich/compare/v3.0.0...v3.0.1 +[3.0.0]: https://github.com/willmcgugan/rich/compare/v2.3.1...v3.0.0 +[2.3.1]: https://github.com/willmcgugan/rich/compare/v2.3.0...v2.3.1 +[2.3.0]: https://github.com/willmcgugan/rich/compare/v2.2.6...v2.3.0 +[2.2.6]: https://github.com/willmcgugan/rich/compare/v2.2.5...v2.2.6 +[2.2.5]: https://github.com/willmcgugan/rich/compare/v2.2.4...v2.2.5 +[2.2.4]: https://github.com/willmcgugan/rich/compare/v2.2.3...v2.2.4 +[2.2.3]: https://github.com/willmcgugan/rich/compare/v2.2.2...v2.2.3 +[2.2.2]: https://github.com/willmcgugan/rich/compare/v2.2.1...v2.2.2 +[2.2.1]: https://github.com/willmcgugan/rich/compare/v2.2.0...v2.2.1 +[2.2.0]: https://github.com/willmcgugan/rich/compare/v2.1.0...v2.2.0 +[2.1.0]: https://github.com/willmcgugan/rich/compare/v2.0.1...v2.1.0 +[2.0.1]: https://github.com/willmcgugan/rich/compare/v2.0.0...v2.0.1 +[2.0.0]: https://github.com/willmcgugan/rich/compare/v1.3.1...v2.0.0 +[1.3.1]: https://github.com/willmcgugan/rich/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/willmcgugan/rich/compare/v1.2.3...v1.3.0 +[1.2.3]: https://github.com/willmcgugan/rich/compare/v1.2.2...v1.2.3 +[1.2.2]: https://github.com/willmcgugan/rich/compare/v1.2.1...v1.2.2 +[1.2.1]: https://github.com/willmcgugan/rich/compare/v1.2.0...v1.2.1 +[1.2.0]: https://github.com/willmcgugan/rich/compare/v1.1.9...v1.2.0 +[1.1.9]: https://github.com/willmcgugan/rich/compare/v1.1.8...v1.1.9 +[1.1.8]: https://github.com/willmcgugan/rich/compare/v1.1.7...v1.1.8 +[1.1.7]: https://github.com/willmcgugan/rich/compare/v1.1.6...v1.1.7 +[1.1.6]: https://github.com/willmcgugan/rich/compare/v1.1.5...v1.1.6 +[1.1.5]: https://github.com/willmcgugan/rich/compare/v1.1.4...v1.1.5 +[1.1.4]: https://github.com/willmcgugan/rich/compare/v1.1.3...v1.1.4 +[1.1.3]: https://github.com/willmcgugan/rich/compare/v1.1.2...v1.1.3 +[1.1.2]: https://github.com/willmcgugan/rich/compare/v1.1.1...v1.1.2 +[1.1.1]: https://github.com/willmcgugan/rich/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/willmcgugan/rich/compare/v1.0.3...v1.1.0 +[1.0.3]: https://github.com/willmcgugan/rich/compare/v1.0.2...v1.0.3 +[1.0.2]: https://github.com/willmcgugan/rich/compare/v1.0.1...v1.0.2 +[1.0.1]: https://github.com/willmcgugan/rich/compare/v1.0.0...v1.0.1 +[1.0.0]: https://github.com/willmcgugan/rich/compare/v0.8.13...v1.0.0 +[0.8.13]: https://github.com/willmcgugan/rich/compare/v0.8.12...v0.8.13 +[0.8.12]: https://github.com/willmcgugan/rich/compare/v0.8.11...v0.8.12 +[0.8.11]: https://github.com/willmcgugan/rich/compare/v0.8.10...v0.8.11 +[0.8.10]: https://github.com/willmcgugan/rich/compare/v0.8.9...v0.8.10 +[0.8.9]: https://github.com/willmcgugan/rich/compare/v0.8.8...v0.8.9 +[0.8.8]: https://github.com/willmcgugan/rich/compare/v0.8.7...v0.8.8 +[0.8.7]: https://github.com/willmcgugan/rich/compare/v0.8.6...v0.8.7 +[0.8.6]: https://github.com/willmcgugan/rich/compare/v0.8.5...v0.8.6 +[0.8.5]: https://github.com/willmcgugan/rich/compare/v0.8.4...v0.8.5 +[0.8.4]: https://github.com/willmcgugan/rich/compare/v0.8.3...v0.8.4 +[0.8.3]: https://github.com/willmcgugan/rich/compare/v0.8.2...v0.8.3 +[0.8.2]: https://github.com/willmcgugan/rich/compare/v0.8.1...v0.8.2 +[0.8.1]: https://github.com/willmcgugan/rich/compare/v0.8.0...v0.8.1 +[0.8.0]: https://github.com/willmcgugan/rich/compare/v0.7.2...v0.8.0 +[0.7.2]: https://github.com/willmcgugan/rich/compare/v0.7.1...v0.7.2 +[0.7.1]: https://github.com/willmcgugan/rich/compare/v0.7.0...v0.7.1 +[0.7.0]: https://github.com/willmcgugan/rich/compare/v0.6.0...v0.7.0 +[0.6.0]: https://github.com/willmcgugan/rich/compare/v0.5.0...v0.6.0 +[0.5.0]: https://github.com/willmcgugan/rich/compare/v0.4.1...v0.5.0 +[0.4.1]: https://github.com/willmcgugan/rich/compare/v0.4.0...v0.4.1 +[0.4.0]: https://github.com/willmcgugan/rich/compare/v0.3.3...v0.4.0 +[0.3.3]: https://github.com/willmcgugan/rich/compare/v0.3.2...v0.3.3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b9650ceee2..2cd9ccaa4a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,13 +1,24 @@ # Contributing to Rich -This project welcomes contributions in the form of Pull Requests. For clear bug-fixes / typos etc. just submit a PR. For new features or if there is any doubt in how to fix a bug, you might want to open an issue prior to starting work, or email willmcgugan+rich@gmail.com to discuss it first. +This project welcomes contributions in the form of Pull Requests. +For clear bug-fixes / typos etc. just submit a PR. +For new features or if there is any doubt in how to fix a bug, you might want +to open an issue prior to starting work, or email willmcgugan+rich@gmail.com +to discuss it first. ## Development Environment -To start developing with Rich, first create a _virtual environment_ then run the following to install development requirements: +Rich uses [poetry](https://python-poetry.org/docs/) for packaging and +dependency management. To start developing with Rich, install Poetry +using the [recommended method](https://python-poetry.org/docs/#installation) or run: + +``` +pip install poetry +``` + +Once Poetry is installed, install the dependencies with the following command: ``` -pip install -r requirements-dev.txt poetry install ``` @@ -19,7 +30,7 @@ Run tests with the following command: make test ``` -Or if you don't have make, run the following: +Or if you don't have `make`, run the following: ``` pytest --cov-report term-missing --cov=rich tests/ -vv @@ -29,7 +40,8 @@ New code should ideally have tests and not break existing tests. ### Type Checking -Rich uses type annotations throughout, and `mypy` to do the checking. Run the following to type check Rich: +Rich uses type annotations throughout, and `mypy` to do the checking. +Run the following to type check Rich: ``` make typecheck @@ -38,7 +50,7 @@ make typecheck Or if you don't have `make`: ``` -mypy -p rich --ignore-missing-imports --warn-unreachable +mypy -p rich --config-file= --ignore-missing-imports --no-implicit-optional --warn-unreachable ``` Please add type annotations for all new code. @@ -49,4 +61,4 @@ Rich uses [`black`](https://github.com/psf/black) for code formatting. I recommend setting up black in your editor to format on save. To run black from the command line, use `make format-check` to check your formatting, -and use `make format` to format and write to the files. \ No newline at end of file +and use `make format` to format and write to the files. diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index de322cbf7e..c24f21b1a6 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -4,6 +4,39 @@ The following people have contributed to the development of Rich: +- [Patrick Arminio](https://github.com/patrick91) +- [Gregory Beauregard](https://github.com/GBeauregard/pyffstream) +- [Dennis Brakhane](https://github.com/brakhane) +- [Darren Burns](https://github.com/darrenburns) +- [Ed Davis](https://github.com/davised) +- [Pete Davison](https://github.com/pd93) +- [James Estevez](https://github.com/jstvz) - [Oleksis Fraga](https://github.com/oleksis) +- [Michał Górny](https://github.com/mgorny) +- [Leron Gray](https://github.com/daddycocoaman) +- [Kenneth Hoste](https://github.com/boegel) +- [Finn Hughes](https://github.com/finnhughes) +- [Josh Karpel](https://github.com/JoshKarpel) +- [Andrew Kettmann](https://github.com/akettmann) +- [Martin Larralde](https://github.com/althonos) - [Hedy Li](https://github.com/hedythedev) +- [Luka Mamukashvili](https://github.com/UltraStudioLTD) +- [Alexander Mancevice](https://github.com/amancevice) - [Will McGugan](https://github.com/willmcgugan) +- [Paul McGuire](https://github.com/ptmcg) +- [Nathan Page](https://github.com/nathanrpage97) +- [Avi Perl](https://github.com/avi-perl) +- [Laurent Peuch](https://github.com/psycojoker) +- [Olivier Philippon](https://github.com/DrBenton) +- [Kylian Point](https://github.com/p0lux) +- [Kyle Pollina](https://github.com/kylepollina) +- [Clément Robert](https://github.com/neutrinoceros) +- [Brian Rutledge](https://github.com/bhrutledge) +- [Tushar Sadhwani](https://github.com/tusharsadhwani) +- [Paul Sanders](https://github.com/sanders41) +- [Tim Savage](https://github.com/timsavage) +- [Nicolas Simonds](https://github.com/0xDEC0DE) +- [Aaron Stephens](https://github.com/aaronst) +- [Gabriele N. Tornetta](https://github.com/p403n1x87) +- [Arian Mollik Wasi](https://github.com/wasi-master) +- [Handhika Yanuar Pratama](https://github.com/theDreamer911) diff --git a/LICENSE b/LICENSE index 8d9e799c3d..4415505566 100644 --- a/LICENSE +++ b/LICENSE @@ -1,8 +1,19 @@ -Copyright 2020 Will McGugan +Copyright (c) 2020 Will McGugan -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile index 6bed4f767b..1183bc00c8 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,13 @@ test: - pytest --cov-report term-missing --cov=rich tests/ -vv + TERM=unknown pytest --cov-report term-missing --cov=rich tests/ -vv format-check: black --check . format: black . typecheck: - mypy -p rich --ignore-missing-imports --warn-unreachable + mypy -p rich --no-incremental typecheck-report: - mypy -p rich --ignore-missing-imports --warn-unreachable --html-report mypy_report + mypy -p rich --html-report mypy_report .PHONY: docs docs: cd docs; make html diff --git a/README.cn.md b/README.cn.md index 1494c1ef3a..a5c7c5b66a 100644 --- a/README.cn.md +++ b/README.cn.md @@ -1,10 +1,26 @@ -# Rich - +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) [![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) [![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) [![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + Rich 是一个 Python 库,可以为您在终端中提供富文本和精美格式。 [Rich API](https://rich.readthedocs.io/en/latest/) 可以很容易的在终端输出添加各种颜色和不同风格。Rich 还可以绘制漂亮的表格,进度条,markdown,突出显示语法的源代码及回溯等等,不胜枚举。 @@ -23,10 +39,10 @@ Rich 还可以与[Jupyter 笔记本](https://jupyter.org/)一起使用,而无 ## 安装说明 -使用`pip`或其他 PyPi 软件包管理器进行安装。 +使用`pip`或其他 PyPI 软件包管理器进行安装。 -``` -pip install rich +```sh +python -m pip install rich ``` ## Rich 的打印功能 @@ -52,7 +68,7 @@ from rich.console import Console console = Console() ``` -Console 对象含有一个`print` 方法,它的界面与 python 内置的`print`功能界面相似。 +Console 对象含有一个`print`方法,它的界面与 python 内置的`print`功能界面相似。 您可以试试: @@ -148,7 +164,7 @@ table.add_column("Title") table.add_column("Production Budget", justify="right") table.add_column("Box Office", justify="right") table.add_row( - "Dev 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" ) table.add_row( "May 25, 2018", @@ -170,7 +186,7 @@ console.print(table) ![表格](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) -请注意,控制台标记的呈现方式与`print()`和`log()`相同。实际上,由 Rich 渲染的任何内容都可以添加到标题/行(甚至其他表格)中。 +请注意,控制台标记的呈现方式与`print()`和`log()`相同。实际上,由 Rich 渲染的任何内容都可以添加到标题/行(甚至其他表格)中。 `Table`类很聪明,可以调整列的大小以适合终端的可用宽度,并能根据需要环绕文本。下面是相同的示例,输出与比上表小的终端上: @@ -205,6 +221,7 @@ Rich 可以将内容通过排列整齐的,具有相等或最佳的宽度的[ ```python import os +import sys from rich import print from rich.columns import Columns @@ -221,7 +238,7 @@ print(Columns(directory)) Rich 可以呈现[markdown](https://rich.readthedocs.io/en/latest/markdown.html),并可相当不错的将其格式转移到终端。 -为了渲染 markdown,请导入`Markdown` 类,并使用包含 markdown 代码的字符串来构造它,然后将其打印到控制台。例子如下: +为了渲染 markdown,请导入`Markdown`类,并使用包含 markdown 代码的字符串来构造它,然后将其打印到控制台。例子如下: ```python from rich.console import Console @@ -277,30 +294,30 @@ Rich 可以渲染漂亮的回溯,比标准 Python 回溯更容易阅读,并 ![回溯](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) -## 使用Rich的项目 +## 使用 Rich 的项目 -这里是一些使用Rich的项目: +这里是一些使用 Rich 的项目: - [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) - 一个用于三维神经解剖数据可视化的python包 + 一个用于三维神经解剖数据可视化的 python 包 - [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) 自动解密工具 - [emeryberger/scalene](https://github.com/emeryberger/scalene) - 一个高性能、高精度的Python CPU和内存剖析器 + 一个高性能、高精度的 Python CPU 和内存剖析器 - [hedythedev/StarCli](https://github.com/hedythedev/starcli) - 通过命令行浏览GitHub热门项目 + 通过命令行浏览 GitHub 热门项目 - [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) 这个工具可以扫描一些常见的、有漏洞的组件(openssl、libpng、libxml2、expat和其他一些组件),让你知道你的系统是否包含有已知漏洞的常用库。 - [nf-core/tools](https://github.com/nf) - 包含nf-core社区帮助工具的Python包 + 包含 nf-core 社区帮助工具的 Python 包 - [cansarigol/pdbr](https://github.com/cansarigol/pdbr) pdb + rich 的库,增强调试功能 - [plant99/felicette](https://github.com/plant99/felicette) 傻瓜式卫星图像 - [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) - 使用Selenium和pytest使自动化和测试速度提高10倍,包括电池 + 使用 Selenium 和 pytest 使自动化和测试速度提高10倍,包括电池 - [smacke/ffsubsync](https://github.com/smacke/ffsubsync) 自动将字幕与视频同步 - [tryolabs/norfair](https://github.com/tryolabs/norfair) - 轻量级Python库,用于向任何检测器添加实时2D对象跟踪 + 轻量级 Python 库,用于向任何检测器添加实时 2D 对象跟踪 - +[还有很多](https://github.com/willmcgugan/rich/network/dependents)! diff --git a/README.de-ch.md b/README.de-ch.md new file mode 100644 index 0000000000..c5413808e3 --- /dev/null +++ b/README.de-ch.md @@ -0,0 +1,457 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich isch ä Python Library för _rich_ Text ond ganz schöni formatiärig im Törminäl + +D [Rich API](https://rich.readthedocs.io/en/latest/) machts ganz eifach zom Farbä ond Stiil zu de Törminälusgob hinzu z füäge. Rich cha au schöni Tabelle, Progressbare, Markdown, Syntax hervorhebe, Tracebäcks und meh darstelle — fix fertig usem Böxli. + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +E Video Iifüärig öber Rich geds onder [calmcode.io](https://calmcode.io/rich/introduction.html) vo [@fishnets88](https://twitter.com/fishnets88). + +Lueg was [anderi öber Rich säged](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). + +## Kompatibilität + +Rich funktioniert mit Linux, OSX ond Windows. True color / emoji funktioniert mit em neue Windows Törminäl, s klassische Törminäl isch of 16 Farbe limitiärt. Rich brucht Python 3.6.3 oder neuer. + +Rich funktioniert mit [Jupyter notebooks](https://jupyter.org/) ohni irgendwelchä zuäsätzloche konfiguration. + +## Installation + +Installation mit `pip` oder mit dim liäblings PyPI Päckli-Manager. + +```sh +python -m pip install rich +``` + +Für das do us zum d Rich usgob im Törminäl z teste: + +```sh +python -m rich +``` + +## Rich Print + +Zom ohni Ufwand Rich Usgob zu dinnere Applikation hinzuäfüäge, chasch eifach d [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) Methodä importiäre, weli di glich Signatuur hed wiä d Builtin Python Funktion. Versuech das: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich cha i de Python REPL installiert werde so dass irgend e Datestruktuur hübsch usgeh ond Highlighted wird. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Console bruchä + +Für meh kontrolle öber de Törminäl inhalt, importiär und instanziär e [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) Objekt. + +```python +from rich.console import Console + +console = Console() +``` + +S Console Objekt hät e `print` Methode mitäre absichtloch gliche Schnittstell wiä d Builtin `print` Funktion. Do es Bispiil wiä mos brucht: + +```python +console.print("Hello", "World!") +``` + +Wiä erwartet wird `"Hello World!"` im Törminäl usgeh. Beach das im gägesatz zu de Builtin `print` Funktion, Rich de text so ombricht das es id Törminäl breiti ine passt. + +Es ged es paar Wäg zom Farb und Stiil zu de Usgob hinzuä z füäge. Me cha en stiil a de ganze Usgob zuäwiise i dem mo s Schlösselwortargument `style` verwendet. Do es Bispiil: + +```python +console.print("Hello", "World!", style="bold red") +``` + +D Usgob gsiät öppe ä so us: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +Da isch guät für d Gstalltig vom Text pro Liniä. Vör ä granularäri Gstalltig hed Rich e spezielli Markup mitäre ähnloche Befehlsufbau wiä [bbcode](https://en.wikipedia.org/wiki/BBCode). Do es Bispiil: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Du chasch mitmäne Console Objekt mit wenig Ufwand aasprechendi Usgob erziile. Lueg do d [Console API](https://rich.readthedocs.io/en/latest/console.html) Dokumentation für d Details a. + +## Rich Inspect + +Rich hät e [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) Funktion wo cha Bricht öber jeglochi Python Objekt, wie Class, Instanz oder Builtin erstelle. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Lueg do d [inspect Dokumentation](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) für d Details a. + +# Rich-Bibliothek + +Rich häd ä Aazahl vo integriäte _renderables_ wo du chasch verwende zum eleganti Usgobe i dinner e CLI generiäre ond der hälfed bim debugge vo dim Code. + +Drock of di folgende Öberschrifte für d Details: + +
+Log + +S Console Objekt hät e `log()` Methode wo verglichbar zu de `print()` Schnittstell isch aber zuäsätzloch no e Spaltä för di aktuäll Zitt und d Datai mit de Zille wo de Ufruäf macht us git. Standardmässig tuät Rich es Syntax Highlighting für Python Strukturä sowiä repr Text machä. Went e Collection (wiä zum Bispiil dict oder list) loggsch wird Rich das hübsch Usgeh so dass es i de verfüägbari Platz ine passt. Do es Bispiil für e paar vo dene Funktionä. + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +Das do obe gid di folgend Usgob: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Beachte s Argument `log_locals` wo innere Tabelle di lokalä Variable us gid zur Zitt wo d Methodä ufgruäfä worde isch. + +D log Methodä cha zum is Törminäl inne z Logge für langläbige Applikationä wie Server brucht werde isch aber au fürs Debuggä ganz e netti Hilf. + +
+
+Logging Handler + +Du chasch au d Builtin [Handler Class](https://rich.readthedocs.io/en/latest/logging.html) verwende zum d Usgob vom Python logging Module z formatiäre und iifärbe. Do es Bispiil vo de Usgob: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji + +Zom e Emoji i de Konsoleusgob iizfüäge tuä de name züschet zwei Doppelpünkt. Do es Bispiil: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Bitte verwend diä Funktion gschiid. + +
+ +
+Tabelle + +Rich cha flexiibäl [Tabelle](https://rich.readthedocs.io/en/latest/tables.html) mit Boxä us Unicodezeiche generiäre. Es gid e Viilzahl vo Formatiärigsoptionä für Ränder, Stiil, Zelleusrichtig ond so witter. + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +D Animation obe isch mit [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) us em Bispiil-Ordner erstellt worde. + +Do es eifachs Tabelle-Bispiil: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Das gid di folgend Usgob: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Beacht das d Konsole Markup glich wie bi `print()` ond `log()` generiärt wird. Ond zwor cha alles wo vo Rich generiert werde cha au im Chopf / Zille iigfüägt werde (sogar anderi Tabellene). + +D Klass `Table` isch gschiid gnuäg yum d Spaltebreite am verfüägbare Platz im Törminäl aazpasse und de Text gegäbenefalls umzbreche. Do isch s gliche Bispiil mit em Törminäl chlinner als d Tabelle vo obe: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Progress Bars + +Rich cha meereri flackerfreii [Progress](https://rich.readthedocs.io/en/latest/progress.html) Bars darstelle zum langläbigi Tasks verfolgä. + +Zur eifache Benutzig irgend e Sequenz id `track` Funktion ine packe und über s Resultat iteriäre. Do es Bispiil: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Es isch nöd vill schwiriger zum mehräri Progress Bars hinzuä zfüäge. Do es Bispiil us de Doku: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +D Spaltä cha so konfiguriärt werde das alli gwünschte Details aazeigt werded. D Built-in Spalte beinhaltät Prozentsatz, Dateigrössi, Dateigschwindikeit ond öbrigi Zitt. Do isch e andos Bispiil wo en laufände Download zeigt: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +Zums selber usprobiäre lueg [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) a, wo cha glichzittig mehräri URLs abelade und de Fortschritt aazeige. + +
+ +
+Status + +För Situatione wos schwär isch zum de Fortschritt z berechne, chasch d [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) Methode verwende wo en 'spinner' animiärt und e Nochricht darstellt. D Animation haltet di nöd ab d Konsole witter normal z bruche. Do es Bispiil: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Das gid di folgendi Usgob im Törminäl. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +D Spinner Animatione sind vo [cli-spinners](https://www.npmjs.com/package/cli-spinners) usglehnt. Du chasch en speziifischä Spinner mit em `spinner` Parameter uswähle. Start de folgend Befehl zom die verfüägbare Wert z gsiä: + +``` +python -m rich.spinner +``` + +De Befehl obe generiärt di folgändi Usgob im Törminäl: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Tree + +Rich cha en [tree](https://rich.readthedocs.io/en/latest/tree.html) mit Hilfsliniä generiäre. En Tree isch ideal zom darstelle vo Dateistruktuure oder anderi hirarchischi Date. + +S Label vom Tree cha en eifache Text or alles andere wo Rich cha rendere. Start das Folgendi für e Demonstation: + +``` +python -m rich.tree +``` + +Das generiärt di folgend Usgob: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Lueg s Bispiil Script [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) für e Darstellig vo irgend eim Ordner als Tree, glich wie de Linux Befehl `tree`. + +
+ +
+Spaltene + +Rich cha Inhalt i hübsche [Spaltene](https://rich.readthedocs.io/en/latest/columns.html) darstelle mit glichä oder optimale Breiti. Do isch e ganz eifachi kopii vom (MacOS / Linux) `ls` Befehl wo Ordner in Spaltene darstellt + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +De folgend Screenshot isch d Usgob vom [Spalte-Bispiil](https://github.com/willmcgugan/rich/blob/master/examples/columns.py), wo Date vonnere API hollt ond in Spaltene darstellt: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich cha [markdown](https://rich.readthedocs.io/en/latest/markdown.html) übersetze ond leistet vernünftigi Ärbät bim formatiärige is Törminäl z übersetze. + +Zum Markdown z übersetze importier d Klass `Markdown` und instanzier es mitem Markdown Text. Nocher gid mos uf de Konsolä us. Do es Bispiil: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Das wird d Usgob ungefär wie s Folgende geh: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Syntax Highlighting + +Rich brucht d [pygments](https://pygments.org/) Library für d [Syntax Highlighting](https://rich.readthedocs.io/en/latest/syntax.html). S Bruche isch ähnloch zum Markdown übersetze; instanziär e `Syntax` Objekt ond gibs uf de Konsolä us. Do es Bispiil: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Das wird d Usgob ungefär wie s Folgende geh: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Tracebacks + +Rich cha [wunderschöni Tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) generiäre wo eifach zum läse sind und meh Code als de Standard-Python-Traceback darstellt. Du chasch Rich als default Traceback Handler setzä ond alli nöd abfangene Exceptions werded mit Rich dargstellt. + +So gsiets ungefär ufemen OSX (ähnloch uf Linux) us: + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Alli Rich Renderables bruched s [Console-Protokoll](https://rich.readthedocs.io/en/latest/protocol.html), wo mo au für d eige Entwicklig vo Rich-Inhalt cha bruche. + +# Rich für Ondernemä + +Verfüägbar als Tidelift Abo. + +De Betreue vo Rich ond tuusigi anderi Päkli schaffed mit Tidelift zum komerziälle Support und Wartig für Open Source Päkli wo du zum Baue vo dinnere Applikation bruchsch. Spar Zit, reduziär s Risiko ond verbessere d Code Health mit em bezahle vo de Wartig für gnau die Päkli wo mo brucht. [Lärn meh.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Projekt wo Rich bruched + +Do es paar Projekt wo Rich verwended: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + a python package for the visualization of three dimensional neuro-anatomical data +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + Automated decryption tool +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + a high-performance, high-precision CPU and memory profiler for Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Browse GitHub trending projects from your command line +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + This tool scans for a number of common, vulnerable components (openssl, libpng, libxml2, expat and a few others) to let you know if your system includes common libraries with known vulnerabilities. +- [nf-core/tools](https://github.com/nf-core/tools) + Python package with helper tools for the nf-core community. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Rich library for enhanced debugging +- [plant99/felicette](https://github.com/plant99/felicette) + Satellite imagery for dummies. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Automate & test 10x faster with Selenium & pytest. Batteries included. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Automagically synchronize subtitles with video. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Lightweight Python library for adding real-time 2D object tracking to any detector. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint checks playbooks for practices and behaviour that could potentially be improved +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule testing framework +- +[Vieli meh](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/README.de.md b/README.de.md new file mode 100644 index 0000000000..c14a61b699 --- /dev/null +++ b/README.de.md @@ -0,0 +1,455 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich ist eine Python-Bibliothek für _rich_ Text und schöne Formatierung im Terminal. + +Die [Rich API](https://rich.readthedocs.io/en/latest/) erleichtert das Hinzufügen von Farbe und Stil zur Terminalausgabe. Rich kann auch schöne Tabellen, Fortschrittsbalken, Markdowns, durch Syntax hervorgehobenen Quellcode, Tracebacks und mehr sofort rendern. + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Eine Video-Einführung in Rich findest du unter [quietcode.io](https://calmcode.io/rich/introduction.html) von [@ fishnets88](https://twitter.com/fishnets88). + +Schau hier, was [andere über Rich sagen](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). + +## Kompatibilität + +Rich läuft unter Linux, OSX und Windows. True Color / Emoji funktionieren mit dem neuen Windows-Terminal. Das klassische Terminal ist auf 16 Farben beschränkt. Rich benötigt Python 3.6.3 oder höher. + +Rich funktioniert ohne zusätzliche Konfiguration mit [Jupyter Notebooks](https://jupyter.org/). + +## Installation + +Installation mit `pip` oder deinem bevorzugten PyPI-Paketmanager. + +```sh +python -m pip install rich +``` + +Führe die folgenden Schritte aus, um die Rich-Ausgabe auf deinem Terminal zu testen: + +```sh +python -m rich +``` + +## Rich Print + +Um deiner Anwendung mühelos eine Rich-Ausgabe hinzuzufügen, kannst du die Methode [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) importieren, die dieselbe Signatur wie die integrierte Python-Funktion hat. Versuche das: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich kann in Python REPL installiert werden, so dass alle Datenstrukturen schön ausgegeben und hervorgehoben werden. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Verwenden der Konsole + +Importiere und erstelle ein [Konsolen-Objekt](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console), um mehr Kontrolle über umfangreiche Terminalinhalte zu erhalten. + +```python +from rich.console import Console + +console = Console() +``` + +Das Konsolenobjekt verfügt über eine `print`-Methode, die eine absichtlich gleiche Schnittstelle zur integrierten `print`-Funktion aufweist. Hier ein Anwendungsbeispiel: + +```python +console.print("Hello", "World!") +``` + +Wie zu erwarten, wird `"Hello World!"` im Terminal ausgegeben. Beachte, dass Rich im Gegensatz zur integrierten `print`-Funktion deinen Text so umbricht, dass er in die Terminalbreite passt. + +Es gibt verschiedene Möglichkeiten, deiner Ausgabe Farbe und Stil hinzuzufügen. Du kannst einen Stil für die gesamte Ausgabe festlegen, indem du ein Schlüsselwortargument `style` hinzufügst. Hier ein Beispiel: + +```python +console.print("Hello", "World!", style="bold red") +``` + +Die Ausgabe wird in etwa wie folgt aussehen: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +Das ist gut, um jeweils eine Textzeile zu stylen. Für eine detailliertere Gestaltung bietet Rich ein spezielles Markup an, das in der Syntax ähnlich [bbcode](https://en.wikipedia.org/wiki/BBCode) ist. Hier ein Beispiel: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Du kannst ein Console-Objekt verwenden, um mit minimalem Aufwand anspruchsvolle Ausgaben zu erzeugen. Siehe [Konsolen-API](https://rich.readthedocs.io/en/latest/console.html) für Details. + +## Rich Inspect + +Rich hat eine Funktion [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect), die einen Bericht über jedes Python-Objekt, wie Klasse, Instanz oder builtin, erzeugen kann. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Siehe [Doks Inspektor](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) für Details. + +# Rich-Bibliothek + +Rich enthält eine Reihe von eingebauten _renderables_, die du verwenden kannst, um elegante Ausgaben in deiner CLI zu erzeugen und dir beim Debuggen deines Codes zu helfen. + +Klicke auf die folgenden Überschriften, um Details zu erfahren: + +
+Log + +Das Console-Objekt hat eine `log()`-Methode, die die gleiche Schnittstelle wie `print()` hat, aber zusätzlich eine Spalte für die aktuelle Zeit und die Datei und Zeile, die den Aufruf gemacht hat, ausgibt. Standardmäßig führt Rich die Syntaxhervorhebung für Python-Strukturen und für repr-Strings durch. Wenn du eine Sammlung (z.B. ein Diktat oder eine Liste) protokollierst, wird Rich diese so hübsch ausgeben, dass sie in den verfügbaren Platz passt. Hier ein Beispiel für einige dieser Funktionen. + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +Die obige Funktion erzeugt die folgende Ausgabe: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Beachte das Argument `log_locals`, das eine Tabelle mit den lokalen Variablen ausgibt, in der die log-Methode aufgerufen wurde. + +Die log-Methode kann für die Protokollierung auf dem Terminal für langlaufende Anwendungen wie Server verwendet werden, ist aber auch eine sehr schöne Hilfe bei der Fehlersuche. + +
+
+Logging Handler + +Du kannst auch die eingebaute [Handler-Klasse](https://rich.readthedocs.io/en/latest/logging.html) verwenden, um die Ausgabe von Pythons Logging-Modul zu formatieren und einzufärben. Hier ein Beispiel für die Ausgabe: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji + +Um ein Emoji in die Konsolenausgabe einzufügen, setze den Namen zwischen zwei Doppelpunkte. Hier ein Beispiel: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Bitte verwenden Sie diese Funktion mit Bedacht. + +
+ +
+Tabellen + +Rich kann flexible [Tabellen](https://rich.readthedocs.io/en/latest/tables.html) mit Unicode-Box-Characters darstellen. Es gibt eine Vielzahl von Formatierungsmöglichkeiten für Rahmen, Stile, Zellausrichtung usw. + +![Film-Tabelle](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +Die obige Animation wurde mit [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) im Verzeichnis `examples` erzeugt. + +Hier ist ein einfacheres Tabellenbeispiel: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Dies erzeugt diese Ausgabe: + +![Tabelle](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Beachte, dass das Konsolen-Markup auf die gleiche Weise gerendert wird wie `print()` und `log()`. Tatsächlich kann alles, was von Rich gerendert werden kann, in den Kopfzeilen/Zeilen enthalten sein (sogar andere Tabellen). + +Die Klasse `Table` ist intelligent genug, um die Größe der Spalten an die verfügbare Breite des Terminals anzupassen und den Text wie erforderlich umzubrechen. Hier ist das gleiche Beispiel, wobei das Terminal kleiner als bei der obigen Tabelle ist: + +![Tabelle2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Fortschrittsbalken + +Rich kann mehrere flackerfreie [Fortschrittsbalken](https://rich.readthedocs.io/en/latest/progress.html) darstellen, um langlaufende Aufgaben zu verfolgen. + +Einfachste Anwendung ist, eine beliebige Sequenz in die Funktion `track` einzupacken und über das Ergebnis zu iterieren. Hier ein Beispiel: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Es ist nicht viel schwieriger, mehrere Fortschrittsbalken hinzuzufügen. Hier ein Beispiel aus der Doku: + +![Fortschritt](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +Die Spalten können so konfiguriert werden, dass sie alle gewünschten Details anzeigen. Zu den eingebauten Spalten gehören Prozentsatz der Fertigstellung, Dateigröße, Downloadgeschwindigkeit und verbleibende Zeit. Hier ist ein weiteres Beispiel, das einen laufenden Download anzeigt: + +![Fortschritt](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +Um dies selbst auszuprobieren, sieh dir [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) an, das mehrere URLs gleichzeitig herunterladen kann und dabei den Fortschritt anzeigt. + +
+ +
+Status + +Für Situationen, in denen es schwierig ist, den Fortschritt zu berechnen, kannst du die Methode [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) verwenden, die eine 'Spinner'-Animation und eine Meldung anzeigt. Die Animation hindert dich nicht daran, die Konsole wie gewohnt zu verwenden. Hier ein Beispiel: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Dies erzeugt diese Ausgabe im Terminal. + +![Status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +Die Spinner-Animationen wurden von [cli-spinners](https://www.npmjs.com/package/cli-spinners) geliehen. Du kannst einen Spinner auswählen, indem du den Parameter `spinner` angibst. Führe den folgenden Befehl aus, um die verfügbaren Werte zu sehen: + +``` +python -m rich.spinner +``` + +Der obige Befehl erzeugt die folgende Ausgabe im Terminal: + +![Spinner](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Baum + +Rich kann einen [Baum](https://rich.readthedocs.io/en/latest/tree.html) mit Hilfslinien darstellen. Ein Baum ist ideal, um eine Dateistruktur oder andere hierarchische Daten darzustellen. + +Die Beschriftungen des Baums können einfacher Text oder alles andere sein, was Rich rendern kann. Führe den folgenden Befehl zur Demonstration aus: + +``` +python -m rich.tree +``` + +Dies erzeugt diese Ausgabe: + +![Markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Siehe das Beispiel [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) für ein Skript, das eine Baumansicht eines beliebigen Verzeichnisses anzeigt, ähnlich dem Linux-Befehl `tree`. + +
+ +
+Spalten + +Rich kann Inhalte sauber in [Spalten](https://rich.readthedocs.io/en/latest/columns.html) mit gleicher oder optimaler Breite darstellen. Hier ist ein sehr einfacher Klon des (MacOS / Linux) `ls`-Befehls, der eine Verzeichnisliste in Spalten anzeigt: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +Der folgende Screenshot ist die Ausgabe von [Spalten-Beispiel](https://github.com/willmcgugan/rich/blob/master/examples/columns.py), das Daten, die aus einer API kommen, in Spalten anzeigt: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich kann [Markdown](https://rich.readthedocs.io/en/latest/markdown.html) rendern und leistet vernünftige Arbeit bei der Übersetzung der Formatierung ins Terminal. + +Um Markdown zu rendern, importiere die Klasse `Markdown` und konstruiere einen String mit Markdown-Code. Gib ihn dann auf der Konsole aus. Hier ein Beispiel: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Dies erzeugt diese Ausgabe: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Syntax-Hervorhebung + +Rich verwendet die Bibliothek [pygments](https://pygments.org/) zur Implementierung von [Syntax-Hervorhebung](https://rich.readthedocs.io/en/latest/syntax.html). Die Verwendung ist gleich dem Rendern von Markdown; konstruieren Sie ein `Syntax`-Objekt und gib es auf der Konsole aus. Hier ein Beispiel: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Dies erzeugt die folgende Ausgabe: + +![Syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Tracebacks + +Rich kann [schöne Tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) rendern, die einfacher zu lesen sind und mehr Code anzeigen, als die Standard-Python-Tracebacks. Du kannst Rich als Standard-Traceback-Handler festlegen, so dass alle nicht abgefangenen Exceptions von Rich gerendert werden. + +So sieht es unter OSX aus (ähnlich unter Linux): + +![Traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Alle Rich-Renderables verwenden das [Konsolen-Protokoll](https://rich.readthedocs.io/en/latest/protocol.html), das du auch für die Implementierung deiner eigenen Rich-Inhalte verwenden kannst. + +# Rich für Unternehmen + +Verfügbar als Teil des Tidelift-Abonnements. + +Die Betreuer von Rich und tausenden anderen Paketen arbeiten mit Tidelift zusammen, um kommerziellen Support und Wartung für die Open-Source-Pakete zu bieten, die du zur Erstellung deiner Anwendungen verwendest. Spare Zeit, reduziere Risiken und verbessere den Zustand des Codes, während du die Betreuer genau der Pakete bezahlen, die du verwendest. [Erfahre hier mehr.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Projekte, die Rich verwenden + +Hier sind ein paar Projekte, die Rich verwenden: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + ein Python-Paket zur Visualisierung dreidimensionaler neuro-anatomischer Daten +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + Automatisiertes Entschlüsselungswerkzeug +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + ein leistungsstarker, hochpräziser CPU- und Speicher-Profiler für Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Durchsuchen von GitHub-Trending-Projekten in der Kommandozeile +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + Dieses Tool scannt nach einer Reihe von verbreiteten, verwundbaren Komponenten (openssl, libpng, libxml2, expat und ein paar andere), um dir mitzuteilen, ob dein System verbreitete Bibliotheken mit bekannten Sicherheitslücken enthält. +- [nf-core/tools](https://github.com/nf-core/tools) + Python-Paket mit Hilfswerkzeugen für die nf-core-Gemeinschaft. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Rich-Bibliothek für erweitertes Debugging +- [plant99/felicette](https://github.com/plant99/felicette) + Satellitenbilder für Dummies. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Automatisiere & Teste 10x schneller mit Selenium & pytest. Inklusive Batterien. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Automatisch Untertitel mit Video synchronisieren. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Leichtgewichtige Python-Bibliothek zum Hinzufügen von 2D-Objektverfolgung in Echtzeit zu jedem Detektor. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint prüft Playbooks auf Praktiken und Verhalten, die möglicherweise verbessert werden könnten +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule-Testing-Framework +- +[Viele weitere](https://github.com/willmcgugan/rich/network/dependents)! diff --git a/README.es.md b/README.es.md index f8035358c3..99cdb63600 100644 --- a/README.es.md +++ b/README.es.md @@ -1,10 +1,26 @@ -# Rich - +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) [![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) [![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) [![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + Rich es un paquete de Python para texto _enriquecido_ y un hermoso formato en la terminal. La [API Rich](https://rich.readthedocs.io/en/latest/) facilita la adición de color y estilo a la salida del terminal. Rich también puede representar tablas bonitas, barras de progreso, markdown, código fuente resaltado por sintaxis, trazas y más — listo para usar. @@ -17,16 +33,22 @@ Vea lo que [la gente dice sobre Rich](https://www.willmcgugan.com/blog/pages/pos ## Compatibilidad -Rich funciona con Linux, OSX y Windows. True color / emoji funciona con la nueva Terminal de Windows, la terminal clásica está limitada a 8 colores. Rich requiere Python 3.6.1 o posterior. +Rich funciona con Linux, OSX y Windows. True color / emoji funciona con la nueva Terminal de Windows, la terminal clásica está limitada a 8 colores. Rich requiere Python 3.6.3 o posterior. Rich funciona con [Jupyter notebooks](https://jupyter.org/) sin necesidad de configuración adicional. ## Instalación -Instale con `pip` o su administrador de paquetes PyPi favorito. +Instale con `pip` o su administrador de paquetes PyPI favorito. +```sh +python -m pip install rich ``` -pip install rich + +Ejecute lo siguiente para probar la salida de Rich sobre su terminal: + +```sh +python -m rich ``` ## Función print de Rich @@ -88,7 +110,30 @@ console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i ![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) -### Registro de consola +Usted puede usar el objeto Console para generar salida sofisticada con mínimo esfuerzo. Ver la [API Console](https://rich.readthedocs.io/en/latest/console.html) docs para detalles. + +## Rich Inspector + +Rich tiene ua función [inspeccionar](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) cual puede producir un reporte sobre cualquier objeto Python, como clases, instancia o builtin. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Ver la [docs inspector](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) para detalles. + +# Paquete Rich + +Rich contiene un número de builtin _renderables_ que puedes usar para crear salida elegante en su CLI y ayudarle a depurar su código. + +Haga clic en los siguientes títulos para obtener más detalles: + +
+Registro de consola El objeto Console tiene un método `log()` que tiene una interfaz similar a `print()`, pero también muestra una columna para la hora actual y el archivo y la línea que realizó la llamada. De forma predeterminada, Rich resaltará la sintaxis de las estructuras de Python y de las cadenas de reproducción. Si registra una colección (es decir, un diccionario o una lista), Rich la imprimirá de forma bonita para que quepa en el espacio disponible. A continuación, se muestra un ejemplo de algunas de estas funciones. @@ -123,13 +168,17 @@ Tenga en cuenta el argumento `log_locals`, que genera una tabla que contiene las El método de registro podría usarse para iniciar sesión en el terminal para aplicaciones de larga ejecución, como servidores, pero también es una ayuda de depuración muy buena. -### Controlador de registro +
+
+Controlador de registro También puede usar la [Handler class](https://rich.readthedocs.io/en/latest/logging.html) incorporada para formatear y colorear la salida del módulo de registro de Python. Aquí hay un ejemplo de la salida: ![Registro](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) +
-## Emoji +
+Emoji Para insertar un emoji en la salida de la consola, coloque el nombre entre dos puntos. He aquí un ejemplo: @@ -139,8 +188,10 @@ Para insertar un emoji en la salida de la consola, coloque el nombre entre dos p ``` Utilice esta función con prudencia. +
-## Tablas +
+Tablas Rich puede renderizar [tablas](https://rich.readthedocs.io/en/latest/tables.html) flexibles con caracteres de cuadro Unicode. Existe una gran variedad de opciones de formato para bordes, estilos, alineación de celdas, etc. @@ -162,7 +213,7 @@ table.add_column("Title") table.add_column("Production Budget", justify="right") table.add_column("Box Office", justify="right") table.add_row( - "Dev 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" ) table.add_row( "May 25, 2018", @@ -190,7 +241,10 @@ La clase `Table` es lo suficientemente inteligente como para cambiar el tamaño ![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) -## Barras de progreso +
+ +
+Barras de progreso Rich puede representar varias barras de [progreso](https://rich.readthedocs.io/en/latest/progress.html) sin parpadeos para realizar un seguimiento de las tareas de larga duración. @@ -213,12 +267,70 @@ Las columnas pueden configurarse para mostrar los detalles que desee. Las column Para probar esto usted mismo, consulte [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) que puede descargar varias URL simultáneamente mientras muestra el progreso. -## Columnas +
+ +
+Estado + +Para situaciones en las que es difícil calcular el progreso, puede utilizar el método [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) que mostrará una animación y un mensaje de "spinner". La animación no le impedirá usar la consola con normalidad. He aquí un ejemplo: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Esto genera la siguiente salida en el terminal. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +Las animaciones de spinner fueron tomadas de [cli-spinners](https://www.npmjs.com/package/cli-spinners). Puede seleccionar un spinner especificando el `spinner` parameter. Ejecute el siguiente comando para ver los valores disponibles: + +``` +python -m rich.spinner +``` + +El comando anterior genera la siguiente salida en la terminal: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Árbol + +Rich genera un [tree](https://rich.readthedocs.io/en/latest/tree.html) con líneas de guía. Un árbol es ideal para mostrar una estructura de archivos, o cualquier otro dato jerárquico. + +Las etiquetas del árbol pueden ser texto simple o cualquier otra cosa que Rich pueda mostar. Ejecuta lo siguiente para una demostración: + +``` +python -m rich.tree +``` + +Esto genera la siguiente salida: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Ver el ejemplo [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) para un script que muestra una vista de árbol de cualquier directorio, similar a el comando de linux `tree`. + +
+ +
+Columnas Rich puede representar contenido en [columnas](https://rich.readthedocs.io/en/latest/columns.html) ordenadas con un ancho igual u óptimo. Aquí hay un clon muy básico del comando (MacOS / Linux) `ls` que muestra una lista de directorios en columnas: ```python import os +import sys from rich import print from rich.columns import Columns @@ -231,7 +343,10 @@ La siguiente captura de pantalla es el resultado del [ejemplo de columnas](https ![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) -## Markdown +
+ +
+Markdown Rich puede renderizar [markdown](https://rich.readthedocs.io/en/latest/markdown.html) y hace un trabajo razonable al traducir el formato al terminal. @@ -251,7 +366,10 @@ Esto producirá una salida similar a la siguiente: ![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) -## Resaltado de sintaxis +
+ +
+Resaltado de sintaxis Rich usa el paquete [pygments](https://pygments.org/) para implementar [resaltado de sintaxis](https://rich.readthedocs.io/en/latest/syntax.html). El uso es similar a renderizar markdown; construya un objeto `Syntax` e imprímalo en la consola. He aquí un ejemplo: @@ -283,7 +401,10 @@ Esto producirá el siguiente resultado: ![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) -## Tracebacks +
+ +
+Tracebacks Rich puede representar [tracebacks hermosos](https://rich.readthedocs.io/en/latest/traceback.html) que son más fáciles de leer y muestran más código que los tracebacks estándar de Python. Puede configurar Rich como el controlador tracebacks predeterminado para que todas las excepciones sin capturar sean procesadas por Rich. @@ -291,7 +412,17 @@ Así es como se ve en OSX (similar en Linux): ![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) -## Proyecto usando Rich +
+ +Todos los renderizables enriquecidos utilizan el [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), que también puede utilizar para implementar su propio contenido Rich. + +# Rich para empresas + +Disponible como parte de la suscripción a Tidelift. + +Los mantenedores de Rich y miles de otros paquetes están trabajando con Tidelift para brindar soporte comercial y mantenimiento para los paquetes de código abierto que usa para construir sus aplicaciones. Ahorre tiempo, reduzca el riesgo y mejore el estado del código, mientras paga a los mantenedores de los paquetes exactos que utiliza. [Más información](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Proyecto usando Rich Aquí hay algunos proyectos que usan Rich: @@ -316,5 +447,7 @@ Aquí hay algunos proyectos que usan Rich: - [smacke/ffsubsync](https://github.com/smacke/ffsubsync) Sincronice automáticamente los subtítulos con el video. - [tryolabs/norfair](https://github.com/tryolabs/norfair) -- Libreria de Python para agregar tracking a cualquier detector. + Libreria de Python para agregar tracking a cualquier detector. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint comprueba los playbooks en busca de prácticas y comportamientos que podrían mejorarse +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Marco de prueba de Ansible Molecule - +¡[Muchos más](https://github.com/willmcgugan/rich/network/dependents)! diff --git a/README.fr.md b/README.fr.md new file mode 100644 index 0000000000..0b1d092dfe --- /dev/null +++ b/README.fr.md @@ -0,0 +1,447 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich est une bibliothèque Python pour le _rich_ texte et la mise en forme dans le terminal. + +L'[API Rich](https://rich.readthedocs.io/en/latest/) permet d'ajouter facilement de la couleur et du style sur la sortie du terminal. Rich peut également rendre de jolis tableaux, des barres de progression, du markdown, du code source avec de la coloration syntaxique, des traçeurs d'erreurs et bien d'autres choses encore, et ce dès le départ. + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Pour une introduction vidéo à Rich, voir [camelcode.io](https://calmcode.io/rich/introduction.html) par [@ fishnets88](https://twitter.com/fishnets88) + +Voyez ce que [les gens disent de Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/) + +## Compatibilité + +Rich fonctionne avec Linux, OSX et Windows. True color / emoji fonctionne avec le nouveau Terminal Windows, le terminal classique est limité à 16 couleurs. Rich nécessite Python 3.6.3 ou plus. + +Rich fonctionne avec les notebooks Jupyter sans configuration supplémentaire. + +## Installation + +Installez avec `pip` ou votre gestionnaire de paquets PyPI préféré. + +```sh +python -m pip install rich +``` + +Exécutez ce qui suit pour tester la sortie de Rich sur votre terminal : + +```sh +python -m rich +``` + +## Rich Print + +Pour ajouter sans effort une sortie Rich à votre application, vous pouvez importer la méthode [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start), qui a la même signature que la fonction Python intégrée. Essayez ceci : + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich peut être installé dans le REPL de Python, de sorte que toutes les structures de données seront joliment affichées et mises en évidence. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Utilisation de Console + +Pour mieux contrôler le contenu rich du terminal, importez et construisez un objet [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) + +```python +from rich.console import Console + +console = Console() +``` + +L'objet Console possède une méthode `print` dont l'interface est intentionnellement similaire à celle de la fonction `print` native. Voici un exemple d'utilisation : + +```python +console.print("Hello", "World!") +``` + +Comme vous pouvez vous y attendre, cela va afficher "Hello World !" sur le terminal. Notez que, contrairement à la fonction d'affichage intégrée, Rich mettra votre texte en forme pour qu'il tienne dans la largeur du terminal. + +Il y a plusieurs façons d'ajouter de la couleur et du style à votre sortie. Vous pouvez définir un style pour l'ensemble de la sortie en ajoutant un argument de mot-clé style. Voici un exemple : + +```python +console.print("Hello", "World!", style="bold red") +``` + +La sortie sera quelque chose comme ce qui suit : + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +C'est très bien pour styliser une ligne de texte à la fois. Pour un style plus fin, Rich rend un balisage spécial dont la syntaxe est similaire à celle du [bbcode](https://en.wikipedia.org/wiki/BBCode). Voici un exemple : + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Vous pouvez utiliser un objet Console pour générer une sortie sophistiquée avec un effort minimal. Consultez la documentation de l'[API Console](https://rich.readthedocs.io/en/latest/console.html) pour plus de détails. + +## Rich Inspect + +Rich possède une fonction [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) qui peut produire un rapport sur n'importe quel objet Python, comme une classe, une instance ou une fonction intégrée. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Consultez la [documentation d'inspect](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) pour plus de détails. + +## Bibliothèque Rich +Rich contient un certain nombre _d'éléments de rendu_ intégrés que vous pouvez utiliser pour créer une sortie élégante dans votre CLI et vous aider à déboguer votre code. + +Cliquez sur les rubriques suivantes pour plus de détails : + +
+Log + +L'objet Console a une méthode `log()` qui a une interface similaire à `print()`, mais qui rend aussi une colonne pour l'heure actuelle, le fichier et la ligne qui ont fait l'appel. Par défaut, Rich fera la coloration syntaxique des structures Python et des chaînes repr. Si vous enregistrez une collection (i.e. un dict ou une liste) Rich affichera la collection de façon à ce qu'elle tienne dans l'espace disponible. Voici un exemple de certaines de ces fonctionnalités. + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +L'opération ci-dessus produit le résultat suivant : + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Notez l'argument `log_locals`, qui produit un tableau contenant les variables locales où la méthode log a été appelée. + +La méthode log peut être utilisée pour la journalisation vers le terminal pour les applications qui tournent longtemps, comme les serveurs, mais c'est aussi une très bonne aide au débogage. +
+ +
+Journalisation + +Vous pouvez également utiliser la classe intégrée [Handler](https://rich.readthedocs.io/en/latest/logging.html) pour formater et coloriser les sorties du module de journalisation de Python. Voici un exemple de sortie : + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) +
+ +
+Emoji + +Pour insérer un emoji dans la sortie de la console, placez le nom entre deux points. Voici un exemple : + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Veuillez utiliser cette fonction à bon escient. +
+ +
+Tableaux + +Rich peut rendre des [tableaux](https://rich.readthedocs.io/en/latest/tables.html) flexibles avec des caractères de boîte unicode. Il existe une grande variété d'options de formatage pour les bordures, les styles, l'alignement des cellules, etc. + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +L'animation ci-dessus a été générée avec [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) dans le répertoire des exemples. + +Voici un exemple de tableau plus simple : + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Cela produit le résultat suivant : + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Notez que les balises de la console sont rendues de la même manière que `print()` et `log()`. En fait, tout ce qui peut être rendu par Rich peut être inclus dans les en-têtes / lignes (même d'autres tables). + +La classe `Table` est suffisamment intelligente pour redimensionner les colonnes en fonction de la largeur disponible du terminal, en enveloppant le texte si nécessaire. Voici le même exemple, avec un terminal plus petit que le tableau ci-dessus : + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) +
+ +
+Barres de progression + +Rich peut afficher plusieurs [barres de progression](https://rich.readthedocs.io/en/latest/progress.html) sans scintillement pour suivre les tâches de longue haleine. + +Pour une utilisation basique, bouclez sur n'importe quelle séquence dans la fonction `track` et itérez sur le résultat. Voici un exemple : + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Il n'est pas beaucoup plus difficile d'ajouter plusieurs barres de progression. Voici un exemple tiré de la documentation : + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +Les colonnes peuvent être configurées pour afficher tous les détails que vous souhaitez. Les colonnes intégrées comprennent le pourcentage d'achèvement, la taille du fichier, la vitesse du fichier et le temps restant. Voici un autre exemple montrant un téléchargement en cours : + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +Pour l'essayer vous-même, voyez [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) qui peut télécharger plusieurs URL simultanément tout en affichant la progression. + +
+ +
+Statut + +Pour les situations où il est difficile de calculer la progression, vous pouvez utiliser la méthode [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) qui affichera une animation et un message de type "spinner". L'animation ne vous empêchera pas d'utiliser la console normalement. Voici un exemple : + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Cela génère la sortie suivante dans le terminal. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +Les animations des toupies ont été empruntées à [cli-spinners](https://www.npmjs.com/package/cli-spinners). Vous pouvez sélectionner un spinner en spécifiant le paramètre `spinner`. Exécutez la commande suivante pour voir les valeurs disponibles : + +``` +python -m rich.spinner +``` + +La commande ci-dessus génère la sortie suivante dans le terminal : + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) +
+ +
+Arborescence + +Rich peut affiché une [arborescence](https://rich.readthedocs.io/en/latest/tree.html) avec des lignes de repère. Une arborescence est idéale pour afficher une structure de fichiers, ou toute autre donnée hiérarchique. + +Les étiquettes de cette arborescence peuvent être du texte simple ou tout autre élément que Rich peut rendre. Exécutez ce qui suit pour une démonstration : + +``` +python -m rich.tree +``` + +La commande ci-dessus génère la sortie suivante dans le terminal : + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Voir l'exemple [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) pour un script qui affiche une vue arborescente de n'importe quel répertoire, similaire à la commande linux `tree`. + +
+ +
+Colonnes + +Rich peut rendre le contenu en [colonnes](https://rich.readthedocs.io/en/latest/columns.html) avec une largeur égale ou optimale. Voici un clone très basique de la commande `ls` (MacOS / Linux) qui affiche une liste de répertoires en colonnes : + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +La capture d'écran suivante est le résultat de [columns example](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) qui affiche les données extraites d'une API en colonnes : + +![colonne](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich peut rendre le [markdown](https://rich.readthedocs.io/en/latest/markdown.html) et fait un travail raisonnable pour traduire le formatage dans le terminal. + +Pour rendre du markdown, importez la classe `Markdown` et construisez-la avec une chaîne contenant du code markdown. Ensuite, affichez-la dans la console. Voici un exemple : + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Cela produira un résultat semblable à ce qui suit : + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Mise en couleur de la syntaxe + +Rich utilise la bibliothèque [pygments](https://pygments.org/) pour implémenter la [coloration syntaxique](https://rich.readthedocs.io/en/latest/syntax.html). L'utilisation est similaire au rendu de markdown ; construire un objet `Syntax` et afficher celui-ci sur la console. Voici un exemple : + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Cela produira le résultat suivant : + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) +
+ +
+Tracebacks + +Rich peut rendre des [traçages d'erreurs](https://rich.readthedocs.io/en/latest/traceback.html) plus faciles à lire et montrent plus de code que les traçages d'erreurs standard de Python. Vous pouvez définir Rich comme le gestionnaire d'erreurs par défaut afin que toutes les exceptions non capturées soient rendues par Rich. + +Voici à quoi cela ressemble sous OSX (similaire sous Linux) : + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Tous les éléments de rendu utilisent le [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), que vous pouvez également utiliser pour mettre en œuvre votre propre contenu Rich. + +# Rich pour les entreprises + +Disponible dans le cadre de l'abonnement Tidelift. + +Les mainteneurs de Rich et de milliers d'autres paquets collaborent avec Tidelift pour fournir un support et une maintenance commerciale pour les paquets open source que vous utilisez pour construire vos applications. Gagnez du temps, réduisez les risques et améliorez la qualité du code, tout en payant les mainteneurs des paquets que vous utilisez. [En savoir plus](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Projets utilisant Rich + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + un package python pour la visualisation de données neuro-anatomiques tridimensionnelles +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + Outil de déchiffrage automatisé +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + un profileur de CPU et de mémoire haute performance et haute précision pour Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Parcourir les projets tendances de GitHub à partir de votre ligne de commande +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + Cet outil recherche un certain nombre de composants courants et vulnérables (openssl, libpng, libxml2, expat et quelques autres) pour vous indiquer si votre système comprend des bibliothèques présentant des vulnérabilités connues. +- [nf-core/tools](https://github.com/nf-core/tools) + Paquet Python contenant des outils d'aide pour la communauté nf-core. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + bibliothèque Rich pour un débogage amélioré +- [plant99/felicette](https://github.com/plant99/felicette) + L'imagerie satellite pour les nuls. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Automatisez et testez 10 fois plus vite avec Selenium et pytest. Piles incluses. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Synchronisation automatique des sous-titres avec la vidéo. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Bibliothèque Python légère pour ajouter le suivi d'objets 2D en temps réel à n'importe quel détecteur. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint vérifie dans les playbooks les pratiques et comportements qui pourraient être améliorés. +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Cadre de test Ansible Molecule. +- [Beaucoup d'autres](https://github.com/willmcgugan/rich/network/dependents) ! diff --git a/README.hi.md b/README.hi.md new file mode 100644 index 0000000000..c3c62f5321 --- /dev/null +++ b/README.hi.md @@ -0,0 +1,444 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich टर्मिनल में _समृद्ध_ पाठ और सुंदर स्वरूपण के लिए एक Python संग्रह है। + + +[Rich API](https://rich.readthedocs.io/en/latest/) टर्मिनल उत्पादन में रंग और शैली डालना आसान बनाता है। Rich सुंदर सारणियाँ, प्रगति सूचक डंडे, markdown, रचनाक्रम चिन्हांकित स्त्रोत कोड, ट्रेसबैक आदि प्रस्तुत कर सकता है - बिना कुछ बदले। + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Rich के वीडियो परिचय के लिए देखें [@fishnets88](https://twitter.com/fishnets88) द्वारा बनाई गई [calmcode.io](https://calmcode.io/rich/introduction.html)। + + +देखें [लोग रिच के बारे में क्या कह रहे हैं](https://www.willmcgugan.com/blog/pages/post/rich-tweets/)। + +## अनुकूलता + +Rich Linux, OSX, और Windows के साथ चल सकता है। सच्चा रंग/इमोजी नए Windows टर्मिनल के साथ काम करता है, पुराना टर्मिनल १६ रंगों तक ही सीमित है। Rich के लिए Python ३.६.१ या बाद का होना आवश्यक है। + +Rich बिना किसी अतिरिक्त विन्यास के [Jupyter नोटबुक](https://jupyter.org/) के साथ काम करता है। + +## स्थापना करना + +`pip` या अपने पसंदीदा PyPI संकुल प्रबंधक (package manager) के द्वारा आप इसे स्थापित कर सकते हैं। + +```sh +python -m pip install rich +``` + +आपके टर्मिनल पर Rich उत्पादन का परीक्षण करने के लिए यह चलाएं: +```sh +python -m rich +``` + +## Rich Print + +अपने अनुप्रयोग में सरलता से समृद्ध उत्पादन जोड़ने के लिए, आप [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) क्रिया को आयात कर सकते हैं, जिसका हस्ताक्षर अंतर्निहित Python क्रिया के समान है। यह चलाने की कोशिश करें: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich को Python REPL में स्थापित किया जा सकता है, ताकि कोई भी डेटा संरचनाएं सुंदरता से छपे तथा चिह्नांकित हों। +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## कॉनसोल (Console) का इस्तेमाल करना + +समृद्ध टर्मिनल वस्तुओं पर अधिक नियंत्रण के लिए, आयात और निर्मित करें एक [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) वस्तु को। + +```python +from rich.console import Console + +console = Console() +``` + +Console वस्तु के पास एक `print` क्रिया है जिसका अंतरापृष्ठ जानबूझ कर अंतर्निहित `print` क्रिया के सामान है। इसके इस्तेमाल का एक उदाहरण : +```python +console.print("Hello", "World!") +``` + + +जैसा आप उम्मीद कर रहे होंगे, यह टर्मिनल पर `"Hello World!"` छाप देगा। ध्यान दें की अंतर्निहित `print` क्रिया के भिन्न, Rich आपके पाठ को "वर्ड-रैप" कर देगा ताकि वह टर्मिनल की चौड़ाई में फस सके। + +अपने उत्पादन में रंग और शैली डालने के लिए एक से अधिक तरीके हैं। `style` कीवर्ड तर्क जोड़कर आप सम्पूर्ण उत्पादन के लिए शैली निर्धारित कर सकते हैं। इसका एक उदाहरण: +```python +console.print("Hello", "World!", style="bold red") +``` + +उत्पादन कुछ इस प्रकार का होगा: +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + + +ये एक बारी में एक पंक्ति का शैलीकरण करने के लिए तो ठीक है। अधिक बारीकी से शैलीकरण करने के लिए, Rich एक विशेष मार्कअप को प्रदर्शित करता है जो रचनाक्रम में [bbcode](https://en.wikipedia.org/wiki/BBCode) से मिलता-जुलता है। इसका एक उदाहरण: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +कम-से-कम मेहनत में परिष्कृत उत्पादन उत्पन्न करने के लिए आप एक Console वस्तु का उपयोग कर सकते हैं। अधिक जानकारी के लिए आप [Console API](https://rich.readthedocs.io/en/latest/console.html) का प्रलेख पढ़ सकते हैं। + +## Rich Inspect + +Rich में एक [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) फलन उपलब्ध है जो किसी भी Python वस्तु, जैसे की क्लास, इन्स्टैन्स या अंतर्निहित पर प्रतिवेदन उत्पादित कर सकता है। +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +अधिक जानकारी के लिए [inspect का प्रलेखन](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) पढ़ें। + +# Rich संग्रह + +Rich में कई अंतर्निहित _प्रतिपाद्य_ मौजूद हैं जिनका इस्तेमाल करके आप अपने CLI में सुंदर उत्पादन उत्पन्न कर सकते हैं तथा अपने कोड का दोषमार्जन (डीबग) करने में सहायता प सकते हैं। + + +जानकारी के लिए निम्न शीर्षकों पर क्लिक करें: + +
+लॉग (Log) + +Console वस्तु के पास एक `log()` फलन होता है जिसका अंतरापृष्ठ `print()` से मिलता है, पर साथ में वर्तमान समय और आवाहन करने वाली पंक्ति के लिए एक खाना प्रस्तुत करता है। व्यक्तिक्रम तौर पर Rich Python संरचनाएं एवं repr मालाओं (स्ट्रिंगों) पर रचनाक्रम चिह्नांकन करेगा। यदि आप एक संग्रह (यानि एक डिक्शनेरी या एक सूची) को लॉग करते हैं तो Rich उसे सुंदरता से छापेगा ताकि वह उपलब्ध जगह में फस सके। इनमें से कुछ विशेषताओं का उदहरण प्रस्तुत है: + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +उपर्युक्त कोड से निम्न उत्पादन उत्पन्न होता है: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +ध्यान दें `log_levels` तर्क की तरफ, जो एक सारणी उत्पादित करता है जिसमे लॉग फलन के आवाहन के स्थान के स्थानिये चर युक्त हैं। + +लॉग फलन का इस्तेमाल परिसेवकों (सर्वर) जैसे लंबे समय के लिये चलने वाले अनुप्रयोगों के लिए टर्मिनल पर प्रचालेखन के लिए किया जा सकता है, पर यह एक बहुत अच्छा दोषमार्जन सहायक भी है। + +
+
+प्रचालेखन संचालक + +Python के `logging` मापांक से आए हुए उत्पादन का संरूपण एवं रंगीकरण करने के लिए आप अंतर्निहित [Handler वर्ग](https://rich.readthedocs.io/en/latest/logging.html) का भी इस्तेमाल कर सकते हैं। उत्पादन का एक उपहरण प्रस्तुत है: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+इमोजी + +Console उत्पादन में इमोजी डालने के लिए नाम को दो अपूर्ण विरामों (:) के बीच रखें। इसका एक उदाहरण: +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +कृपया इसका इस्तेमाल समझदारी से करें। +
+ +
+सारणियाँ + +Rich यूनिकोड डिब्बा अक्षरों की सहायता से लचीली [सारणियाँ](https://rich.readthedocs.io/en/latest/tables.html) प्रदर्शित कर सकता है। सीमाएँ, शैलियाँ, कक्ष संरेखण आदि के लिए कई सारे स्वरूपण विकल्प उपलब्ध हैं। + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +उपर्युक्त अनुप्राणन examples डायरेक्टरी के [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) से बनाया गया है। + +इससे सरल संचिका का उदाहरण: +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +इससे निम्नलिखित उत्पादन उत्पन्न होता है: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +ध्यान दें की कॉनसोल मार्कअप `print()` और `log()` की तरह ही प्रदर्शित होते हैं। वास्तव में, कोई भी वस्तु जो Rich के द्वारा प्रदर्शनीय है वह शीर्षकों / पंक्तियों (दूसरी संचिकाओं में भी) में युक्त किया जा सकता है। + +`Table` वर्ग इतनी बुद्धिमान है की वह टर्मिनल की उपलब्ध चौड़ाई में फ़साने के लिए स्तंभों का आकार बदल सकता है, आवश्यकता के अनुसार पाठ को लपेटते हुए। यह वही उदाहरण है, टर्मिनल को उपर्युक्त संचिका से छोटा रखते हुए: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+प्रगति सूचक डंडे + +लंबे समय तक चलने वाले कार्यों पर नज़र रखने के लिए Rich अनेक झिलमिलाहट-मुक्त [प्रगति सूचक](https://rich.readthedocs.io/en/latest/progress.html) डंडे प्रदर्शित कर सकता है। + +बुनियादी उपयोग के लिए, किसी भी क्रम को `track` फलन में लपेटें और परिणाम पर पुनरावर्तन करें। इसका एक उदाहरण: +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +अनेक प्रगति सूचक डंडे जोड़ने इससे अधिक कठिन नहीं है। ये रहा एक उदाहरण जो प्रलेखन से उठाया गया है: +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +स्तंभों का विन्यास इस प्रकार किया जा सकता है की आपकी इच्छानुसार विवरण दिखाए जाएँ। अंतर्निहित स्तंभ में प्रतिशत पूरा, संचिका आकार, संचिका गति तथा शेष समय युक्त होते हैं। ये रहा एक और उदाहरण एक चालू डाउनलोड को दर्शाते हुए। +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +इसे स्वयं आजमाने के लिए, देखें [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) जो अनेक URL एक साथ डाउनलोड करते हुए प्रगति दर्शाता है। +
+ +
+स्थिति + +ऐसी परिस्थितियों में जहां प्रगति की गणना करना कठिन हों, आप [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) (स्थिति) फलन का उपयोग कर सकते हैं जो एक 'स्पिनर' अनुप्राणन और संदेश दर्शाएगा। अनुप्राणन आपको सामान्य तरीके से कॉनसोल को इस्तेमाल करने से नहीं रोकेगा। ये एक उदाहरण: +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +इससे टर्मिनल में निम्नलिखित उत्पादन उत्पन्न होता है: +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +स्पिनर अनुप्राणन [cli-spinners](https://www.npmjs.com/package/cli-spinners) से उधारे गए थे। आप `spinner` प्राचल को उल्लिखित करके स्पिनर चुन सकते हैं। उपलब्ध विकल्प देखने के लिए निम्नलिखित आदेश चलकर देखें: +``` +python -m rich.spinner +``` + +उपर्युक्त आदेश टर्मिनल में निम्नलिखित उत्पादन उतपन्न करता है: +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+वृक्ष + +Rich मरकदर्शक रेखाओं से [tree](https://rich.readthedocs.io/en/latest/tree.html) (वृक्ष) प्रदर्शित कर सकता है। संचिता संरचना, अथवा कोई भी और पदानुक्रमित डेटा दर्शाने के लिए वृक्ष एक आदर्श विकल्प है। + +वृक्ष के नाम सरल पाठ्यांश या कुछ भी और जो Rich प्रदर्शित कर सके। इसके एक प्रदर्शन के लिए निम्नलिखित को चलाएं: +``` +python -m rich.tree +``` + +इससे निम्न उत्पादन उत्पन्न होता है: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +देखें उदाहरण [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) एक क्रमादेश के लिए जो किसी भी डायरेक्टरी का वृक्ष दृश्य (ट्री व्यू) दर्शाएगा, लिनक्स के `tree` आदेश के समान। + +
+ +
+स्तंभ + + +Rich सामग्री को समान अथवा श्रेष्ट चौड़ाई के साथ स्पष्ट [स्तंभ](https://rich.readthedocs.io/en/latest/columns.html) प्रदर्शित कार सकता है। यही (MacOS / Linux) `ls` आदेश का बहुत बुनियादी प्रतिरूप प्रस्तुत किया गया है जो स्तंभों में डायरेक्टरी सूची को दर्शाता है। + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +निम्न स्क्रीनशॉट [स्तंभों के उदाहरण](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) का उत्पादन है जो एक API से खींचे गए डेटा को स्तंभों में प्रदर्शित करता है: +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich [markdown](https://rich.readthedocs.io/en/latest/markdown.html) को प्रदर्शित कार सकता है और स्वरूपण का अनुवाद टर्मिनल पर करने में उचित कार्य करता है। + + +Markdown प्रदर्शित करने के लिए आप `Markdown` वर्ग को आयात कार सकते हैं और उसे markdown कोड युक्त अक्षरमाला के साथ निर्मित कर सकते हैं। फिर उसे कॉनसोल पर छापें। एक उदाहरण प्रस्तुत है: +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +इससे कुछ इस प्रकार का उत्पादन उत्पन्न होगा: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+रचनाक्रम चिह्नांकन + +Rich [रचनाक्रम चिह्नांकन](https://rich.readthedocs.io/en/latest/syntax.html) के लिए [pygments](https://pygments.org/) संग्रह का उपयोग करता है। उपयोग markdown को प्रदर्शित करने से मिलता-जुलता है; एक `Syntax` वस्तु निर्मित करें और उसे कॉनसोल पर छापें। एक उदाहरण: +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +This will produce the following output: +इससे निम्न उत्पादन उत्पन्न होता है: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+ट्रेसबैक + +Rich [खूबसूरत ट्रेसबैक](https://rich.readthedocs.io/en/latest/traceback.html) दर्शा सकता है जो पढ़ने में आसान तथा मानक Python ट्रेसबैकों से अधिक कोड दिखाता है। आप Rich को व्यक्तीक्रम ट्रेसबैक संचालक भी निर्धारित कार सकते हैं ताकि सभी बेपकड़ अपवाद Rich के द्वारा प्रदर्शित हों। + +OSX (Linux पर समान) पर यह कुछ इस प्रकार दिखता है: +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +सभी Rich प्रतिपाद्य [कॉनसोल प्रोटोकॉल](https://rich.readthedocs.io/en/latest/protocol.html) का उपयोग करते हैं, जिसे आप स्वयं की Rich सामग्री बनाने के लिए भी इस्तेमाल कार सकते हैं। + +# उद्यम के लिए Rich + +Tidelift Subscription के हिस्से के तौर पर उपलब्ध। + +Rich एवं सहस्त्रों और संग्रहों के पालक आपके अनुप्रयोगों को बनाने के लिए इस्तेमाल किए जाने वाले खुले स्त्रोत संग्रहों के लिए व्यावसायिक सहायता तथा रखरखाव देने के लिए Tidelift के साथ काम कार रहे हैं। समय बचाइए, जोखिम काम कीजिए, और कोड स्वास्थ सुधारें, और साथ में जिन संग्रहों को आप इस्तेमाल करते हैं उनके पालकों को भुगतान करें। [अधिक जानें।](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Rich का उपयोग करने वाली परियोजनाएँ + +ये रहे कुछ परियोजनाएँ जो Rich इस्तेमाल करते हैं। +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + त्रिविम न्यूरो-संरचनात्मक डेटा का चित्रण करने के लिए एक Python संग्रह +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + स्वचालित विकोडन उपकरण +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + Python के लिए एक उच्च-प्रदर्शन, उच्च-सूक्ष्मता CPU एवं स्मृति प्रोफाइलर +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + अपनी आदेश पंक्ति (कमांड लाइन) से GitHub रुझानि परियोजिनाएं ब्राउज़ करें +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + यह उपकरण कई साधारण, भेद्य घटकों (openssl, libpng, libxml2, expat और कुछ और) के लिए जांच करता है ताकि आपको बता सके की क्या आपके तंत्र में जानी हुई कमज़ोरियों वाले संग्रह युक्त हैं। +- [nf-core/tools](https://github.com/nf-core/tools) + nf-core समुदाय के लिए सहायक उपकरणों युक्त Python संग्रह +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + उन्नत दोषमार्जन के लिए pdb + Rich संग्रह +- [plant99/felicette](https://github.com/plant99/felicette) + पुतलों के लिए उपग्रह चित्र +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Selenium और pytest के साथ १० गुना तेज़ स्वचालन एवं परीक्षण करें। बैटरी शामिल। +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + स्वतः उपशीर्षकों को वीडियो के साथ समकालित करें। +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + किसी भी संसूचक में सद्य-अनुक्रिया द्विविम वस्तु ट्रैकिंग जोड़ने के लिए एक हल्का Python संग्रह। +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) + Ansible-lint उन आचरणों और व्यवहारों के लिए प्लेबुकों में जाँच करता है जिन्हे संभावित रूप से सुधारा जा सकता है +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule testing framework + Ansible Molecule परीक्षण ढांचा +- +[कई और](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/README.id.md b/README.id.md new file mode 100644 index 0000000000..165b27c38e --- /dev/null +++ b/README.id.md @@ -0,0 +1,462 @@ +[![Supported Python Versions](https://img.shields.io/pypi/pyversions/rich/10.11.0)](https://pypi.org/project/rich/) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) + +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![codecov](https://img.shields.io/codecov/c/github/Textualize/rich?label=codecov&logo=codecov)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + • [Indonesian readme](https://github.com/willmcgugan/rich/blob/master/README.id.md) + +Rich adalah library Python yang membantu _memperindah_ tampilan output suatu program di terminal. + +[Rich API](https://rich.readthedocs.io/en/latest/) dapat digunakan untuk mempermudah dalam penambahan gaya dan pewarnaan output di terminal. Rich juga mendukung fitur lain seperti pembuatan tabel, bar progress, penulisan markdown, penghighitan syntax source code, tracebacks, dan masih banyak lagi. + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Sebagai pengenalan Rich saksikan video berikut [calmcode.io](https://calmcode.io/rich/introduction.html) oleh [@fishnets88](https://twitter.com/fishnets88). + +Lihat pendapat [pengguna yang telah menggunakan Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). + +## Kompabilitas + +Rich dapat berjalan di Linux, OSX, dan Windows. Warna tambahan / emoji dapat berjalan di Windows Terminal baru, untuk terminal lama pewarnaan terbatas ke dalam 16 warna. Rich memerlukan versi Python 3.6.3 atau ke atas. + +Rich dapat berjalan di [Jupyter notebooks](https://jupyter.org/) tanpa memerlukan konfigurasi tambahan. + +## Instalasi + +Install dengan `pip` atau paket manager favorit anda. + +```sh +python -m pip install rich +``` + +Jalankan perintah berikut untuk menguji Rich di terminal anda: + +```sh +python -m rich +``` + +## Rich Print + +Untuk menambahkan rich sebagai output program anda, lakukan import method [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start), yang memiliki signature sama dengan fungsi built-in Python. Coba jalankan program berikut: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich dapat diinstal ke dalam Python REPL sehingga setiap struktur data akan ditampilkan dengan indah dan terhighlight. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Penggunaan Console + +Untuk kontrol lebih terhadap konten terminal, lakukan import dan susun suatu [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object. + +```python +from rich.console import Console + +console = Console() +``` + +Console object memiliki method `print` yang berfungsi serupa dengan built-in `print`. Berikut adalah contoh penggunaannya: + +```python +console.print("Hello", "World!") +``` + +Seperti yang anda perkirakan, perintah tersebut akan menampilkan `"Hello World!"` sebagai output di terminal. Catatan, perbedaan dengan fungsi built-in `print`, Rich membuat teks termampatkan disesuaikan dengan lebar terminal. + +Terdapat beberapa cara untuk melakukan penambahan warna dan gaya output dari program anda. Anda dapat mengatur keseluruhan output dengan menambahkan keyword argumen `style`. Berikut adalah contoh penerapannya: + +```python +console.print("Hello", "World!", style="bold red") +``` + +Output dari perintah tersebut akan tampak sebagai berikut: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +Melakukan perubahan tampilan teks output dalam satu waktu mungkin sudah baik. Tetapi untuk membuat tampilan lebih rapi, Rich mendukung fitur rendering menggunakan pemformatan spesial dimana syntaxnya serupa dengan [bbcode](https://en.wikipedia.org/wiki/BBCode). Berikut adalah contoh penerapannya: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Anda dapat menggunakan console object untuk menciptakan keluaran yang indah dengan usaha yang sedikit. Kunjungi [Console API](https://rich.readthedocs.io/en/latest/console.html) untuk informasi lebih lengkap. + +## Rich Inspect + +Rich memiliki fungsi [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) yang dapat membuat laporan untuk setiap Python object, seperti class, instance, atau built-in. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Kunjungi [dokumentasi inspect](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) untuk detail lebih lanjut. + +# Rich Library + +Rich mengandung sejumlah built-in yang bersifat _renderables_, artinya anda dapat menciptakan output yang elegant pda program CLI anda serta dapat membantu dalam proses debugging program anda. + +Klik pilihan berikut untuk detail lebih lanjut: + +
+Log + +Console object mempunyai method bernama `log()` yang serupa dengan `print()`, tetapi juga mendukung fitur perenderan kolom waktu terkini serta baris file yang melakukan pemanggilan fungsi tertentu. Secara default Rich akan menghilight syntax untuk struktur python dan REPR strings. Jika anda melakukan log pada sekumpulan data (misal dictionary atau list) Rich akan memperindah output yang ditampilkan serta disesuaikan dengan ukuran terminal yang tersedia. Berikut adalah contoh penerapan dari beberapa fitur ini. + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +Perintah di atas akan menampilkan output sebagai berikut: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Sebagai catatan, argumen `log_locals` berupa tabel yang berisikan variabel lokal yang menunjukkan lokasi dimana log tersebut dipanggil. + +Method log ini dapat digunakan untuk mencatat aktivitas terminal yang berjalan lama seperti servers, tetapi method ini juga sangat baik untuk membantu dalam proses debugging. + +
+
+Penanganan Logging + +Anda dapat juga menggunakan builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) untuk memformat dan mewarnai output dari module logging Python. Berikut adalah contoh penerapannya: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji + +Untuk menambahkan emoji sebagai output di console, tuliskan nama emoji diantara dua buah titik dua (:). Berikut adalah contoh penerapannya: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Mohon gunakan fitur ini dengan bijak. + +
+ +
+Tabel + +Rich mendukung perenderan [tabel](https://rich.readthedocs.io/en/latest/tables.html) secara fleksibel dengan karakter unicode. Terdapat variasi sangat besar untuk opsi pemformatan seperti pengaturan border, gaya tabel, perataan teks di dalam cell, dan lain sebagainya. + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +Animasi di atas dibuat dengan program [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) pada direktori examples. + +Berikut adalah contoh tabel sederhana: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Program di atas akan menghasilkan output sebagai berikut: + +![tabel](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Sebagai catatan console markup dirender sama seperti `print()` dan `log()`. Faktanya, untuk segala bentuk hal yang dapat dirender menggunakan Rich dapat disisipkan ke dalam header / baris (bahkan tabel lain). + +Class `Table` memiliki kemampuan yang baik untuk mengatur ukuran kolom supaya sesuai dengan lebar yang disediakan oleh terminal. Berikut adalah contoh penerapannya, dengan terminal memiliki ukuran yang lebih kecil dibandingkan tabel di atas: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Bar Progress + +Rich dapat merender beragam bar [progress](https://rich.readthedocs.io/en/latest/progress.html) interaktif untuk memantau kemajuan yang telah dicapai oleh program yang berjalan lama. + +Untuk penggunaan dasar, masukan setiap urutan yang hendak dijadikan ke dalam bentuk progress ke dalam fungsi 'track' dan iterasikan urutan tersebut di atas outputnya. Berikut adalah contoh penerapannya: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Tidaklah sulit untuk menambahkan beberapa bar progress sekaligus. Berikut adalah contoh implementasi yang diambil dari file dokumentasi: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +Bagian kolom dapat dikonfigurasikan sesuai dengan kebutuhan. Built-in kolom juga memiliki fitur presentasi seleasi, ukuran file, kecepatan file, dan waktu sisa. Berikut adalah contoh menampilkan bar progress ketika mengunduh suatu file: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +Untuk bereksperimen, periksa [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) yang dapat menampilkan beberapa progress bar pengunduhan dari beberapa alamat URL sekaligus. + +
+ +
+Status + +Untuk kondisi dimana perhitungan sulit dilakukan dengan perhitunggan progress, gunakan method [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) berikut yang menampilkan animasi 'spinner' dan pesan. Animasi tersebut tidak mencegah penggunaan console seperti keadaan normal. Berikut adalah contoh penerapannya: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Program di atas akan menghasilkan output sebagai berikut. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +Animasi spinner tersebut diambil dari [cli-spinners](https://www.npmjs.com/package/cli-spinners). Anda dapat menentukan spinner yang hendak digunakan dengan menspesifikannya di parameter `spinner`. Jalankan perintah berikut untuk melihat parameter yang tersedia: + +``` +python -m rich.spinner +``` + +Perintah di atas akan menghasilkan output sebagai berikut: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Tree + +Rich dapat merender perintah [tree](https://rich.readthedocs.io/en/latest/tree.html) beserta dengan garis penunjuk. Suatu perintah tree idealnya digunakan untuk menampilkan struktur suatu file atau data hierarki lainnya. + +Label dari tree dapat berupa teks sederhana atau apapun yang dapat dirender oleh Rich, untuk contoh, jalankan perintah berikut: + +``` +python -m rich.tree +``` + +Program di atas akan menghasilkan output sebagai berikut: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Periksa contoh program [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) untuk menampilkan tampilan tree view dari direktori apapun, perintah ini serupa dengan `tree` pada linux. + +
+ +
+Kolom + +Rich dapat merender konten [kolom](https://rich.readthedocs.io/en/latest/columns.html) secara rapi dengan ukuran lebar yang sama atau optimal. Berikut adalah hasil kloning perintah dasar dari (MacOS / Linux) yaitu `ls` untuk melakukan listing direktori menggunakan kolom: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +Screenshot berikut merupakan output dari [contoh kolom](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) yang menampilkan data yang diambil melalui API ke dalam bentuk kolom: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich dapat merender [markdown](https://rich.readthedocs.io/en/latest/markdown.html) dan melakukan tugasnya untuk menerjemahkan format tersebut supaya dapat ditampilkan di terminal. + +Untuk dapat merender markdown, import class `Markdown` dan inputkan string yang mengandung markdown tersebut. Lalu cetak ke dalam console. Berikut adalah contoh penerapannya: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Program di atas akan menghasilkan output seperti berikut: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Penghilightan Syntax + +Rich memanfaatkan library [pygments](https://pygments.org/) supaya dapat melakukan [penghilightan syntax](https://rich.readthedocs.io/en/latest/syntax.html). Penggunaannya serupa dengan merender markdown; susun object `Syntax` dan cetak output pada console. Berikut adalah contoh penerapannya: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Program di atas akan menghasilkan output sebagai berikut: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Tracebacks + +Rich dapat merender [tracebacks dengan indah](https://rich.readthedocs.io/en/latest/traceback.html) yang membuatnya mudah untuk dibaca dan menampilkan program yang dibuat lebih baik dibandingkan fitur standar Python. Anda dapat mengatur Rich sebagai traceback handler secara default sehingga setiap pesan exceptions akan dirender melalui Rich. + +Berikut adalah tampilannya pada OSX (serupa dengan Linux): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Semua perenderan Rich menggunakan [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), anda dapat juga mengimplementasikannya pada konten Rich milik anda. + +# Rich CLI + + +Baca juga [Rich CLI](https://github.com/textualize/rich-cli) sebuah program command line yang dibuat menggunakan Rich. Penghilightan syntax, perenderan markdown, menampilkan CSVs ke dalam tabel, dan masih banyak lagi, secara langsung melalui command prompt. + + +![Rich CLI](https://raw.githubusercontent.com/Textualize/rich-cli/main/imgs/rich-cli-splash.jpg) + + +# Projek yang telah menggunakan Rich + +Berikut adalah beberpa projek yang menggunakan Rich: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + Sebuah package Python untuk visualisasi data neuro-anatomi tiga dimensi. +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + Tools yang digunakan untuk melakukan deskripsi otomatis. +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + profiler memori dan CPU untuk Python yang memiliki nilai performa dan presisi tinggi. +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Melakukan penelusuran projek terkenal GitHub melalui command line. +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + Tools ini dapat digunakan untuk melakukan scanning pada komponen yang rentan (openssl, libpng, libxml2, expat and a few others) untuk membuat anda mengetahui sistem anda mempunyai library yang telah diketahui kerentanannya. +- [nf-core/tools](https://github.com/nf-core/tools) + package Python dengan tools bantuan untuk komunitas nf-core. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + gabungan library pdb + Rich library untuk memperindah proses debugging. +- [plant99/felicette](https://github.com/plant99/felicette) + gambar citra satelit untuk pemula. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + tools otomatisasi dan test testing 10x lebih cepat dibandingkan dengan Selenium & pytest. Termasuk didalamnya baterai. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + tools sinkronisasi subtitle dengan video. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Library Python ringan untuk menambahkan deteksi objek secara real-time pada objek 2D pada suatu detektor. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Sebuah ansible-lint untuk memeriksa playbooks yang digunakan sebagai practices and behaviour yang secara potensial dapat ditingkatkan. +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule untuk framework testing +- +[Lebih banyak lagi](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/README.it.md b/README.it.md new file mode 100644 index 0000000000..5df37b8942 --- /dev/null +++ b/README.it.md @@ -0,0 +1,457 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + + +Rich è una libreria Python per un testo _rich_ e con una piacevole formattazione nel terminale. + +Le [Rich API](https://rich.readthedocs.io/en/latest/) permettono di aggiungere facilmente colore e stile all'output del terminale. Rich permette di visualizzare tabelle, barre di avanzamento, markdown, evidenziazione della sintassi, tracebacks, e molto altro ancora — tutto già pronto all'uso. + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Per una video-introduzione di Rich puoi vedere [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88). + +Guarda cosa [le persone dicono su Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). + +## Compatibilità + +Rich funziona su Linux, OSX, e Windows. True color / emoji funzionano con il nuovo Windows Terminal, il terminale classico è limitato a 16 colori. Rich richiede Python 3.6.3 o superiore. + +Rich funziona con i [Jupyter notebooks](https://jupyter.org/) senza configurazioni aggiuntive. + +## Installazione + +Installa con `pip` o il tuo PyPI package manager preferito. + +```sh +python -m pip install rich +``` + +Esegui il seguente comando per testare l'output di Rich sul tuo terminale: + +```sh +python -m rich +``` + +## Rich Print + +Utilizzare rich è semplicissimo, ti basta importare il metodo [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start), che ha la stessa signature della funzione builtin in Python. Prova: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich può essere installo in Python REPL, in questo modo ogni struttura dati sarà visualizzata in modo gradevole ed evidenziato. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Utilizzo di Console + +Per un maggiore personalizzazione dei contenuti puoi importare ed instanziare un oggetto [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console). + +```python +from rich.console import Console + +console = Console() +``` + +L'oggetto Console ha il metodo `print` che utilizza volutamente un interfaccia simile a quella del `print` originale. Ad esempio: + +```python +console.print("Hello", "World!") +``` + +Come puoi immaginare, questo stamperà `"Hello World!"` sul terminale. Nota che diversamente dalla funzione builtin `print`, Rich potrebbe portare a capo il testo per rispettare le dimensioni del terminale. + +Ci sono diversi modi di aggiungere stile e colore al tuo output. Puoi impostare uno stile per l'intero output utilizzando l'argomento keyword `style`. Ad esempio: + +```python +console.print("Hello", "World!", style="bold red") +``` + +L'output sarà qualcosa tipo: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +Questo va bene per applicare uno stile ad una linea di testo alla volta. Per uno stile più ricercato, puoi utilizzare uno speciale linguaggio di markup che è simile nella sintassi a [bbcode](https://en.wikipedia.org/wiki/BBCode). Ad esempio: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Puoi utilizzare l'oggetto Console per generare output sofisticati con il minimo sforzo. Vedi la docs di [Console API](https://rich.readthedocs.io/en/latest/console.html) per ulteriori dettagli. + +## Rich Inspect + +Rich ha una funzione [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) che può produrre un report per un qualsiasi oggetto Python, come una classe, un instanza, o un builtin. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Vedi [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) per ulteriori dettagli. + +# Rich Library + +Rich contiene alcuni builtin _renderables_ che puoi utilizzare per creare eleganti output nella tua CLI e aiutarti nel debug del tuo codice. + +Fai click sulle seguenti intestazioni per ulteriori dettagli: + +
+Log + +L'oggetto Console ha un metodo `log()` che utilizza un'interfaccia simile a `print()`, ma visualizza anche una colonna con l'ora corrente, il file e la linea che hanno generato la chiamata. Di default Rich evidenzierà le strutture Python e le stringhe repr. Se logghi un oggetto di tipo collection (e.s. un dict o una lista) Rich automaticamente abbellirà l'output in modo che possa entrare nello spazio disponibile. Ecco qui un esempio di alcune delle feature discusse: + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +Il codice appena mostrato produce il seguente output: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Nota l'argomento `log_locals`, che visualizza una tabella contenente le variabili locali dove il metodo log è stato chiamato. + +Il metodo log può essere usato per il logging su terminale di applicazioni che solitamente girano su server, ma ha anche uno scopo orientato al debugging. + +
+
+Logging Handler + +Puoi anche utilizzare la classe builtin [Handler](https://rich.readthedocs.io/en/latest/logging.html) per formattare e colorare l'output dal modulo logging di Python. Ecco un esempio dell'output: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji + +Per inserire un emoji nell'output della console inseriscine il nome in mezzo a due ':'. Ad esempio: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Usa questa feature saggiamente. + +
+ +
+Tables + +Rich può visualizzare [tabelle](https://rich.readthedocs.io/en/latest/tables.html) flessibili con caratteri unicode. C'è una vasta gamma di opzioni per la formattazione di bordi, stili, allineamenti di celle etc. + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +Questa animazione è stata realizzata con [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) presente nella directory examples. + +Ecco qui un semplice esempio di tabella: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Questo produce il seguente output: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Nota che il console markup è visualizzato nello stesso modo di `print()` e `log()`. Infatti, tutto ciò che è visualizzabile da Rich può essere incluso nelle intestazioni / righe (anche altre tabelle). + +La classe `Table` è abbastanza smart da ridimensionare le colonne per entrare nello spazio residuo del terminale, wrappando il testo come richiesto. Ad esempio, con il terminale reso più piccolo della tabella sopra: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Barre di avanzamento + +Rich può visualizzare, senza sfarfallio, multiple barre [di avanzamento](https://rich.readthedocs.io/en/latest/progress.html) per tenere traccia di task di lunga durata. + +Per un utilizzo base, wrappa ogni 'step' con la funzione `track` e itera sul risultato. Ad esempio: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Non è difficile aggiungere barre di avanzamento multiple. Ecco un esempio dalla documentazione: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +Le colonne possono essere configurate per visualizzare qualsiasi dettaglio tu voglia. Le colonne built-in includono percentuale di completamente, dimensione del file, velocità, e tempo rimasto. Ecco un altro esempio che mostra un download in corso: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +Per testare tu stesso, vedi [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) che può scaricare multipli URL simultaneamente mentre mostra lo stato di avanzamento. + +
+ +
+Status + +Per situazioni in cui è difficile calcolare l'avanzamento, puoi utilizzare il metodo [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) che mostrerà un animazione 'spinner' e un messaggio. L'animazione non ti impedisce di utilizzare la console normalmente. Ad esempio: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Questo produrrà il seguente output nel terminale. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +L'animazione dello spinner è ispirata da [cli-spinners](https://www.npmjs.com/package/cli-spinners). Puoi selezionarne uno specificando `spinner` tra i parametri. Esegui il seguente comando per visualizzare le possibili opzioni: + +```shell +python -m rich.spinner +``` + +Questo produrrà il seguente output nel terminale. + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Albero + +Rich può visualizzare un [albero](https://rich.readthedocs.io/en/latest/tree.html) con linee guida. Un albero è ideale per mostrare la struttura di un file, o altri dati gerarchici. + +Le etichette dell'albero possono essere semplice testo o qualsiasi altra cosa che Rich può visualizzare. Esegui il seguente comando per una dimostrazione: + +```shell +python -m rich.tree +``` + +Questo produrrà il seguente output: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Vedi l'esempio [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) per uno script che mostra una vista ad albero di ogni directory, simile a quella del comando linux `tree`. + +
+ +
+Colonne + +Rich può visualizzare contenuti in [colonne](https://rich.readthedocs.io/en/latest/columns.html) ordinate con larghezza uguale o ottimale. Ecco qui un clone base del comando (MacOS / Linux) `ls` che mostra il contenuto di una directory in colonna: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +Il seguente screenshot è l'output dell'[esempio di columns](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) che visualizza i dati ottenuti da un API in colonna: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich può visualizzare [markdown](https://rich.readthedocs.io/en/latest/markdown.html) e tradurlo in modo da visualizzarlo su terminale. + +Per visualizzare markdown importa la classe `Markdown` e instanziala con una stringa contenente codice markdown. Dopo stampala sulla console. Ad esempio: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Questo produrrà un output simile al seguente: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Evidenziazione della sintassi + +Rich utilizza la libreria [pygments](https://pygments.org/) per implementare il [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). L'utilizzo è simile a quello per visualizzare markdown; instanzia un oggetto `Syntax` e stampalo sulla console. Ad esempio: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Itera e genera una tupla con un flag per il primo e ultimo valore.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Questo produrrà il seguente output: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Tracebacks + +Rich può visualizzare [gradevoli tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) che sono più semplici da leggere e che mostrano più codice rispetto ai Python tracebacks. Puoi impostare Rich come il traceback handler di default, in questo modo tutte le eccezioni non gestiti saranno visualizzate da Rich. + +Ecco come appare su OSX (simile a Linux): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Tutti i Rich renderables utilizzano [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), che puoi utilizzare per implementare nuovi contenuti su Rich. + +# Rich per le aziende + +Disponibile come parte dell'iscrizione a Tidelift. + +Lo sviluppatore di Rich e migliaia di altri packages lavorano con Tidelift per garantire supporto commerciale e mantenimento per i pacchetti open source che utilizzi per costruire le tue applicazioni. Risparmia tempo, riduci i rischi, e migliora la vita del codice, pagando i mantenitori dello stesso package che utilizzi. [Ulteriori informazioni.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Progetti che usano Rich + +Ecco alcuni progetti che utilizzano Rich: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + a python package for the visualization of three dimensional neuro-anatomical data +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + Automated decryption tool +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + a high-performance, high-precision CPU and memory profiler for Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Browse GitHub trending projects from your command line +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + This tool scans for a number of common, vulnerable components (openssl, libpng, libxml2, expat and a few others) to let you know if your system includes common libraries with known vulnerabilities. +- [nf-core/tools](https://github.com/nf-core/tools) + Python package with helper tools for the nf-core community. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Rich library for enhanced debugging +- [plant99/felicette](https://github.com/plant99/felicette) + Satellite imagery for dummies. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Automate & test 10x faster with Selenium & pytest. Batteries included. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Automagically synchronize subtitles with video. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Lightweight Python library for adding real-time 2D object tracking to any detector. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint checks playbooks for practices and behaviour that could potentially be improved +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule testing framework +- +[Many more](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/README.ja.md b/README.ja.md new file mode 100644 index 0000000000..ce28b48c9a --- /dev/null +++ b/README.ja.md @@ -0,0 +1,409 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Richは、 _リッチ_ なテキストや美しい書式設定をターミナルで行うためのPythonライブラリです。 + +[Rich API](https://rich.readthedocs.io/en/latest/)を使用すると、ターミナルの出力に色やスタイルを簡単に追加することができます。 Richはきれいなテーブル、プログレスバー、マークダウン、シンタックスハイライトされたソースコード、トレースバックなどをすぐに生成・表示することもできます。 + +![機能](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Richの紹介動画はこちらをご覧ください。 [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88). + +[Richについての人々の感想を見る。](https://www.willmcgugan.com/blog/pages/post/rich-tweets/) + +## 互換性 + +RichはLinux、OSX、Windowsに対応しています。True colorと絵文字は新しい Windows ターミナルで動作しますが、古いターミナルでは8色に制限されています。Richを使用するにはPythonのバージョンは3.6.3以降が必要です。 + +Richは追加の設定を行わずとも、[Jupyter notebooks](https://jupyter.org/)で動作します。 + +## インストール + +`pip` や、あなたのお気に入りのPyPIパッケージマネージャを使ってインストールしてください。 + +```sh +python -m pip install rich +``` + +以下のコマンドを実行して、ターミナルでリッチの出力をテストできます: + +```sh +python -m rich +``` + +## Richのprint関数 + +簡単にリッチな出力をアプリケーションに追加するには、Pythonの組み込み関数と同じ名前を持つ [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) メソッドをインポートすることで実現できます。こちらを試してみてください: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +RichはPythonのREPLでインストールすることができ、データ構造がきれいに表示され、ハイライトされます。 + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Rich Inspect + +RichにはPythonオブジェクトやクラス、インスタンス、組み込み関数などに関するレポートを作成することができる、[inspect関数](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect)があります。 + +```python +>>> from rich import inspect +>>> inspect(str, methods=True) +``` + +## Consoleの使い方 + +リッチなターミナルコンテンツをより制御していくには、[Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) オブジェクトをインポートして構築していきます。 + + +```python +from rich.console import Console + +console = Console() +``` + +Console オブジェクトには `print` メソッドがあり、これは組み込み関数の `print` と意図的に似たインターフェイスを持っています。 +以下に使用例を示します: + +```python +console.print("Hello", "World!") +``` + +あなたが予想した通り、これは `"Hello World!"` をターミナルに表示します。組み込み関数の `print` とは異なり、Rich はターミナルの幅に合わせてテキストをワードラップすることに注意してください。 + +出力結果に色やスタイルを追加する方法はいくつかあります。キーワード引数に `style` を追加することで、出力結果全体のスタイルを設定することができます。以下に例を示します: + +```python +console.print("Hello", "World!", style="bold red") +``` + +以下のように出力されます: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +この方法は一行のテキストを一度にスタイリングするのに適しています。 +より細かくスタイリングを行うために、Richは[bbcode](https://en.wikipedia.org/wiki/BBCode)に似た構文の特別なマークアップを表示することができます。 +これはその例です: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +### Console logging + +Consoleオブジェクトには `log()` メソッドがあり、これは `print()` と同じインターフェイスを持ちますが、現在の時刻と呼び出しを行ったファイルと行数についてもカラムに表示します。デフォルトでは、RichはPythonの構造体とrepr文字列のシンタックスハイライトを行います。もしコレクション(例: dictやlist)をログに記録した場合、Richはそれを利用可能なスペースに収まるようにきれいに表示します。以下に、これらの機能のいくつかの例を示します。 + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +上の例では以下のような出力が得られます: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +`log_locals`という引数についてですが、これは、logメソッドが呼び出されたローカル変数を含むテーブルを出力します。 + +logメソッドはサーバのような長時間稼働しているアプリケーションのターミナルへのloggingとして使用できますが、デバッグ時に非常に役に立つ手段でもあります。 + +### Logging Handler + +また、内蔵されている[Handler class](https://rich.readthedocs.io/en/latest/logging.html)を用いて、Pythonのloggingモジュールからの出力をフォーマットしたり、色付けしたりすることもできます。以下に出力の例を示します。 + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +## 絵文字(Emoji) + +コンソールの出力に絵文字を挿入するには、2つのコロンの間に名前を入れます。例を示します: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +この機能をうまく活用してみてください。 + +## テーブル + +Richはユニコードの枠を用いて柔軟に[テーブル](https://rich.readthedocs.io/en/latest/tables.html)を表示することができます。 罫線、スタイル、セルの配置などの書式設定のためのオプションが豊富にあります。 + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +上のアニメーションは、examplesディレクトリの[table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py)で生成したものです。 + +もう少し簡単な表の例を示します: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +これにより、以下のような出力が得られます: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +コンソール上でのマークアップは`print()` や `log()` と同じように表示されることに注意してください。実際には、Rich が表示可能なものはすべてヘッダや行に含めることができます (それが他のテーブルであっても、です)。 + +`Table`クラスは、ターミナルの利用可能な幅に合わせてカラムのサイズを変更したり、必要に応じてテキストを折り返したりするのに十分なスマートさを持っています。 +これは先ほどと同じ例で、ターミナルを上のテーブルよりも小さくしたものです。 + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +## プログレスバー + +Richでは複数のちらつきのないの[プログレスバー](https://rich.readthedocs.io/en/latest/progress.html)を表示して、長時間のタスクを追跡することができます。 + +基本的な使い方としては、任意のシーケンスを `track` 関数でラップし、その結果を繰り返し処理します。以下に例を示します: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +複数のプログレスバーを追加するのはそれほど大変ではありません。以下はドキュメントから抜粋した例です: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +カラムには任意の詳細を表示するように設定することができます。組み込まれているカラムには、完了率、ファイルサイズ、ファイル速度、残り時間が含まれています。ここでは、進行中のダウンロードを表示する別の例を示します: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +こちらを自分で試して見るには、進捗状況を表示しながら複数のURLを同時にダウンロードできる [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) を参照してみてください。 + +## ステータス + +進捗状況を計算するのが難しい場合は、[status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status)メソッドを使用して、「スピナー」アニメーションとメッセージを表示させることができます。通常、アニメーションはコンソールの使用を妨げることはありません。ここに例を示します: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +これにより、ターミナルには以下のような出力が生成されます。 + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +スピナーのアニメーションは [cli-spinners](https://www.npmjs.com/package/cli-spinners) から拝借しました。`spinner`パラメータを指定することでスピナーを選択することができます。以下のコマンドを実行して、利用可能な値を確認してください: + +``` +python -m rich.spinner +``` + +上記コマンドは、ターミナルで以下のような出力を生成します: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +## ツリー + +Richはガイドライン付きの[ツリー](https://rich.readthedocs.io/en/latest/tree.html)を表示することができます。ツリーはファイル構造などの階層データを表示するのに適しています。 + +ツリーのラベルは、シンプルなテキストや、Richが表示できるものであれば何でも表示することができます。以下を実行してデモを行います: + +``` +python -m rich.tree +``` + +これにより、次のような出力が生成されます: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +linuxの `tree` コマンドと同様に、任意のディレクトリのツリー表示を行うスクリプトについては、[tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py)の例を参照してください。 + +## カラム + +Rich は、コンテンツをきれいな [カラム](https://rich.readthedocs.io/en/latest/columns.html) で等幅、または最適な幅で表示することができます。これは(MacOS / Linux) の `ls` コマンドのとても基本的なクローンで、ディレクトリ一覧をカラムで表示します。 + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +以下のスクリーンショットは、APIから引っ張ってきたデータをカラムで表示する[columns example](https://github.com/willmcgugan/rich/blob/master/examples/columns.py)による出力です: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +## マークダウン + +Richは[マークダウン](https://rich.readthedocs.io/en/latest/markdown.html)を使用することができ、フォーマットをターミナル向けに変換するための良い仕事をしてくれます。 + +マークダウンを使用するには、`Markdown`クラスをインポートし、マークダウンコードを含む文字列で構成します。そしてそれをコンソールに表示します。これは例です: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +これにより、以下のような出力が得られます: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +## シンタックスハイライト + +Richは [シンタックスハイライト](https://rich.readthedocs.io/en/latest/syntax.html) を実装するために [pygments](https://pygments.org/) ライブラリを使用しています。使い方はマークダウンを使用するのと似ています。 `Syntax` オブジェクトを構築してコンソールに表示します。以下にその例を示します: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +これにより、以下のような出力が得られます: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +## トレースバック + +Rich は [美しいトレースバック](https://rich.readthedocs.io/en/latest/traceback.html) を表示することができ、通常のPythonのトレースバックよりも読みやすく、より多くのコードを表示することができます。Richをデフォルトのトレースバックハンドラとして設定することで、捕捉されなかった例外はすべてRichによって表示されるようになります。 + +OSXではこのような表示となります(Linuxでも似たような表示になります): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +## Richを使用したプロジェクト + +ここでは、Richを使用したいくつかのプロジェクトを紹介します: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + 3次元の神経解剖学的データを可視化するpythonパッケージ +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + 自動化された復号化ツール +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + Python用の高性能・高精度 CPU/メモリプロファイラ +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + コマンドラインから GitHub のトレンドプロジェクトを閲覧できます +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + このツールは、一般的な脆弱性のあるコンポーネント(openssl, libpng, libxml2, expat, その他いくつか)をスキャンし、お使いのシステムに既知の脆弱性のある一般的なライブラリが含まれているかどうかを知らせてくれます。 +- [nf-core/tools](https://github.com/nf-core/tools) + nf-core コミュニティのためのヘルパーツールを含む Python パッケージ。 +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Richライブラリによる、強化されたデバッグツール。 +- [plant99/felicette](https://github.com/plant99/felicette) + ダミーのための衛星画像。 +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Seleniumとpytestで10倍速の自動化とテスト。バッテリーも含まれています。 +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + 字幕を自動的にビデオと同期させます。 +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + あらゆる検出器にリアルタイムの2Dオブジェクトトラッキングを追加するための軽量なPythonライブラリ。 +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) + Ansible-lint がplaybooksをチェックして、改善できる可能性のあるプラクティスや動作を確認します。 +- [ansible-community/molecule](https://github.com/ansible-community/molecule) + Ansible Moleculeのテストフレームワーク +- +[Many more](https://github.com/willmcgugan/rich/network/dependents)! diff --git a/README.kr.md b/README.kr.md new file mode 100644 index 0000000000..3b0be88785 --- /dev/null +++ b/README.kr.md @@ -0,0 +1,460 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich는 터미널에서 _풍부한(rich)_ 텍스트와 아름다운 서식을 지원하기 위한 파이썬 라이브러리입니다. + +[Rich API](https://rich.readthedocs.io/en/latest/)는 터미널 출력에 색깔과 스타일을 입히기 쉽게 도와줍니다. 또한 Rich는 별다른 설정 없이 표, 진행 바, 마크다운, 소스코드 구문 강조, tracebacks 등을 예쁘게 보여줄 수 있습니다. + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Rich에 대한 동영상 설명을 보시려면 [@fishnets88](https://twitter.com/fishnets88)의 [calmcode.io](https://calmcode.io/rich/introduction.html)를 확인 바랍니다. + +[사람들의 Rich에 대한 의견](https://www.willmcgugan.com/blog/pages/post/rich-tweets/)을 확인해보세요. + +## 호환성 + +Rich는 리눅스, OSX, 윈도우에서 동작합니다. 트루 컬러 / 이모지는 새로운 윈도우 터미널에서 동작하지만 구형 터미널에서는 16가지 색으로 제한됩니다. Rich는 파이썬 3.6.3 버전 혹은 그 이후 버전이 필요합니다. + +Rich는 [Jupyter notebooks](https://jupyter.org/)에서 별도의 설정없이 바로 동작합니다. + +## 설치 + +`pip` 또는 좋아하는 PyPI 패키지 매니저로 설치하세요. + +```sh +python -m pip install rich +``` + +아래 명령어를 통해 터미널에서 Rich 출력을 테스트해보세요. + +```sh +python -m rich +``` + +## Rich Print + +간단하게 당신의 어플리케이션에 rich한 출력을 추가하려면, 파이썬 내장 함수와 signature가 같은 [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) 메서드를 import 할 수 있습니다. +따라해보세요: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich는 파이썬 REPL에도 설치할 수 있습니다. 어떤 데이터 구조라도 예쁘게 출력하거나 강조할 수 있습니다. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## 콘솔 사용하기 + +rich 터미널을 더욱 잘 활용하려면, import 한 뒤 [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) 객체를 생성해주세요. + +```python +from rich.console import Console + +console = Console() +``` + +콘솔 객체에는 `print` 메서드가 있는데, 내부적으로 내장 `print` 함수와 유사한 인터페이스를 가지고 있습니다. 아래는 예제입니다: + +```python +console.print("Hello", "World!") +``` + +예상대로 `"Hello World!"`이 터미널에 출력될 것입니다. 내장 `print` 함수와 달리, Rich는 터미널 폭에 맞춰 자동 줄바꿈(word-wrap)을 적용하는 것에 유의하세요. + +출력에 색깔과 스타일을 입히는 방법은 몇가지가 있습니다. `style` 키워드 전달인자를 추가해 전체 출력에 대해 스타일을 변경할 수 있습니다. 예제는 다음과 같습니다: + +```python +console.print("Hello", "World!", style="bold red") +``` + +다음과 같이 출력됩니다: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +텍스트 한 줄을 한 번에 수정하는 것도 좋습니다. 더욱 세세하게 스타일을 변경하기 위해, Rich는 [bbcode](https://en.wikipedia.org/wiki/BBCode)와 구문이 비슷한 별도의 마크업을 렌더링 할 수 있습니다. 예제는 다음과 같습니다. + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Console 객체를 활용해 적은 노력으로 복잡한 출력을 손쉽게 만들 수 있습니다. 자세한 내용은 [Console API](https://rich.readthedocs.io/en/latest/console.html) 문서를 확인해주세요. + +## Rich Inspect + +Rich는 class나 instance, builtin 같은 파이썬 객체의 레포트를 생성하는 [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) 함수를 포함합니다 + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +자세한 내용은 [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) 문서를 확인해주세요. + +# Rich Library + +Rich는 CLI에서 우아하게 출력하거나 코드 디버깅을 돕도록 다양한 빌트인 _렌더링을_ 포함하고 있습니다. + +자세한 내용을 확인하려면 제목을 눌러주세요: + +
+Log + +Console 객체는 `print()`와 인터페이스가 유사한 `log()` 메서드를 가지고 있습니다. `Log()`는 호출이 이루어진 파일과 라인, 현재 시간도 같이 출력합니다. 기본적으로 Rich는 파이썬 구조체와 repr string에 대해 신택스 하이라이팅을 지원합니다. 만약 당신이 collection(예를 들어 dict나 list)을 로깅한다면, Rich는 표현 가능한 공간에 맞춰 예쁘게 출력해줍니다. 이러한 기능들에 대한 예시입니다: + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +위 코드의 실행 결과는 다음과 같습니다: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +`log_locals` 인자를 사용하면 log 메서드가 호출된 곳의 로컬 변수들을 표로 보여준다는 것도 알아두세요. + +로그 메서드는 서버처럼 오랫동안 실행되는 어플리케이션을 터미널로 로깅할때 사용할 수 있지만 디버깅 할 때도 매우 좋습니다. + +
+
+Logging Handler + +또한 내장된 [Handler class](https://rich.readthedocs.io/en/latest/logging.html)를 사용해 파이썬의 로깅 모듈의 출력을 형태를 꾸미거나 색을 입힐 수 있습니다. 다음은 예제입니다: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji(이모지) + +콘솔 출력에 이모지를 넣으려면 두 콜론(:) 사이에 이모지 이름을 넣어주세요. 다음은 예제입니다: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +부디 이 기능을 잘 사용해주세요. + +
+ +
+Tables(표) + +Rich는 유니코드 박스 문자와 함께 [표](https://rich.readthedocs.io/en/latest/tables.html)를 자유롭게 렌더링할 수 있습니다. 가장자리, 스타일, 셀 정렬 등을 정말 다양하게 구성할 수 있습니다. + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +위의 애니메이션은 example 디렉토리의 [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py)로 생성되었습니다. + +더 간단한 표 예제입니다: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +이는 다음과 같이 출력됩니다: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +콘솔 출력은 `print()`나 `log()`와 같은 방식으로 렌더링 된다는 것을 주의하세요. 사실, Rich로 표현할 수 있는 것은 무엇이든 headers / rows (심지어 다른 표들도)에 포함할 수 있습니다. + +`Table` 클래스는 터미널의 폭에 맞춰 필요한 만큼 줄을 내리고 열 길이를 스스로 조절합니다. 위의 표보다 작은 터미널에서 만들어진 표 예시입니다: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Progress Bars(진행 바) + +Rich는 오래 걸리는 작업들을 위해 깜빡임 없는 [진행](https://rich.readthedocs.io/en/latest/progress.html) 바를 여러개 표현할 수 있습니다. + +기본적인 사용을 위해선 아무 sequence나 `track` 함수로 감싸고 결과를 반복해주세요. 다음은 예제입니다: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +여러개의 진행 바를 추가하는 것도 어렵지 않습니다. 아래는 공식문서에서 따온 예시입니다: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +칼럼들은 수정해 원하는 세부정보를 보여줄 수도 있습니다. 기본으로 내장된 칼럼들은 완료 퍼센티지, 파일 크기, 파일 속도, 남은 시간입니다. 다운로드 진행을 보여주는 다른 예제입니다: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +직접 해보시려면, 진행 바와 함께 여러개의 URL들을 동시에 다운로드 받는 예제인 [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py)를 확인해주세요. + +
+ +
+Status(상태) + +진행 상황을 계산하기 어려운 경우, [상태](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) 메서드를 사용할 수 있습니다. 이 메서드는 '스피너' 애니메이션과 메세지를 표시합니다. 애니메이션은 당신이 콘솔을 정상적으로 사용하는 것을 막지 못합니다. 다음은 예제입니다: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +이 예제는 터미널에 아래와 같이 출력합니다. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +스피너 애니메이션은 [cli-spinners](https://www.npmjs.com/package/cli-spinners)에서 빌려왔습니다. `spinner` 파라미터를 선택해서 특정 스피너를 선택할 수도 있습니다. 어떤 값을 선택할 수 있는지는 아래 명령어를 통해 확인할 수 있습니다: + +``` +python -m rich.spinner +``` + +위의 명령어를 입력하면 아래와 같은 출력됩니다: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Tree(트리) + +Rich는 가이드라인과 함께 [트리](https://rich.readthedocs.io/en/latest/tree.html)를 표현할 수 있습니다. 파일 구조나, 계층적 데이터를 보여주는데 적합합니다. + +트리의 라벨은 간단한 텍스트나 Rich로 표현할 수 있는 것은 모든지 가능합니다. 아래의 예시를 따라해보세요: + +``` +python -m rich.tree +``` + +이는 아래와 같이 출력됩니다: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +리눅스의 `tree` 명령어처럼 아무 디렉토리의 트리를 보여주는 스크립트 예제를 보시려면 [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py)를 확인해주세요. + +
+ +
+Columns(칼럼) + +Rich는 내용을 같거나 적절한 폭으로 깔끔하게 [칼럼](https://rich.readthedocs.io/en/latest/columns.html)을 표현할 수 있습니다. 아래 예제는 종렬로 디렉토리 리스트를 보여주는 (MacOS / Linux)의 `ls` 명령어의 기본적인 클론입니다: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +아래 스크린샷은 API에서 뽑은 데이터를 종렬로 표현하는 [칼럼 예제](https://github.com/willmcgugan/rich/blob/master/examples/columns.py)의 출력 결과입니다: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown(마크다운) + +Rich는 [마크다운](https://rich.readthedocs.io/en/latest/markdown.html)을 표현하거나 형태를 터미널에 맞추어 적절히 변환할 수 있습니다. + +마크다운을 표현하기 위해서는 `Markdown` 클래스를 import하고 마크다운을 포함하고 있는 문자열을 통해 객체를 생성해주세요. 다음은 예제입니다: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +위 코드는 아래와 같은 출력 결과를 만들 것입니다: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Syntax Highlighting(구문 강조) + +Rich는 [구문 강조](https://rich.readthedocs.io/en/latest/syntax.html) 기능을 수행하기 위해 [pygments](https://pygments.org/) 라이브러리를 사용합니다. 사용법은 마크다운과 유사합니다. `Syntax` 객체를 생성하고 콘솔에 출력하세요. 예제는 다음과 같습니다: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +위 코드는 아래와 같은 출력 결과를 만들 것입니다: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Tracebacks + +Rich는 [예쁜 tracebacks](https://rich.readthedocs.io/en/latest/traceback.html)을 표현할 수 있습니다. 이것은 읽기도 더 쉽고 일반적인 파이썬 tracebacks 보다 더 많은 코드를 보여줍니다. uncaught exceptions가 Rich로 출력되도록 Rich를 기본 Traceback 핸들러로 설정할 수도 있습니다. + +OSX에서는 이렇게 출력됩니다 (리눅스도 유사함): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +모든 Rich로 표현 가능한 것들은 [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html)를 사용합니다. 이것을 사용해서 자신의 Rich 컨텐츠를 렌더링할 수도 있습니다. + +# 엔터프라이즈를 위한 Rich + +Tidelift 구독의 일환으로 가능합니다. + +Rich를 포함한 수천가지 다른 패키지들의 메인테이너들은 당신이 앱을 만들기 위해 사용하는 오픈소스 패키지의 상업적인 지원과 유지보수를 위해 Tidelift와 함께 일하고 있습니다. 당신이 사용하는 패키지의 메인테이너에게 비용을 지불하는 대신 시간을 절약하고, 리스크를 줄이고, 코드의 품질을 향상시킬 수 있습니다. [더 자세한 정보는 여기를 참고바랍니다.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Rich를 사용하는 프로젝트들 + +Rich를 사용하는 몇가지 프로젝트들입니다: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + 신경해부학 데이터의 3차원 시각화를 위한 파이썬 패키지 +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + 자동 암호해독 툴 +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + 파이썬을 위한 고성능, 높은 정밀도의 CPU / Memory 프로파일러 +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + 당신의 커맨드라인에서 GitHub 트렌딩 프로젝트들을 검색해보세요 +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + 이 툴은 여러 공통적이고 취약한 컴포넨트들(openssl, libpng, libxml2, expat 과 몇가지 더)을 스캔해, 이미 알려진 취약점을 가진 일반 라이브러리가 당신의 시스템에 있는지 알려줍니다. +- [nf-core/tools](https://github.com/nf-core/tools) + nf-core 커뮤니티를 위한 도우미 도구를 포함한 파이썬 패키지. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + 개선된 디버깅을 위한 pdb + Rich 라이브러리 +- [plant99/felicette](https://github.com/plant99/felicette) + 더미 위성 이미지 +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Selenium & pytest로 10배 더 빠르게 자동화 & 테스트하세요. 배터리도 포함되어 있습니다. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + 자동으로 자막과 영상의 싱크를 맞추세요. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + 모든 탐지된 것에 실시간으로 2D 오브젝트 트래킹을 추가하는 경량화된 파이썬 라이브러리. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) + Ansible-lint가 playbooks를 확인해 잠재적으로 개선될 수 있는 practices나 동작을 확인합니다. +- [ansible-community/molecule](https://github.com/ansible-community/molecule) + Ansible Molecule의 테스트 프레임워크 +- +[Many more](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/README.md b/README.md index 21ca742142..db2719003a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,26 @@ -# Rich +[![Supported Python Versions](https://img.shields.io/pypi/pyversions/rich/10.11.0)](https://pypi.org/project/rich/) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) -[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) -[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![codecov](https://img.shields.io/codecov/c/github/Textualize/rich?label=codecov&logo=codecov)](https://codecov.io/gh/willmcgugan/rich) [![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) [![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) -[中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) • [lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) Rich is a Python library for _rich_ text and beautiful formatting in the terminal. @@ -19,19 +34,25 @@ See what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/p ## Compatibility -Rich works with Linux, OSX, and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 8 colors. Rich requires Python 3.6.1 or later. +Rich works with Linux, OSX, and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.6.3 or later. Rich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required. ## Installing -Install with `pip` or your favorite PyPi package manager. +Install with `pip` or your favorite PyPI package manager. +```sh +python -m pip install rich ``` -pip install rich + +Run the following to test Rich output on your terminal: + +```sh +python -m rich ``` -## Rich print function +## Rich Print To effortlessly add rich output to your application, you can import the [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) method, which has the same signature as the builtin Python function. Try this: @@ -54,15 +75,6 @@ Rich can be installed in the Python REPL, so that any data structures will be pr ![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) -## Rich Inspect - -Rich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin. - -```python ->>> from rich import inspect ->>> inspect(str, methods=True) -``` - ## Using the Console For more control over rich terminal content, import and construct a [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object. @@ -99,7 +111,30 @@ console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i ![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) -### Console logging +You can use a Console object to generate sophisticated output with minimal effort. See the [Console API](https://rich.readthedocs.io/en/latest/console.html) docs for details. + +## Rich Inspect + +Rich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +See the [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) for details. + +# Rich Library + +Rich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code. + +Click the following headings for details: + +
+Log The Console object has a `log()` method which has a similar interface to `print()`, but also renders a column for the current time and the file and line which made the call. By default Rich will do syntax highlighting for Python structures and for repr strings. If you log a collection (i.e. a dict or a list) Rich will pretty print it so that it fits in the available space. Here's an example of some of these features. @@ -134,13 +169,18 @@ Note the `log_locals` argument, which outputs a table containing the local varia The log method could be used for logging to the terminal for long running applications such as servers, but is also a very nice debugging aid. -### Logging Handler +
+
+Logging Handler You can also use the builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) to format and colorize output from Python's logging module. Here's an example of the output: ![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) -## Emoji +
+ +
+Emoji To insert an emoji in to console output place the name between two colons. Here's an example: @@ -151,7 +191,10 @@ To insert an emoji in to console output place the name between two colons. Here' Please use this feature wisely. -## Tables +
+ +
+Tables Rich can render flexible [tables](https://rich.readthedocs.io/en/latest/tables.html) with unicode box characters. There is a large variety of formatting options for borders, styles, cell alignment etc. @@ -173,7 +216,7 @@ table.add_column("Title") table.add_column("Production Budget", justify="right") table.add_column("Box Office", justify="right") table.add_row( - "Dev 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" ) table.add_row( "May 25, 2018", @@ -201,7 +244,10 @@ The `Table` class is smart enough to resize columns to fit the available width o ![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) -## Progress Bars +
+ +
+Progress Bars Rich can render multiple flicker-free [progress](https://rich.readthedocs.io/en/latest/progress.html) bars to track long-running tasks. @@ -224,12 +270,70 @@ The columns may be configured to show any details you want. Built-in columns inc To try this out yourself, see [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) which can download multiple URLs simultaneously while displaying progress. -## Columns +
+ +
+Status + +For situations where it is hard to calculate progress, you can use the [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) method which will display a 'spinner' animation and message. The animation won't prevent you from using the console as normal. Here's an example: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +This generates the following output in the terminal. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +The spinner animations were borrowed from [cli-spinners](https://www.npmjs.com/package/cli-spinners). You can select a spinner by specifying the `spinner` parameter. Run the following command to see the available values: + +``` +python -m rich.spinner +``` + +The above command generates the following output in the terminal: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Tree + +Rich can render a [tree](https://rich.readthedocs.io/en/latest/tree.html) with guide lines. A tree is ideal for displaying a file structure, or any other hierarchical data. + +The labels of the tree can be simple text or anything else Rich can render. Run the following for a demonstration: + +``` +python -m rich.tree +``` + +This generates the following output: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +See the [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) example for a script that displays a tree view of any directory, similar to the linux `tree` command. + +
+ +
+Columns Rich can render content in neat [columns](https://rich.readthedocs.io/en/latest/columns.html) with equal or optimal width. Here's a very basic clone of the (MacOS / Linux) `ls` command which displays a directory listing in columns: ```python import os +import sys from rich import print from rich.columns import Columns @@ -242,7 +346,10 @@ The following screenshot is the output from the [columns example](https://github ![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) -## Markdown +
+ +
+Markdown Rich can render [markdown](https://rich.readthedocs.io/en/latest/markdown.html) and does a reasonable job of translating the formatting to the terminal. @@ -262,7 +369,10 @@ This will produce output something like the following: ![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) -## Syntax Highlighting +
+ +
+Syntax Highlighting Rich uses the [pygments](https://pygments.org/) library to implement [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). Usage is similar to rendering markdown; construct a `Syntax` object and print it to the console. Here's an example: @@ -294,7 +404,10 @@ This will produce the following output: ![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) -## Tracebacks +
+ +
+Tracebacks Rich can render [beautiful tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) which are easier to read and show more code than standard Python tracebacks. You can set Rich as the default traceback handler so all uncaught exceptions will be rendered by Rich. @@ -302,32 +415,28 @@ Here's what it looks like on OSX (similar on Linux): ![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) -## Project using Rich - -Here are a few projects using Rich: - -- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) - a python package for the visualization of three dimensional neuro-anatomical data -- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) - Automated decryption tool -- [emeryberger/scalene](https://github.com/emeryberger/scalene) - a high-performance, high-precision CPU and memory profiler for Python -- [hedythedev/StarCli](https://github.com/hedythedev/starcli) - Browse GitHub trending projects from your command line -- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) - This tool scans for a number of common, vulnerable components (openssl, libpng, libxml2, expat and a few others) to let you know if your system includes common libraries with known vulnerabilities. -- [nf-core/tools](https://github.com/nf-core/tools) - Python package with helper tools for the nf-core community. -- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) - pdb + Rich library for enhanced debugging -- [plant99/felicette](https://github.com/plant99/felicette) - Satellite imagery for dummies. -- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) - Automate & test 10x faster with Selenium & pytest. Batteries included. -- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) - Automagically synchronize subtitles with video. -- [tryolabs/norfair](https://github.com/tryolabs/norfair) - Lightweight Python library for adding real-time 2D object tracking to any detector. -- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint checks playbooks for practices and behaviour that could potentially be improved -- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule testing framework -- +[Many more](https://github.com/willmcgugan/rich/network/dependents)! +
+ +All Rich renderables make use of the [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), which you can also use to implement your own Rich content. + +# Rich CLI + + +See also [Rich CLI](https://github.com/textualize/rich-cli) for a command line application powered by Rich. Syntax highlight code, render markdown, display CSVs in tables, and more, directly from the command prompt. + + +![Rich CLI](https://raw.githubusercontent.com/Textualize/rich-cli/main/imgs/rich-cli-splash.jpg) + +# Textual + +See also Rich's sister project, [Textual](https://github.com/Textualize/textual), which you can use to build sophisticated User Interfaces in the terminal. + +![Textual screenshot](https://raw.githubusercontent.com/Textualize/textual/main/imgs/textual.png) + +# Projects using Rich + +For some examples of projects using Rich, see the [Rich Gallery](https://www.textualize.io/rich/gallery) on [Textualize.io](https://www.textualize.io). + +Would you like to add your own project to the gallery? You can! Follow [these instructions](https://www.textualize.io/gallery-instructions). + + diff --git a/README.pt-br.md b/README.pt-br.md new file mode 100644 index 0000000000..40c9168dad --- /dev/null +++ b/README.pt-br.md @@ -0,0 +1,457 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich é uma biblioteca Python para _rich_ text e formatação de estilos no terminal. + +A [API do Rich](https://rich.readthedocs.io/en/latest/) permite adicionar cores e estilos no output do terminal de forma fácil. Rich também permite formataçao de tabelas, barra de progresso, markdown, highlight de sintaxe de código fonte, rastreio de erros (traceback) e muito mais. + +![Funcões](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Para mais detalhes, veja um vídeo de introdução so Rich em [calmcode.io](https://calmcode.io/rich/introduction.html) por [@fishnets88](https://twitter.com/fishnets88). + +Veja aqui [o que estão falando sobre o Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). + +## Compatibilidade + +Rich funciona no Linux, OSX e Windows. True color / emoji funciona no novo Terminal do Windows, o terminal classico é limitado a 16 cores. Rich requer Python 3.6.3 ou superior. + +Rich funciona com [Jupyter notebooks](https://jupyter.org/) sem a necessidade de configurações adicionais. + +## Instalação + +Instale usando `pip` ou seu gerenciador de pacotes PyPI favorito. + +```sh +python -m pip install rich +``` + +Execute o seguinte comando para testar o output do Rich no seu terminal: + +```sh +python -m rich +``` + +## Print do Rich + +Para adicionar as as funções de formatação do rich na sua aplicação de forma fácil, simplesmente importe o metodo [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) que tem a mesma assinatura da função nativa do Python. Por exemplo: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## REPL do Rich + +O Rich pode ser instalado no REPL do Python fazendo com que qualquer estrutura de dados seja exibida formatada e com highlights. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Usando o Console + +Para ter mais controle sobre a formatação do conteudo no terminal, importe e instancie um objeto do [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console). + +```python +from rich.console import Console + +console = Console() +``` + +Objetos do tipo Console tem um metodo `print` que tem a interface intencionalmente similar à função `print` nativa. Veja a seguir um exeplo de uso: + +```python +console.print("Hello", "World!") +``` + +Como esperado, este comando vai imprimir `"Hello World!"` no terminal. Porém, observe que, diferente da função `print` nativa, o Rich vai quebrar a linha entre palavras (word-wrap) no seu texto para caber na largura do terminal. + +Existem algumas formas de adicionar cores e estilos nos outputs. É possivel aplicar um estilo para todo output adicionando o argumento nomeado `style`. Por exemplo: + +```python +console.print("Hello", "World!", style="bold red") +``` + +O resultado vai ser algo como: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +Isso funciona bem para formatar cada linha do texto individualmente. Para maior controle sobre a formatação, o Rich renderiza um markup especial com uma sintaxe similar ao [bbcode](https://en.wikipedia.org/wiki/BBCode). Veja o exemplo a seguir: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Voce pode usar o objeto do Console para gerar facilmente uma saída para o terminal sofisticada. Veja a documentação da [API do Console](https://rich.readthedocs.io/en/latest/console.html) para mais detalhes. + +## Inspect do Rich + +O Rich tem uma função [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) que gera um relatório de qualquer objeto no Python, como classes, instâncias ou funções nativas. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Confira a [documentação do inspect](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) para mais detalhes. + +# A biblioteca Rich + +O Rich possui vários _renderizáveis_ nativos que podem ser usados para criar outputs elegantes no seu CLI e ajudar a debugar o código. + +Clique nos itens a seguir para expandir os detalhes: + +
+Log + +O objeto Console tem um método `log()` com uma interface similar ao `print()` mas que também imprime uma coluna com a hora atual, nome do arquivo e linha onde foi executado. Por padrão, o Rich vai fazer highlight de sintaxe para extruturas do Python e para repr strings. Se você usar o `log()` para imprimir uma _collection_ (por exemplo um dicionário ou uma lista), o Rich vai imprimir formatado de uma forma que caiba no espaço disponível. Veja a seguir alguns exemplos dessas funções: + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +O código acima vai produzir algo parecido com: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Note o argumento `log_locals` que imprime uma tabela com as variáveis locais no contexto em que o método `log()` foi chamado. + +O método `log()` pode ser usado para logar no terminal em aplicações de processos longos como servidores, mas é também uma ferramenta ótima para debugar. + +
+
+Logging Handler + +Você também pode usar a [classe Handler](https://rich.readthedocs.io/en/latest/logging.html) nativa para formatar e colorir o output do módulo `logging` do Python. Veja aqui um exemplo do output: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji + +Para imprimir um emoji no console, coloque o nome do emoji entre dois ":" (dois pontos). Por exemplo: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Por favor use esse recurso com sabedoria. + +
+ +
+Tabelas + +O Rich pode imprimir [tables](https://rich.readthedocs.io/en/latest/tables.html) flexíveis usando caracteres unicode como bordas. Existem várias opções de formatação de bordas, estilos, alinhamento das celulas, etc. + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +A animação acima foi gerada com o arquivo [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) da pasta de exemplos. + +Veja um exemplo mais simple: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Que gera o seguinte resultado: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Observe que o markup é renderizado da mesma for que em `print()` e `log()`. De fato, tudo que é renderizável pelo Rich pode ser incluído nos cabeçalhos ou linhas (até mesmo outras tabelas). + +A classe `Table` é inteligente o suficiente para ajustar o tamanho das colunas para caber na largura do terminal, quebrando o texto em novas linhas quando necessário. Veja a seguir o mesmo exemplo, só que desta vez com um terminal menor do que o tamanho original da tabela: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Barra de Progresso + +O Rich consegue renderizar de forma eficiente multiplas barras de [progresso](https://rich.readthedocs.io/en/latest/progress.html) que podem ser usadas para rastrear o estado de processos longos. + +Uma forma simples de usar é passando o iterável para a função `track` e iterar normalmente sobre o retorno. Veja o exemplo a seguir: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Adicionar multiplas barras de progresso também é simples. Veja outro exemplo que existe na documentação: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +As colunas podem ser configuradas pra mostrar qualquer detalho necessário. As colunas nativas incluem a porcentagem completa, tamanho de arquivo, velocidade do arquivo e tempo restante. O exemplo a seguir mostra o progresso de um download: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +Para testar isso no seu terminal, use o arquivo [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) para fazer o download de multiplas URLs simultaneamente, exibindo o progresso de cada download. + +
+ +
+Status + +Em casos em que é dificil de calcular o progresso da tarefa, você pode usar o método [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) que exibe uma animação de um "spinner" e a mensagem. A animação não impede em nada o uso do `console`. Veja o exemplo a seguir: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Este código resultará no seguinte output no terminal: + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +As animações do "spinner" foram emprestadas do [cli-spinners](https://www.npmjs.com/package/cli-spinners). É possível escolher um estilo de "spinner" usando o parametro `spinner`. Execute o comando a seguir para ver todos os tipos de "spinner" disponíveis. + +``` +python -m rich.spinner +``` + +O comando acima deve exibir o seguinte no seu terminal: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Árvore + +O Rich pode renderizar [árvores](https://rich.readthedocs.io/en/latest/tree.html) com linhas de identação. Uma árvore é a forma ideal de exibir uma extrutura de arquivos ou qualquer outra apresentação hierárquica de dados. + +Os titulos dos itens da árvore podem ser textos simples ou qualquer coisa que o Rich pode renderizar. Execute o comando a seguir para uma demonstração: + +``` +python -m rich.tree +``` + +Isso gera o seguinte resultado: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Veja o exemplo em [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) de um código que gera uma árvore de exibição de um dicionário, semelhante ao comando `tree` do linux. + +
+ +
+Colunas + +O Rich pode renderizar conteúdos em [colunas](https://rich.readthedocs.io/en/latest/columns.html) bem formatadas com tamanhos iguais ou otimizados. O exemplo a seguir é uma cópia básica do comando `ls` (presente no MacOS / Linux) que mostra o conteúdo de uma pasta organizado em colunas: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +O screenshot a seguir é do resultado do [exemplo de colunas](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) formatando em colunas os dados extraidos de uma API: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +O Rich pode renderizar [markdown](https://rich.readthedocs.io/en/latest/markdown.html) e faz um bom trabalho de conversão do formato para o terminal. + +Para renderizar markdowm, importe a classe `Markdown` e instancie com a string que contem o código markdown. Depois, imprima o objeto no console. Por exemplo: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Isso produzirá um resultado como: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Highlight de Sintaxe + +O Rich usa a biblioteca [pygments](https://pygments.org/) para implementar o [highlight de sintaxe](https://rich.readthedocs.io/en/latest/syntax.html). O uso é similar à renderização de markdown, instancie um objeto da classe `Syntax` imprima no console. Por exemplo: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Este código gerará o seguinte resultado: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Rastreio de Erros (tracebacks) + +O Rich renderiza [tracebacks formatados](https://rich.readthedocs.io/en/latest/traceback.html) que são fáceis de ler e mostra mais código do que os tracebacks padrão do Python. É possivel configurar o Rich como o gerenciador padrão de tracebacks para que todas as excessões inesperadas sejam renderizadas pelo Rich. + +Veja o resultado disso no OSX (resultados semelhantes no Linux): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Todos os renderizaveis do Rich usam o [Protocolo do Console](https://rich.readthedocs.io/en/latest/protocol.html), que você pode usar para implementar o seu próprio conteúdo Rich. + +# Rich para empresas + +Disponível como parte da assinatura Tidelift. + +Os mantenedores do Rich e milhares de outros pacotes estão trabalhando com o Tidelift para disponibilizar suporte comercial e manutenção de projetos de código aberto usados nas suas aplicações. Economise tempo, reduza riscos e melhore a saúde do código enquanto paga os mantenedores dos pacotes exatos que você usa. [Mais detalhes.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Projetos usando Rich + +Aqui estão alguns projetos que usam o Rich: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + a python package for the visualization of three dimensional neuro-anatomical data + um pacote python para visualisação tridimensional de dados neuro-atômicos. +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + ferramenta de descriptografia autoatizada. +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + um analisador de CPU e memória de alta performance e alta precisão para Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Explore projetos de destaque no GitHub pela linha de comando do terminal +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + Essa ferramenta verifica a vulnerabilidade de diversos componentes populares (openssl, libpng, libxml2, expat e outros) presentes no seu sistema e alerta para possíveis vulnerabilidades conhecidas. +- [nf-core/tools](https://github.com/nf-core/tools) + pacote Python com ferramentas auxiliares par a comunidade nf-core. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Rich para auxiliar no debug +- [plant99/felicette](https://github.com/plant99/felicette) + Imagem de satélites para iniciantes. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Automatize & teste 10x mais rápido com Selenium & pytest. Baterias inclusas. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Automagicamente sincronize legendas com vídeos. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Biblioteca Python para adicionar rastreio em tempo real de objetos 2D em qualquer detector. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint verifica boas práticas e comportamento que podem ser melhorados. +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Framework de test para Ansible Molecule +- +[Muitos outros](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/README.ru.md b/README.ru.md new file mode 100644 index 0000000000..1666f8d914 --- /dev/null +++ b/README.ru.md @@ -0,0 +1,458 @@ +[![Supported Python Versions](https://img.shields.io/pypi/pyversions/rich/10.11.0)](https://pypi.org/project/rich/) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) + +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich это Python библиотека позволяющая отображать _красивый_ текст и форматировать терминал. + +[Rich API](https://rich.readthedocs.io/en/latest/) упрощает добавление цветов и стилей к выводу терминала. Rich также позволяет отображать красивые таблицы, прогресс бары, markdown, код с отображением синтаксиса, ошибки, и т.д. — прямо после установки. + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Для видео инструкции смотрите [calmcode.io](https://calmcode.io/rich/introduction.html) от [@fishnets88](https://twitter.com/fishnets88). + +Посмотрите [что люди думают о Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). + +## Cовместимость + +Rich работает с Linux, OSX, и Windows. True color / эмоджи работают с новым терминалом Windows, классический терминал лимитирован 16 цветами. Rich требует Python 3.6.3 или более новый. + +Rich работает с [Jupyter notebooks](https://jupyter.org/) без дополнительной конфигурации. + +## Установка + +Установите с `pip` или вашим любимым PyPI менеджером пакетов. + +```sh +python -m pip install rich +``` + +Запустите следующею команду чтобы проверить Rich вывод в вашем терминале: + +```sh +python -m rich +``` + +## Rich Print + +Простейший способ получить красивый вывод это импортировать метод [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start), он принимает такие же аргументы что и стандартный метод print. Попробуйте: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich может быть установлен в Python REPL, так, все данные будут выведены через Rich. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Использование класса Console + +Для большего контроля над терминалом Rich, импортируйте и инициализируйте класс [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console). + +```python +from rich.console import Console + +console = Console() +``` + +У класса console есть метод `print` который имеет идентичный функционал к встроеной функции `print`. Вот пример использования: + +```python +console.print("Hello", "World!") +``` + +Как вы могли подумать, этот выведет `"Hello World!"` в терминал. Запомните что, в отличии от встроеной функции `print`, Rich увеличит ваш текст так, чтобы он распространялся на всю ширину терминала. + +Есть несколько способов добавить цвет и стиль к вашему выводу. Вы можете выбрать стиль для всего вывода добавив аргумент `style`. Вот пример: + +```python +console.print("Hello", "World!", style="bold red") +``` + +Вывод будет выглядить примерно так: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +Этого достаточно чтобы стилизовать 1 строку. Для более детального стилизования, Rich использует специальную разметку похожую по синтаксису на [bbcode](https://en.wikipedia.org/wiki/BBCode). Вот пример: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Вы можете использовать класс Console чтобы генерировать утонченный вывод с минимальными усилиями. Смотрите [документацию Console API](https://rich.readthedocs.io/en/latest/console.html) для детального объяснения. + +## Rich Inspect + +В Rich есть функция [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) которая может украсить любой Python объект, например класс, переменная, или функция. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +Смотрите [документацию inspect](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) для детального объяснения. + +# Библиотека Rich + +Rich содержит несколько встроенных _визуализаций_ которые вы можете использовать чтобы сделать элегантный вывод в важем CLI или помочь в дебаггинге кода. + +Вот несколько вещей которые может делать Rich (нажмите чтобы узнать больше): + +
+Лог + +В классе console есть метод `log()` который похож на `print()`, но также изображает столбец для текущего времени, файла и линии кода которая вызвала метод. По умолчанию Rich будет подсвечивать синтаксис для структур Python и для строк repr. Если вы передадите в метод коллекцию (т.е. dict или list) Rich выведет её так, чтобы она помещалась в доступном месте. Вот пример использования этого метода. + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +Код выше выведет это: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Запомните аргумент `log_locals`, он выводит таблицу имеющую локальные переменные функции в которой метод был вызван. + +Метод может быть использован для вывода данных в терминал в длинно-работающих программ, таких как сервера, но он также может помочь в дебаггинге. + +
+
+Обработчик Логов + +Вы также можете использовать встроенный [класс Handler](https://rich.readthedocs.io/en/latest/logging.html) чтобы форматировать и раскрашивать вывод из встроенной библиотеки logging. Вот пример вывода: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Эмоджи + +Чтобы вставить эмоджи в вывод консоли поместите название между двумя двоеточиями. Вот пример: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Пожалуйста, используйте это мудро. + +
+ +
+Таблицы + +Rich может отображать гибкие [таблицы](https://rich.readthedocs.io/en/latest/tables.html) с символами unicode. Есть большое количество форматов границ, стилей, выравниваний ячеек и т.п. + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +Эта анимация была сгенерирована с помощью [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) в директории примеров. + +Вот пример более простой таблицы: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Этот пример выводит: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Запомните что разметка консоли отображается таким же способом что и `print()` и `log()`. На самом деле, всё, что может отобразить Rich может быть в заголовках или рядах (даже другие таблицы). + +Класс `Table` достаточно умный чтобы менять размер столбцов, так, чтобы они заполняли доступную ширину терминала, обёртывая текст как нужно. Вот тот же самый пример с терминалом меньше таблицы: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Прогресс Бары + +Rich может отображать несколько плавных [прогресс](https://rich.readthedocs.io/en/latest/progress.html) баров чтобы отслеживать долго-идущие задания. + +Для базового использования, оберните любую последовательность в функции `track` и переберите результат. Вот пример: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Отслеживать больше чем 1 задание не сложнее. Вот пример взятый из документации: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +Столбцы могут быть настроены чтобы показывать любые детали. Стандартные столбцы содержат проценты исполнения, размер файлы, скорость файла, и оставшееся время. Вот ещё пример показывающий загрузку в прогрессе: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +Чтобы попробовать самому, скачайте [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) который может скачать несколько URL одновременно пока отображая прогресс. + +
+ +
+Статус + +Для ситуаций где сложно высчитать прогресс, вы можете использовать метод [статус](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) который будет отображать крутящуюся анимацию и сообщение. Анимация не перекроет вам доступ к консоли. Вот пример: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Это генерирует вот такой вывод в консоль. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +Крутящиеся анимации были взяты из [cli-spinners](https://www.npmjs.com/package/cli-spinners). Вы можете выбрать одну из них указав параметр `spinner`. Запустите следующую команду чтобы узнать доступные анимации: + +``` +python -m rich.spinner +``` + +Эта команда выдаёт вот такой вывод в терминал: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Дерево + +Rich может отобразить [дерево](https://rich.readthedocs.io/en/latest/tree.html) с указаниями. Дерево идеально подходит для отображения структуры файлов или любых других иерархических данных. + +Ярлыки дерева могут быть простым текстом или любой другой вещью Rich может отобразить. Запустите следующую команду для демонстрации: + +``` +python -m rich.tree +``` + +Это генерирует следующий вывод: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Смотрите пример [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) для скрипта который отображает дерево любой директории, похоже на команду linux `tree`. + +
+ +
+Столбцы + +Rich может отображать контент в [столбцах](https://rich.readthedocs.io/en/latest/columns.html) с равной или оптимальной шириной. Вот очень простой пример клона команды `ls` (MacOS / Linux) который отображает a файлы директории в столбцах: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +Следующий скриншот это вывод из [примера столбцов](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) который изображает данные взятые из API в столбцах: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich может отображать [markdown](https://rich.readthedocs.io/en/latest/markdown.html) и делает неплохую работу в форматировании под терминал. + +Чтобы отобразить markdown импортируйте класс `Markdown` и инициализируйте его с помощью строки содержащей код markdown. После чего выведите его в консоль. Вот пример: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Это выведет что-то похожее на это: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Подсвечивание Синтаксиса + +Rich использует библиотеку [pygments](https://pygments.org/) чтобы имплементировать [подсвечивание синтаксиса](https://rich.readthedocs.io/en/latest/syntax.html). Использование похоже на отображение markdown; инициализируйте класс `Syntax` и выводите его в консоль. Вот пример: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Это выведет что-то похожее на это: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Ошибки + +Rich может отображать [красивые ошибки](https://rich.readthedocs.io/en/latest/traceback.html) которые проще читать и показывают больше кода чем стандартные ошибки Python. Вы можете установить Rich как стандартный обработчик ошибок чтобы все непойманные ошибки отображал Rich. + +Вот как это выглядит на OSX (похоже на Linux): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Все визуализации Rich используют [протокол Console](https://rich.readthedocs.io/en/latest/protocol.html), который также позволяет вам добавлять свой Rich контент. + +# Rich для предприятий + +Rich доступен как часть подписки Tidelift. + +Поддержатели проекта Rich и тысячи других работают над подпиской Tidelift чтобы предоставить коммерческую поддержку и поддержание для проектов с открытым кодом вы используете чтобы построить своё приложение. Сохраните время, избавьтесь от риска, и улучшите состояние кода, пока вы платите поддержателям проектов вы используете. [Узнайте больше.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Проекты использующие Rich + +Вот пару проектов использующих Rich: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + библиотека Python для визуализации нейроанатомических данных в 3 измерениях +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + автоматизированная утилита для расшифровки +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + Высокая производительность, высокая точность CPU и профилировщик памяти для Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Просматривайте трендовые проекты GitHub прямо из вашего терминала +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + Эта утилита сканирует известные уязвимости (openssl, libpng, libxml2, expat and a few others) чтобы уведомить вас если ваша система использует библиотеки с известными уязвимостями. +- [nf-core/tools](https://github.com/nf-core/tools) + Библиотека Python с полезными инструментами для сообщества nf-core. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Rich библиотека для улучшенного дебаггинга +- [plant99/felicette](https://github.com/plant99/felicette) + Изображения со спутников для чайников. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Автоматизируйте и тестируйте в 10 раз быстрее с Selenium и pytest. Батарейки включены. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Автоматически синхронизируйте субтитры с видео. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Простая библиотека Python для добавления 2D отслеживания к любому детектеру в реальном времени. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint проверяет пьесы для практик и поведений которые могут быть исправлены +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule тестинг фреймворк +- +[Ещё больше](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/README.sv.md b/README.sv.md new file mode 100644 index 0000000000..4d2cf9828f --- /dev/null +++ b/README.sv.md @@ -0,0 +1,454 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich är ett Python bibliotek för _rich_ text och vacker formattering i terminalen. + +[Rich API](https://rich.readthedocs.io/en/latest/) gör det enkelt att lägga till färg och stil till terminal utmatning. Rich kan också framställa fina tabeller, framstegsfält, märkspråk, syntaxmarkerad källkod, tillbaka-spårning, och mera - redo att använda. + +![Funktioner](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +För en video demonstration av Rich kolla [calmcode.io](https://calmcode.io/rich/introduction.html) av [@fishnets88](https://twitter.com/fishnets88). + +Se vad [folk pratar om Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). + +## Kompatibilitet + +Rich funkar med Linux, OSX, och Windows. Sann färg / emoji funkar med nya Windows Terminalen, klassiska terminal är begränsad till 8 färger. Rich kräver Python 3.6.3 eller senare. + +Rich funkar med [Jupyter notebooks](https://jupyter.org/) utan någon ytterligare konfiguration behövd. + +## Installering + +Installera med `pip` eller din favorita PyPI packet hanterare. + +```sh +python -m pip install rich +``` + +Kör följade följande för att testa Rich utmatning i din terminal: + +```sh +python -m rich +``` + +## Rich utskrivningsfunktion + +För att enkelt lägga till rich utmatning i din applikation, kan du importera [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) metoden, vilket har den samma signatur som den inbyggda Python funktionen. Testa detta: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich kan installeras i Python REPL, så att varje datastruktur kommer att skrivas ut fint och markeras. + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Användning av konsolen + +För mer kontroll över rich terminal innehållsutmatning, importera och konstruera ett [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) objekt. + +```python +from rich.console import Console + +console = Console() +``` + +`Console` objektet har en `print` metod vilket har ett avsiktligt liknande gränssnitt till den inbyggda `print` funktionen. Här är ett exempel av användningen: + +```python +console.print("Hello", "World!") +``` + +Som du möjligtvis anar, detta kommer skriva ut `"Hello World!"` till terminalen. Notera att till skillnad från den inbyggda `print` funktionen, Rich kommer att radbryta din text så att den passar inom terminalbredden. + +Det finns ett par sätt att lägga till färg och stil till din utmatning. Du kan sätta en stil för hela utmatningen genom att addera ett `style` nyckelord argument. Här är ett exempel: + +```python +console.print("Hello", "World!", style="bold red") +``` + +Utmatningen kommer bli något liknande: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +Det är bra för att ge stil till en textrad åt gången. För mer finkornad stilisering, Rich framställer en speciell märkspråk vilket liknar [bbcode](https://en.wikipedia.org/wiki/BBCode) i syntax. Här är ett exempel: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Konsol märkspråk](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +Du kan använda ett `Console` objekt för att generera sofistikerad utmatning med minimal ansträngning. Se [Console API](https://rich.readthedocs.io/en/latest/console.html) dokument för detaljer. + +## Rich Inspektera + +Rich har en [inspektionsfunktion](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) som kan producera en rapport om vilket Python objekt som helst, till exempel klass, instans, eller inbyggt. + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +See [inspektionsdokumentationen](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) för detaljer. + +# Rich Library + +Rich innehåller ett antal av inbyggda _renderables_ som du kan använda för att skapa elegant utmatning i din kommandotolk och hjälpa dig felsöka din kod. + +Klicka på följande rubriker för detaljer: + +
+Logga + +`Console` objektet har en `log()` metod vilket har liknande gränssnitt som `print()`, men framställer även en kolumn för den nuvarande tid och fil samt rad vilket gjorde anroppet. Som standard kommer Rich att markera syntax för Python strukturer och för repr strängar. Ifall du loggar en samling (det vill säga en ordbok eller en lista) kommer Rich att finskriva ut det så att det passar i det tillgängliga utrymme. Här är ett exempel av dessa funktioner. + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +Det ovanstående har följande utmatning: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +Notera `log_locals` argumentet, vilket utmatar en tabell innehållandes de lokala variablerna varifrån log metoden kallades från. + +Log metoden kan användas för att logga till terminal för långkörande applikationer så som servrar, men är också en väldigt bra felsökningsverktyg. + +
+
+Loggningshanterare + +Du kan också använda den inbyggda [Handler klassen](https://rich.readthedocs.io/en/latest/logging.html) för att formatera och färglägga utmatningen från Pythons loggningsmodul. Här är ett exempel av utmatningen: + +![Loggning](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji + +För att infoga en emoji till konsolutmatningen placera namnet mellan två kolon. Här är ett exempel: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +Vänligen använd denna funktion klokt. + +
+ +
+Tabeller + +Rich kan framställa flexibla [tabeller](https://rich.readthedocs.io/en/latest/tables.html) med unicode boxkaraktärer. Det finns en stor mängd av formateringsalternativ för gränser, stilar, och celljustering etc. + +![Tabell film](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +Animationen ovan genererades utav [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) i exempelkatalogen. + +Här är ett exempel av en enklare tabell: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +Detta producerar följande utmatning: + +![tabell](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +Notera att konsol märkspråk är framställt på samma sätt som `print()` och `log()`. I själva verket, vad som helst som är framställt av Rich kan inkluderas i rubriker / rader (även andra tabeller). + +`Table` klassen är smart nog att storleksändra kolumner att passa den tillgängliga bredden av terminalen, och slår in text ifall det behövs. Här är samma exempel, med terminalen gjord mindre än tabell ovan: + +![tabell2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+Framstegsfält + +Rich kan framställa flera flimmerfria [framstegsfält](https://rich.readthedocs.io/en/latest/progress.html) för att följa långvariga uppgifter. + +För grundläggande användning, slå in valfri sekvens i `track` funktion och iterera över resultatet. Här är ett exempel: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +Det är inte mycket svårare att lägga till flera framstegsfält. Här är ett exempel tagen från dokumentationen: + +![framsteg](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +Dessa kolumner kan konfigureras att visa vilka detaljer du vill. Inbyggda kolumner inkluderar procentuell färdig, filstorlek, filhastighet, och återstående tid. Här är ännu ett exempel som visar en pågående nedladdning: + +![framsteg](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +För att själv testa detta, kolla [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) vilket kan ladda ner flera URLs samtidigt medan visar framsteg. + +
+ +
+Status + +För situationer där det är svårt att beräkna framsteg, kan du använda [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) metoden vilket kommer visa en 'snurra' animation och meddelande. Animationen hindrar dig inte från att använda konsolen som normalt. Här är ett exempel: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +Detta genererar följande utmatning i terminalen. + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +Snurra animationen är lånad ifrån [cli-spinners](https://www.npmjs.com/package/cli-spinners). Du kan välja en snurra genom att specifiera `spinner` parametern. Kör följande kommando för att se tillgängliga värden: + +``` +python -m rich.spinner +``` + +Kommandot ovan genererar följande utmatning i terminalen: + +![Snurror](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+Träd + +Rich kan framställa ett [träd](https://rich.readthedocs.io/en/latest/tree.html) med riktlinjer. Ett träd är idealt för att visa en filstruktur, eller andra hierarkiska data. + +Etiketter på trädet kan vara enkelt text eller något annat som Rich kan framställa. Kör följande för en demonstration: + +``` +python -m rich.tree +``` + +Detta genererar följande utmatning: + +![märkspråk](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +Se [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) exemplet för ett skript som visar en trädvy av vilken katalog som helst, som liknar linux `tree` kommandot. + +
+ +
+Kolumner + +Rich kan framställa innehåll i prydliga [kolumner](https://rich.readthedocs.io/en/latest/columns.html) med lika eller optimal bredd. Här är en grundläggande klon av (MacOS / Linux) `ls` kommandot vilket visar en kataloglista i kolumner: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +Följande skärmdump är resultatet från [kolumner exempelet](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) vilket visar data tagen från ett API i kolumner: + +![kolumner](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Märkspråk + +Rich kan framställa [märkspråk](https://rich.readthedocs.io/en/latest/markdown.html) och gör ett rimligt jobb med att översätta formateringen till terminalen. + +För att framställa märkspråk importera `Markdown` klassen och konstruera den med en sträng innehållandes märkspråkskod. Mata sedan ut det till konsolen. Här är ett exempel: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +Detta kommer att producera utmatning som liknar följande: + +![märkspråk](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+Syntaxmarkering + +Rich använder [pygments](https://pygments.org/) biblioteket för att implementera [syntax markering](https://rich.readthedocs.io/en/latest/syntax.html). Användningen är liknande till framställa märkspråk; konstruera ett `Syntax` objekt och skriv ut den till konsolen. Här är ett exempel: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +Detta kommer producera följande utmatning: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Tillbaka-spårning + +Rich kan framställa [vackra tillbaka-spårningar](https://rich.readthedocs.io/en/latest/traceback.html) vilket är enklare att läsa och visar mer kod än vanliga Python tillbaka-spårningar. Du kan sätta Rich som standard tillbaka-spårningshanterare så att alla ofångade undantag kommer att framställas av Rich. + +Så här ser det ut på OSX (liknande på Linux): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +Alla Rich framställsbara använder sig av [konsolprotokollet](https://rich.readthedocs.io/en/latest/protocol.html), som du också kan använda för att implementera ditt eget Rich-innehåll. + +# Rich för företag + +Tillgänglig som en del av Tidelift-prenumerationen. + +Underhållarna av Rich och tusentals andra paket arbetar med Tidelift för att leverera kommersiellt stöd och underhåll för de öppen källkodspaket som du kan använda för att bygga dina applikationer. Spara tid, reducera risk, och förbättra kodhälsan, samtidigt som du betalar underhållarna för exakt de paket du använder [Lär dig mer.](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# Projekt som använder sig av Rich + +Här är ett par projekt som använder Rich: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + ett python packet för visualisering av tredimensionell neuro-anatomiska data +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + Automatiserat dekrypteringsverktyg +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + en högpresterande processor med hög precision och minnesprofilerare för Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Bläddra bland trendande projekt i Github från din kommandotolk +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + Detta verktyg skannar efter vanliga, sårbara komponenter (openssl, libpng, libxml2, expat och en del andra) för att låta dig veta ifall ditt system inkluderar vanliga bibliotek med kända sårbarheter. +- [nf-core/tools](https://github.com/nf-core/tools) + Python packet med hjälpverktyg för nf-core gemenskapen. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Rich bibliotek för förbättrad felsökning. +- [plant99/felicette](https://github.com/plant99/felicette) + Satellitbilder för nybörjare. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Automatisera & testa 10x snabbare med Selenium & pytest. Batterier inkluderat. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Automagiskt synkronisera undertexter med video. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Lättvikt Python bibliotek för att addera 2d-objektspårning i realtid till vilken detektor som helst. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint kontroller playbooks för dess metoder och beteenden som potentiellt kan förbättras +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule ramverk för testning +- +[Many more](https://github.com/willmcgugan/rich/network/dependents)! diff --git a/README.zh-tw.md b/README.zh-tw.md new file mode 100644 index 0000000000..048b8b10fc --- /dev/null +++ b/README.zh-tw.md @@ -0,0 +1,457 @@ +[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) +[![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) +[![codecov](https://codecov.io/gh/willmcgugan/rich/branch/master/graph/badge.svg)](https://codecov.io/gh/willmcgugan/rich) +[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) +[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) + +![Logo](https://github.com/willmcgugan/rich/raw/master/imgs/logo.svg) + +[English readme](https://github.com/willmcgugan/rich/blob/master/README.md) + • [简体中文 readme](https://github.com/willmcgugan/rich/blob/master/README.cn.md) + • [正體中文 readme](https://github.com/willmcgugan/rich/blob/master/README.zh-tw.md) + • [Lengua española readme](https://github.com/willmcgugan/rich/blob/master/README.es.md) + • [Deutsche readme](https://github.com/willmcgugan/rich/blob/master/README.de.md) + • [Läs på svenska](https://github.com/willmcgugan/rich/blob/master/README.sv.md) + • [日本語 readme](https://github.com/willmcgugan/rich/blob/master/README.ja.md) + • [한국어 readme](https://github.com/willmcgugan/rich/blob/master/README.kr.md) + • [Français readme](https://github.com/willmcgugan/rich/blob/master/README.fr.md) + • [Schwizerdütsch readme](https://github.com/willmcgugan/rich/blob/master/README.de-ch.md) + • [हिन्दी readme](https://github.com/willmcgugan/rich/blob/master/README.hi.md) + • [Português brasileiro readme](https://github.com/willmcgugan/rich/blob/master/README.pt-br.md) + • [Italian readme](https://github.com/willmcgugan/rich/blob/master/README.it.md) + • [Русский readme](https://github.com/willmcgugan/rich/blob/master/README.ru.md) + +Rich 是一款提供終端機介面中 _豐富的_ 文字效果及精美的格式設定的 Python 函式庫。 + +[Rich API](https://rich.readthedocs.io/en/latest/) 讓終端機介面加上色彩及樣式變得易如反掌。Rich 也可以繪製漂亮的表格、進度條、Markdown、語法醒目標示的程式碼、Traceback(追溯)……。 + +![Features](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +關於 Rich 的介紹,請參見 [@fishnets88](https://twitter.com/fishnets88) 在 [calmcode.io](https://calmcode.io/rich/introduction.html) 錄製的影片。 + +[看看其他人對於 Rich 的討論](https://www.willmcgugan.com/blog/pages/post/rich-tweets/)。 + +## 相容性 + +Rich 可在 Linux、macOS、Windows 上運作。在新的 Windows Terminal 中可支援顯示全彩及 Emoji,但傳統的終端機中僅支援 16 色。Rich 最低需要的 Python 版本為 3.6.3。 + +Rich 可在 [Jupyter notebooks](https://jupyter.org/) 上使用,無須額外設定。 + +## 安裝 + +以 `pip` 或 PyPI 套件管理器安裝。 + +```sh +python -m pip install rich +``` + +以此命令測試 Rich 在終端機的輸出效果: + +```sh +python -m rich +``` + +## Rich Print + +匯入 [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) 方法就可以輕鬆地讓程式進行 rich 輸出,rich print 與 Python 內建的函式用法相似。試試: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +Rich 可以安裝在 Python REPL 中,如此一來就可以漂亮的輸出與突顯標示任何資料結構。 + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## 使用 Console + +匯入並建構 [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) 物件,以更全面地控制 rich 終端機內容。 + +```python +from rich.console import Console + +console = Console() +``` + +Console 物件有個 `print` 方法,且刻意設計的與內建 `print` 函式相似。參考此範例: + +```python +console.print("Hello", "World!") +``` + +如同預期的,這會將 `"Hello World!"` 印在終端機。須注意不同於內建的 `print` 函式,Rich 會自動將過長的文字換行,以符合終端機的寬度。 + +有幾種加上顏色及樣式的方式。您可以用 `style` 引數設定輸出內容的樣式,參考此範例: + +```python +console.print("Hello", "World!", style="bold red") +``` + +輸出結果如下圖: + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/hello_world.png) + +介紹完了如何對整行文字設定樣式,接著來看看更細部的使用。Rich 可以接受類似 [bbcode](https://en.wikipedia.org/wiki/BBCode) 的語法,對個別文字設定樣式。參考此範例: + +```python +console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") +``` + +![Console Markup](https://github.com/willmcgugan/rich/raw/master/imgs/where_there_is_a_will.png) + +您可以用 Console 物件不費吹灰之力地達成細膩的輸出效果。參閱 [Console API](https://rich.readthedocs.io/en/latest/console.html) 說明文件以了解細節。 + +## Rich Inspect + +Rich 提供了 [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) 函式,可以對任何 Python 物件,如 class、instance 或 builtin ,為其產生一份報告。 + +```python +>>> my_list = ["foo", "bar"] +>>> from rich import inspect +>>> inspect(my_list, methods=True) +``` + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/inspect.png) + +參閱 [inspect 說明文件](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) 以了解細節。 + +# Rich 函式庫 + +Rich 包含了一系列可繪製的物件,您可以使用它們來印出精美的畫面,或者協助偵錯程式碼。 + +按一下子標題以了解細節: + +
+Log + +Console 物件提供了 `log()` 方法,使用方式與 `print()` 類似,但還多了一欄來顯示目前時間、進行呼叫的檔案及行號。預設情況下 Rich 會語法醒目標示 Python 的結構及 repr 字串。若使用於字典或串列這類集合性物件,Rich 會將其漂亮地印出來,以符合可用空間。此範例示範了這些功能。 + +```python +from rich.console import Console +console = Console() + +test_data = [ + {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, +] + +def test_log(): + enabled = False + context = { + "foo": "bar", + } + movies = ["Deadpool", "Rise of the Skywalker"] + console.log("Hello from", console, "!") + console.log(test_data, log_locals=True) + + +test_log() +``` + +上面的程式碼會產生下圖結果: + +![Log](https://github.com/willmcgugan/rich/raw/master/imgs/log.png) + +注意到 `log_locals` 引數,可用來輸出一張表格,用來顯示 log 方法被呼叫時,區域變數的內容。 + +log 方法可用於伺服器上長時間運作的程式,也很適合一般程式偵錯用途。 + +
+
+Logging Handler + +您也可以使用內建的 [Handler 類別](https://rich.readthedocs.io/en/latest/logging.html) 來將 Python logging 模組的輸出內容格式化並賦予色彩: + +![Logging](https://github.com/willmcgugan/rich/raw/master/imgs/logging.png) + +
+ +
+Emoji + +以一對冒號包住表情符號的名稱,來透過 console 插入 Emoji。參考範例: + +```python +>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") +😃 🧛 💩 👍 🦝 +``` + +請謹慎使用此功能。 + +
+ +
+表格 + +Rich 可以用 unicode box 字元繪製彈性的 [表格](https://rich.readthedocs.io/en/latest/tables.html)。格式設定十分多元,包含框線、樣式、儲存格對齊……。 + +![table movie](https://github.com/willmcgugan/rich/raw/master/imgs/table_movie.gif) + +上圖的動畫效果是以 [table_movie.py](https://github.com/willmcgugan/rich/blob/master/examples/table_movie.py) 產生的,該檔案位於 examples 資料夾。 + +參考這個簡單的表格範例: + +```python +from rich.console import Console +from rich.table import Table + +console = Console() + +table = Table(show_header=True, header_style="bold magenta") +table.add_column("Date", style="dim", width=12) +table.add_column("Title") +table.add_column("Production Budget", justify="right") +table.add_column("Box Office", justify="right") +table.add_row( + "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" +) +table.add_row( + "May 25, 2018", + "[red]Solo[/red]: A Star Wars Story", + "$275,000,000", + "$393,151,347", +) +table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", +) + +console.print(table) +``` + +執行結果如圖: + +![table](https://github.com/willmcgugan/rich/raw/master/imgs/table.png) + +請留意,主控台標記的呈現方式與 `print()`、`log()` 相同。事實上,由 Rich 繪製的任何東西都可以被放在任何標題、列,甚至其他表格裡。 + +`Table` 類別很聰明,能夠自動調整欄寬來配合終端機的大小,也會在需要時自動將文字換行。此範例的程式碼與上一個相同,然而終端機變小了一點: + +![table2](https://github.com/willmcgugan/rich/raw/master/imgs/table2.png) + +
+ +
+進度條 + +Rich 可繪製多個不閃爍的 [進度條](https://rich.readthedocs.io/en/latest/progress.html),以追蹤需時較久的工作。 + +基本的使用方式,是將序列放在 `track` 函式中,再對其結果疊代。參考此範例: + +```python +from rich.progress import track + +for step in track(range(100)): + do_step(step) +``` + +新增多個進度條也不是難事,來看看說明文件中的範例: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/progress.gif) + +您可以調整要顯示的狀態欄位。內建的欄位包含完成百分比、檔案大小、讀寫速度及剩餘時間。來看看另一個用來顯示下載進度的範例: + +![progress](https://github.com/willmcgugan/rich/raw/master/imgs/downloader.gif) + +想嘗試看看嗎?您可以在 [examples/downloader.py](https://github.com/willmcgugan/rich/blob/master/examples/downloader.py) 取得此範例程式。此程式可以在下載多個檔案時顯示各自的進度。 + +
+ +
+狀態 + +有些狀況下很難估計進度,就可以使用 [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) 方法,此方法會顯示「spinner」動畫及訊息。該動畫播放時,仍可正常操作主控台。參考此範例: + +```python +from time import sleep +from rich.console import Console + +console = Console() +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") +``` + +終端機的顯示效果如下: + +![status](https://github.com/willmcgugan/rich/raw/master/imgs/status.gif) + +該 spinner 動畫乃借用自 [cli-spinners](https://www.npmjs.com/package/cli-spinners)。可以用 `spinner` 參數指定 spinner 樣式。執行此命令以顯示可用的值: + +``` +python -m rich.spinner +``` + +此命令在終端機的輸出結果如下圖: + +![spinners](https://github.com/willmcgugan/rich/raw/master/imgs/spinners.gif) + +
+ +
+ + +Rich 可以用導引線繪製一棵 [樹](https://rich.readthedocs.io/en/latest/tree.html)。樹很適合用來顯示檔案結構,或其他繼承性的資料。 + +可以用文字或其他 Rich 能繪製的元素作為樹的標籤。執行下列程式碼來看看效果: + +``` +python -m rich.tree +``` + +這會產生下圖的結果: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/tree.png) + +您可以參考 [tree.py](https://github.com/willmcgugan/rich/blob/master/examples/tree.py) 範例程式,此程式可以樹狀圖展示目錄結構,如同 Linux 的 `tree` 命令。 + +
+ +
+資料欄 + +Rich 可以將內容呈現於整齊的 [資料欄](https://rich.readthedocs.io/en/latest/columns.html) 中,其欄寬可為等寬或最適寬度。此範例仿作了 macOS / Linux 系統中 `ls` 命令的基本功能,可以用資料欄列出目錄: + +```python +import os +import sys + +from rich import print +from rich.columns import Columns + +directory = os.listdir(sys.argv[1]) +print(Columns(directory)) +``` + +此螢幕截圖為 [資料欄範例](https://github.com/willmcgugan/rich/blob/master/examples/columns.py) 的輸出結果。此程式從某 API 取得資料,並以資料欄呈現: + +![columns](https://github.com/willmcgugan/rich/raw/master/imgs/columns.png) + +
+ +
+Markdown + +Rich 可以繪製 [Markdown](https://rich.readthedocs.io/en/latest/markdown.html) 並處理了將其轉換為終端機格式的大量工作。 + +先匯入 `Markdown` 類別,再以內容為 Markdown 語言的字串建構一個物件,接著將其印到 console。參考此範例: + +```python +from rich.console import Console +from rich.markdown import Markdown + +console = Console() +with open("README.md") as readme: + markdown = Markdown(readme.read()) +console.print(markdown) +``` + +執行結果如下圖: + +![markdown](https://github.com/willmcgugan/rich/raw/master/imgs/markdown.png) + +
+ +
+語法醒目標示 + +Rich 使用了 [pygments](https://pygments.org/) 函式庫來實作 [語法醒目標示](https://rich.readthedocs.io/en/latest/syntax.html) 功能。使用方式與繪製 Markdown 相似,先建構 `Syntax` 物件並將其印到 console。參考此範例: + +```python +from rich.console import Console +from rich.syntax import Syntax + +my_code = ''' +def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value +''' +syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) +console = Console() +console.print(syntax) +``` + +執行結果如下圖: + +![syntax](https://github.com/willmcgugan/rich/raw/master/imgs/syntax.png) + +
+ +
+Tracebacks(追溯) + +Rich 可以繪製 [漂亮的 tracebacks](https://rich.readthedocs.io/en/latest/traceback.html),相較標準的 Python traceback 顯示了更多程式碼且更好懂。您可以將 Rich 設為預設的 traceback handler(處理常式),如此一來所有未接住的例外都由 Rich 呈現。 + +它在 macOS 上執行的效果如圖(Linux 上差異不大): + +![traceback](https://github.com/willmcgugan/rich/raw/master/imgs/traceback.png) + +
+ +所有可由 Rich 繪製的物件都用到了 [Console 協定](https://rich.readthedocs.io/en/latest/protocol.html),您也可以依此實作自訂的 Rich 內容。 + +# Rich 企業版 + +可在 Tidelift 訂閱方案取得。 + +Rich 及其他數以千計的套件維護者正與 Tidelift 合作,以提供開放原始碼套件的商業性支援。此計畫能協助您節省時間、避開風險,同時也讓套件的維護者獲得報酬。[了解更多。](https://tidelift.com/subscription/pkg/pypi-rich?utm_source=pypi-rich&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +# 使用 Rich 的專案 + +以下列出幾個使用 Rich 的專案: + +- [BrancoLab/BrainRender](https://github.com/BrancoLab/BrainRender) + a python package for the visualization of three dimensional neuro-anatomical data +- [Ciphey/Ciphey](https://github.com/Ciphey/Ciphey) + Automated decryption tool +- [emeryberger/scalene](https://github.com/emeryberger/scalene) + a high-performance, high-precision CPU and memory profiler for Python +- [hedythedev/StarCli](https://github.com/hedythedev/starcli) + Browse GitHub trending projects from your command line +- [intel/cve-bin-tool](https://github.com/intel/cve-bin-tool) + This tool scans for a number of common, vulnerable components (openssl, libpng, libxml2, expat and a few others) to let you know if your system includes common libraries with known vulnerabilities. +- [nf-core/tools](https://github.com/nf-core/tools) + Python package with helper tools for the nf-core community. +- [cansarigol/pdbr](https://github.com/cansarigol/pdbr) + pdb + Rich library for enhanced debugging +- [plant99/felicette](https://github.com/plant99/felicette) + Satellite imagery for dummies. +- [seleniumbase/SeleniumBase](https://github.com/seleniumbase/SeleniumBase) + Automate & test 10x faster with Selenium & pytest. Batteries included. +- [smacke/ffsubsync](https://github.com/smacke/ffsubsync) + Automagically synchronize subtitles with video. +- [tryolabs/norfair](https://github.com/tryolabs/norfair) + Lightweight Python library for adding real-time 2D object tracking to any detector. +- [ansible/ansible-lint](https://github.com/ansible/ansible-lint) Ansible-lint checks playbooks for practices and behaviour that could potentially be improved +- [ansible-community/molecule](https://github.com/ansible-community/molecule) Ansible Molecule testing framework +- +[Many more](https://github.com/willmcgugan/rich/network/dependents)! + + diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..5f0bd51bf2 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,3 @@ +## Security contact information + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. diff --git a/assets/logo.ai b/assets/logo.ai new file mode 100644 index 0000000000..778b71bb60 --- /dev/null +++ b/assets/logo.ai @@ -0,0 +1,5759 @@ +%PDF-1.6 %���� +1 0 obj <>/OCGs[31 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + logo + + + 2021-02-21T11:24:41Z + 2021-02-21T11:24:41Z + 2021-02-21T11:24:41Z + Adobe Illustrator 25.2 (Macintosh) + + + + 256 + 148 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAlAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FUq1fzX5W0 WWKHWNZsdNlm/uY7y5hgZ6mnwiRlJ+jFU1xV2KuxV2KuxV2KpXqnmvyvpN5BZarrFjp95cittbXV zDDLIK0qiSMrNvtsMVTQEEAg1B3BGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KvAvzw/NbzRJ5tH5beSrtdPu/q4n1/WlqZraOUf3UVQOL+m6NzQ1qy0ZSCcUPBfNflby V5dhg0i202bWPMN8jtbvJM6lAagSSCNkXiDWg49jU5GUxEWeTKMTI0OaZaZ+bH5neTdE0/Qh52ex itoQLew+oW160URZuKevKjsVX7IBb4RsvwgZiw1Mp3wRsd905M9PGH1So+61X/oY78zv+p+k/wC4 NY/9U8s8TL/M/wBl+xhwY/532Og/5yH/ADeu9U0+wsvOzzNe3Edu7tpVgnpiRwgahiPL7XTbLMcp H6hXxtrnGI+k38E884/m1+d/lq60uGTzyJo9SkaN5m0zT4liCFAWNY2qP3leo6ZKcqBIFsYCyBdK P/K6/wA1f/Ll2v8A0g6X/wA05hfm8n+pn8fBzfysP9UH2fra/wCV2fmr/wCXLtf+kHS/+acfzeT/ AFM/b+pfykP9UH2frYHd3dlP5ouda89cvMltrUylvMCSuojcAhqx27U4rsoQfZVfgG3HMjDnE9qq Xc42XCYb84970HTNS82/lFONa8oTy6h5WaX1tb8uXL8oyrfCZYWpVDw4rzALDipbmlQL2l9caHrW na5o1jrOmyetYahBHc2slKExyqGWoO4NDuD0OKUdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdir4i/LvzXo1y2v+YNYvbKw1bXdUnu7iJ50j+GQ+qAqO9Qoklkpihh955gu7nzt req2UunCsv1aGW6m4oYYvgVoqOAwcRhifuzF1URIAHi+Dk6aUokkcPxQ+qxajql3Devq2j2l3CpV J7e6dH477E1bxPTxyjEYwBiIzIPeG/JGUyCZQB97MbbXdIS2hSfVbSWdUVZZRNGOTgUZqA7VO+a6 WGZJqJr3F2EcsKFyjaSa/rGlyeYfLMkV7A8MF/HJcOsqFUVZYzycg/CAK7nNh2fjlEmwQ4OvnEgU Qj/zV1bQNT1Ly2sF9a3ltHcSC79KaORVRmhrzKseIIB65n5b4TXOnBxVxC+VqH1H8vP5rD/kcn/N Wabj1H9L5O34NP8A0fmlnmDRvK11YrFpF3ptrc+oC8jzIAYwDUAjmQa0y/BmyxlcxIj3NOfDiMag Yg+9BLp+r6f5anslm0ufTbpmYzmZiWkoPsMSich6ewp2yzjhPIDUxIeTTwzhjMfSYnzejeSPNPl2 58j2FprGo2Mcn1drWe1mmijPpIWhUOjMD8Uaj55sXAex/wDOIl3eyflhe2FxcrcwaTrN3Z2TR0KC L04ZzwYfaVpZncH3xSHt2KuxV2KuxV2KuxV2KuxV2KpZ5l8yaL5a0S61vWrlbTTrNOc0zfcFUDdm Y7Ko3JxV4fffnv8Am7q2jXnmjyt5TsdM8n2qtJHqvmGb0jOgNAyKJrf7XQBSwrsGJxVF+WP+cs/L l7oNnc6voOrJqToRdDT7X17UurFSYpGkVippWhG3SppXFU0/6Gm8j/8AVj8w/wDSAv8A1VxVAP8A 85gfluskiDSNdYwkrLS1t/hI6hgbgEEe+Koq2/5yv8gXUCTwaNr8kT/ZdLKN1NDQ/EsxGxHjiqr/ ANDTeR/+rH5h/wCkBf8AqrirFtJ/5yD/ADX84eYNVh8ieXtLudP01/h0zUZvQ1WSJagvwa4iXtuA h4k0qcVelfld+cml+d5bvSLyym0HzZpn/HS0G72kUAgF4yQhdRUVqoI8KUJVeh4q7FXYq+Ivzm/L PTvIX5jfVUtEbyz5g5XWjsyK3ozFgJbYMFX4Y2I4jeism9eRzH1Ilw3E8m/TmPFUhzY5+gtG/wCW OL/gRmt8efeXY+BDuQkWkfX9XbR9A8uPrOoxxGeeC2jJMcew5Gitt8a1PTcd8vgZcPFKfCHGyyhE 0I2VW/8ALWqaPJb/AOIvJ9xo9tdyCC3up4m9Npm3WPkUUVIB742SCYz4qRCcCaMatMvI35U+ZvzA j1G68uWekQWGnzi2JvXdJWenL7EYdwKb1ZQN6CpDUlPKMYHFKVnuapSsmoxpB675Fv8Ayn5rPlvz JY2LXb2y3cE1kzSRlGYrvyow3U/aA6dwQcE8hMOOJlz6tmCpSogO/QWjf8scX/AjMfx595cvwIdw d+gtG/5Y4v8AgRj48+8r4EO4KzaZp7Wy2zW6G3Q8kiIHEHfcD6TkfEld3uy8KNVWyVatp1jCsFpp +nJcarfyLb6fbxxCR3ldgoCpvyNWAAoamm2ZOnM5y5mg42oEIR5Cy+2vyg/Lay/L3yRaaDCRJeuf rWr3CuzpLeyIqytHyCUjXgEQcR8IBI5Ek7N1zNcVdirsVdirsVdirsVdirsVeF/nNbt5y/OHyR+X FyxGhhH13V4akLOkRkWNGp/xgdP9nirFfz/8w299+a/l/wAnXGk3+s+V9CtUvr7QNJjJeeaQlYlK R/7rRfTX25MBStcVYt59h/MDzn510ZtG8leZtI8r2dvDZDRvq0mnRxRq55+jIiLElQw3cGlP5dgq 9j/6FZ8j/wDV88w/9J6/9UsVYd+SujW+j6X+dWm28kssNjd3tnFJO3ORkt0ukVnagq5H2j3xVAfk p+Vn5j65+WWjaro/5k3ugadcfWfQ0mG1MscPC7ljaj/WIq83Uv8AZHXFUy/ML8uPz78s+XW1TRPz A1nzNerKkZ0y1tCknBq8pKi4mYhadFQnfFXlWua95x0nTtD81ax5b1nS/P8Ao1760/mW4sXtILu1 qFWK6Z1X1JByVOZXdTxauxxV7T+fYttHbyd+cuiKYL2yurVL8qCjXFhdIW4S060Wsfyf2GKvfsVd irsVY9588maN5u8vzabqdhFqHph5rGGaQxIt16Lxxv6gSbjT1T8RjenXiaUwSFikg0bfD19qk+j3 E+n+YrZ9K1m3YiXT5lb1FBHKOtAackIIr1+0NiM1c9JLiobh2UNVEizzZt/zj75JtvMet2vmXTvP klh5ktWSfWtAt7Z4pWtIrgD0ml9WNJYpVij50jZV5KGFaVlq5+HHg4fT0LggmRsnd6p+av5A6x5/ 8xnU5fOVxY2EYj+p6S1sZ4bd1QK7x0nhHJyORPGvatKZiafWDHGuGz3spQJ6sh8ifkX5A8l39tqm k2851e3hMLXslxMfU5LxkZ4gwiPLrTjQHp0GVZtXPIKPJIgAl91/zjP+UFzcy3EulTtLM7SSMby6 JLMak1MhP35Ia7KBQP2L4YYz52/5xW8uS6VHL5DI0fX7eZZEku555IJI9w6OT6xTryBCmtOJG9Rb j15usm8UcFbx2KUf9Ciat/1P9x/0hP8A9lmS/Pw/mD8fBl6/5xebfmd5Jsfy2vba1Xzudd1oyxfX NFNs8ZjtZFZzI8pluI0b4VATZ6Ny6Zk4iMwPo4R3+ajLKJG9sx/5xbtfKWtfmJc67q2o241yzR4f LWjOzJMRwJluOgjkIiZgqh2P224jirZmYcXBGmvNk45W+vMtanYq7FXYq7FXYq7FXYq7FXYq+df+ cr/y5hvP0X+YBt5L610gR2evWMbcHawMrOJI2APFleVgTQ/aB6A4qj9B/wCcXfyP17RrLWdLl1C4 0/UIUntpBdDdXFd/g2YdGHY7Yq8287/lz+VGiedbnyf5e8peYfNOr2EMdxqCWd3xESyqrr9mCZj8 MiVNAN8VSCfRPyettH8yjU/Kmu6N5m0G2iuU0e8uzSRZ5ooEZn9CNkCtcIxqu4OxxVJNW/KvWdJ8 o23nfUdGtF8tXIgkQ2+qRmR1mIASOplJfrUAMVodqA4q9t8v/kH/AM456tpGm3qarNHJf28My20u pQCdWmRWEboFX4xyoRTrirJf+hQvyh/l1H/pKH/NGKp3q3/OOP5c6r5Z0Ly5dC9/R3l363+juE4E g+vSiabm3A8vjXbbbFXh+q/kb5E1X84rLyH5PS5Nnpa/WvNupSziURpsRBHQAB9wp6/E3+S2KvsH FXYq7FXin/OQH/OQEHke2k8u+XGS685XEfJ2AEkenxMvL1pVNVaUr8UcZ2p8b/DxV1Xmf/OPfkDz JPfS6r5w8lW+u6P5o43g8xarJa3E0NEmk9X0J/Vnk+tSOvxUUnZjyFM1et1EeUZESHQW2QieofQ1 p5Y8veXba8u/LXl6xtb5oWpDZQQWbXDICyRNIiKAGbarbDrmrOSUiBImm2q5PONe/PnzT5RNtcee vINzoul3XqRw3ttf2+oVnROaxFYlRUL9uTjuQDxNMuOjhP6JWfcx4yOYeT3n53fm7c2llrc/nXR/ L9vrCSTWWlfVJJmjjhla3JIWyvXUM8TULyGu9OlBZwYxKUI45zMNibjXIHrKPemjQJkBfv8A1IVP zt/NB3VB+Z+kAsQATp86jfxJ0oAfTh8KP+o5PnD/AKqI/wA4fb+p6B5A/wCcntOs7DWNP/MLUIJ9 V0iRksb/AEyJ5U1JV5A+n6SCENyT4XYxowZdhRjkMmhMuGUAQJDkeY968dEgs5/Kr8+fKfn1Y7Mt HpXmKT1GXRnkeRmSPflHM0UKSMV+LgtSACegOU6nRyx78496xnbM9X8l+Ttauhd6xoOnaldhBGLi 8tIJ5AikkLzkRmoCTtmPHLOIoEhmQC+f/wA8rLTPK3nPyhPB5Rs/Lflmy1e1uJfNmnQxrLJ6bJI8 fp26KY/TAdgrhi/GqU4tXbdnz4rJkSe5pyCuj6ptLu1vLSG8tJkuLS5jWa3uImDxyRyAMjoy1DKy moIzZtarirsVdirsVdirsVdirsVdiqjeWdre2c9ndxLPa3Mbw3ELiqvHIpV1YdwymhxV4C/56x/l 9548weTdQsU1HSrPgPLdh5cto2NpGE5GK4jLxfF8Q50YnkG2AIxVIf8AnGfyq/mTzTqPnnzNLrqe cLK4LyTTVhsriKePgqMSnNynHePkFC8NqYqzzU/+cU/y61TzXP5h1O81W+a7nkubyxnuVaORnaoT 1FRZwi9P7zlSnxbYqyy8/I78q7zy1Y+WrjQUfRdNlknsrYT3Kskkv943qrKJW5d+Tnt4DFWOar/z it+TF3p1xbWejvp13KhWC+iu7uR4nPRwk00kbU8GXFUo0/8A5xP0IWUKar5w8w3d6ihJJ7e5jt4i F2UJFJHcsgVaCnqHFXmvmm382flJ+ZIh8hnzLq1lDZsL46hG93azzzRv6XD0kiR0jZkqaVDA0r0x V6B/zilrPlgafq+jMt5H58lkOoeZW1CL05ZSzkKUPJmKR+oK86Hk5NN8Ve/Yq7FXYq/PvyZpKap9 cbVPMOo2Os67dXVldRxSSE3oRY5pxcPRufJ5Kt6h3PvihT8m635i/QccMPnbU9Hgt2aOKwhv5YYk X7VUjEiAAluw65r9TLhltAS+Dm4MMZxsypPV1bzQzBU/MnVyxNFUanKSSegH77Mfxj/qY+TcNJH+ elfmnSr/AFS1nbWfNF/rN1pkE01vb3ly1w0XwBmosjOyB+K1pTtk8WqNioACRpE9HEA+qyAmH5b6 bp+pec/y6s9RtYby0l0i+9S2uI1ljbjd6my8kcFTRgCMw+0skoYM8okxPHHcbfw42OniDOAIv0n7 5KHma0vE/KCS/wBX0W1sdYk8wCzjnGm29jN9UFoZVC+lDCaGRTv36ZPTTH53hhMyh4V1xmQ4uKup PRjlj+6sgA8XdW1PUtY/JD8ttSGqeWfLF3Hb+aNM020s5YrhVk4CS5W7+uSkRh2uJUUxs6N8KMF4 hSozSYO2tTDhy5h+5lOR26+kx4ef0g779RfNThibA5pD+ankH8sdP8pebLvy7Kw8yeXdSgv5/RCx fVW1KWJFtVMccaGBF+KNVJMbCnIfEDldl6/VyzYhkH7vJAgefCD6uZ37+/u5VDLjgAa5hh1h5g81 3Fjbzy/mNq8UssSPJEdTmBVmUErvNXY5up5KkQMY+TdDTRIB40BBaX/m3ShqHmPW9c1uGDUn0+wj EjXjRh0VzKRM7cFYceRXwGbHHAAbAAuBLm+jf+cOp/U/LLVI0lkktYNcuY7QSmpWI29u4UDotWcs QO5OWMQ91xS7FXYq7FXYq7FXYq7FXYq8N/5yS/PG78kwweV9DrBr+q24nbU3FUtbaR3i5oByZpC0 bU2+HrucVfOX5P8Am/yj5W80L5n1rWtYg1K2uS3pWEEUqXdu28i3Ek0yt+8b7Q4Hxry6KHunmz/n Kz8tNc8vXmlWV1r2jXVyqiPU7S3hE8JV1clCLheoXj16HFLxC+/MrzRr+qJ5MtvNmr6n5X1e/ska 51Ckd5xLBXXaSai8nrx50PFTTFUPpPl/Vdah0+70zRoltdavJLHR0uNUkWWWaMqDFvJHVh6qVbiA a4qnHkLznH5B856Lr9y11p1rFeahpXmOwime6jkFqkZqqsd/iuF2LHdOQPbFWc/ld/zlNYaZPr97 56vtT1G51K6V9PtLeFHtraBA1BEGlTjy50K8f2QSSTsqz3/ocf8AKj/lm1b/AKRof+q+KvFvJn55 aT5Y/OnWfNTNeazoWukwT3l8iJqEULsjjisbNHSJkC8QQGUCgXYBV9u4q7FXYq+PPL0Gknzt54sh axGbS/MeoSWrFFJhSaZowI2Iqu0FDTFDyDTofKdhc3ena/bSPdQXUsJuVMnpqsfw8T6bg15Kf2T1 zF1AzXcDs5WCWID1jdPLKP8ALE3KNAyJNGQ6NI9xGAVNRvIVXMOf5qt+XwcyH5a9v0p3Lpujaiup XenSRS315bvbSXCSl1+JAqhgpZR9kdBmKMk4cIlfCDdU5JxwlZjzIpK9Ik0uGx0galYeZbHXNEhm s47zRvTVDG9zPPyVyvMH/SWU0ahGW5ozMp8JxSxzINT90R/vQXAjGgLjMSjtsidaudF1awe1vJfP F2u7wpeslzCsoUhHaNiK0r2INO4yGCE8criNPH+rsa96ZjiFEZPizX8lfz/0XSdCHl3zpM9o2mp6 dhqZSacvCrGlvKqLI6tFWiEDjx22K/Fru2uwsmSfiYN+LnGwN+8dN+v4qnDnAFSY1+bP5pab+Yfm ODSba4Fj5R0x3nNxJyjkvJQAnq8GpT4fhiBHIKWJ68FzuyuzJ6TGZEcWWX+xHd+k/D3pM45JUTUW LkflUP8AO7zN/wAK/HC33pfxxM0/Jn/RPJN3dT/DCbqabl/kJFGpP3oc2jrHuf8AziRoo078nLW7 EnP9MXt3elf5ODi04/8ATrX6cUh7PirsVdirsVdirsVdirsVdir56/OfTddn/P3yemh6mNE1PVtJ urG11XiH9JojNLTh1blz4/7LFUg0O6/NHy5+d3njQfKL6Ne6repp9xqL6wZYxM62yvzhEbxnkzXL Fl39sVeqeXb7/nJB9csk8wad5Zi0VpVGoSWbXZuBF+0YucrLy8KjFXn358XnnCHQvKF/53isbSS0 81I6yaf6pgWyVQ0byGRnPqUVy3y2GKvIvLXmC88v2vluwvNDW/n8patPqltcW2r2ccUzyNF8DD05 6p/o4oyvvXFU3/K+Saf82/J7zLEl7f65q+qtZQzR3LQw3MMYX1GiJANYJOtDQcqUIxV7xLqP/OVX qv6Wl+UzHyPAs15XjXav77FWMfmVrv8Azkja+QPMEnmDTvLEWiyWE9vqElqbxpxDcIYW9INMy8/3 nw1FK9cVef8Ann8vvqP5T+QtUGq3UknmJdJsBobSB7RVuIzcmZIzQ86qoNP5qYq+xsVdirsVfJt/ bWek/nr+YGlRfC91JbagqjofWiE8p/4O7xQ8xtNV07SvMvmuPVJVhjkv3eONwWLB5JDUIAxOxXtm v12GUzHhG+7sNFljESEuSjpcN/5p1iex8o6DpV4YyAkd0bWCeaoZi0aTSwM4ohJ4glRu1K5RllHB ASzTnH3cRA99A/jkiWYSlUIx+SWatoWteTvNtonmTTm0KUKs/pWjeqsiFjvyE0qlTTiwVvoy/Fnh qMR8OXGOW/8AY1RlwZASOH3f2vQ7O7try2jubaQSwSjlG69CP4HxGaicTE0ebu4yEhY5Lp7m3toz NcSpDEtOUkjBFFfc0GCMSTQ3TKQAs7MS8tWkGpfl55rsbXRZ9Y1y+1C2TSJrWza6e3Cv607+qqt6 IeKLjsat4EBiux1MjDPikZiGOMZcVyq9qG3Wifg6DmJUL3X+c9R8oJ+Zd5erpI0vRZrK3eDSprIQ NFI0ERKm340VuXL4uh6gkGuQ0WLN+VETLimJG5cV9T1/BboTgMlyG1dyFk13Qn06a507y7KaI/G5 +qRCJSAfiZ15bL3ywYcgkBKf+yLkHNAxJjD7Ay7yqvp/ktOwHF2sdQcnvXlNQ/cBm2dU+mvyA0WT Rvyb8q2juJGlsxehh2F9I12q/wCxE9MUvQMVdirsVdirsVdirsVdirsVeKfnrS1/M38o9RB4susy WbMNiRdPbpQ038fvxVhnnnyd5C17/nJDXrPzvcrYaZPolve2t490tpwniMMIpIxCboH2bwxVjfmi 0/I/y0SvlX8xPM82sKeMEGkT/WlqBsFdEtYyK+ExxV6J+Sui/mb5q0rU9M/NOxk1TybOitpi65Es d+ZkcFW4f3oUoSeTtWtOJpXFWd/9C+fkz/1Ktp/wUv8AzXirF/PDfk5+T2kanqWg2dhpvnSa0lg0 eCIevdmeVKRH0nZysYYhnJoCNt9hirFF8ha2fKen6/8Amh+bGq6IdRhW5l0oXH1Tgz0f01Tmebqp FVWL4T2xV5l+Y0H5AW/li9Tyv5q1zXfMKqgsku3kNuS0yiQOXtoBtFyIp123xV67+Y9pSb8iNAkX kv1yzklibiQRZR2oYMp2OzkHFX0NirsVdir5h/M3TINO/wCcjbu4B+PWdBium/10lW3/AOI2uKHl 2pW+mTfmZr1re20Uzyx20tv6yK32IED8eQ78u3hmBrzIRBiSHO0AiZEEW3qfkny/ftLI1uYbiWhM 0LFSCKbhd03pv8P45r8WsyQoXYdhl0cJ71RX+VbbzR520gaZaMmu6x5KuHSzguJkUXmlXw9CWFXd eP7logyGSSnFyP2VU5EdXi7PzjKY8MMw9XcJDvH9IE3tzAJ6ulzYTliYXuORYjB5cu4fMr6Bq1tq eiWt4r3Nrp8yvA1d9+Mobmg9N1D0+Lj9GZeo1WKUTlw8MgD768tu62zSY5EiEyWS2v5e+WoUKyQy XJJ+3LIwI/5F+mPwzXy1+Q9adnHQ4x0t6P8A84oKqWfmpVFFW8hCgdgFkzS+1X+S90v964WnG8ve wr8201Nvz11g6akD3SW9sy/WQxQD6tECRx35b5suyTH8hDiurPL3llHi8X01ddUg1y686xaReNex 6eto0TpMyGQNxccPhq32t9szMEcJmOHiv4ORmlmEDxCNMm1tTZfklGICV52NmSf+Yh4y/wB/qHNw 6d9cfltZz2X5deVrOdSk9tpFhDKp2IeO2jVh94xSyPFXYq7FXYq7FXYq7FXYq7FXin/OVA+reWPK 2sptLpfmKylB3pxKSE7D/KRe+Ksd/OLRPJVz/wA5F+Vj50ihHl7UNHeGSS5ka3gNxDJcMheVWT+d BuadMVelaVrP5DeT7GW50e98vadHbRM8klnLamdkUciKxlppWNNhuT0xV5Wn5vef/wAyLyeTQvMe kfl75VRjFFcahPbNqU4FKsI3aq+I48QOgdsVRX/Kt/KuoUHmP88bzU0NeccWq28Cbih4o81wq9u2 Ksm8k+Rf+ccPKF4uoWWr6Xf6qjc49R1HUba5mVuvJAWWNW/ylTl74q8985fl75j1H8yr3zlY3nlX zhp+r3HpaHDrF6zxh1oEtIoY5YopHSoULyYGoJFTirFPzT8w+e7ny9D5U1DTfKOnw317Fbi28uGN 7wSo+yGOKebgvIANVRvQYq9m8+xRXf8Azkh+WmkD4bXTrK9vUiXYL+6lCUBBX7Vuo23p9GKvbsVd irsVfNn/ADktpt3of5j+V/zAua/4e+r/AKGvJE3aKUm4lRnX7TKyzFvhB+we5Wqhg955QtvN5uLn WxaPbhyui6jpjt6xti5NJXbnG/bsQCWpSuKsM88/l95O8s6ZHJHLf3Oo3b+lY2vqw/E9N2YCLkVW o2G5JA2rUNqgfyxv/PWiSXOo+Ury0jnuYxFdJLwd1UNyHJHU8akbHvks3YUNbAcRBA35kEfJx568 YZVR/HxVPOVv+YfnXzdpdvq7wX/mG7RbKzgtQoYRK7ycpFjUBUXmzF27VPQGmPPs7D2XhO4EPq5k +XX5DvLZi1R1B2BTY/8AOMX5ogEmOyAG5JuR/wA05p/9Eml75fJy/wAvNPPyz8qfnDokOoQ+SNY0 O7jleNr8W91bXnFgGCciA/Cu+Yvaeq0WXh8eOQVdXGUe5lijMfTSX+dfKP5raFr/APysXzfY22pR wlBfPbyxKgBRbaIMgFRXkoqEO/XMvsvX6OQGDF50CDv1PNGSOQHiKaaf+W3k7UJx5kVJ7kaj/p0V rcsohVpz6qgpGq7DlTiWI7GubwChQaCbNlA+Z5Nd8zDRvIEJgm82areIl3DYiR7aGIMxDSmjyKFX jI+x4qrMaClSh9wYpdirsVdirsVdirsVdirsVdirAfzz8hXfnn8t9S0Wwp+k0KXenqzcVeaBuXpk nb405KK7AkE4q8LH5oeRNc1WUfnG18k1tax2k3lO6sZfSt72Lisl5BPFIJFMoQ8l4LTlSrAVKqt+ n/8AnCz/AKtEv/IvUf8Aqpirv0//AM4Wf9WiX/kXqP8A1UxV36f/AOcLP+rRL/yL1H/qpirv0/8A 84Wf9WiX/kXqP/VTFU6svzS/5xRsrXSrW1tp4rfRL39JaWghvT6N3VW9UEsSxrGuzVG3TFUk1zzv /wA4xvFqGoeWZ59A813LGa31+OzurmaCZpBI8kccsioHcclqCtK4qzL8oLTzJ54/Mc/mXqtrcWui aXpSaP5fe7X0ri7I/vbpkHIUYtIx3IqwAZuJxV73irsVdiqH1DTtP1KzlsdRtoryynHGe1uEWWJ1 rWjo4KsPmMVeCfmD/wA4zfkVo2l3vmbULjUtB0iwiVp4bK4EiVLBF4i5iupS7uwUDnSp7YofPjaI hu7PXPy18q+ZpUsrxLnT9XvQl7FILd6isFrZoiuJFFf37jYinhh6nUaepY8k4ixRBkAaLOMZcwGe eaNduPNU63mvfklqVxqNAJL6Br62kc8VWrtFaKXoqALzLcRsM0GlxDAKx6uHB3HhNf7L7qb5S4uc N0Z5S85aj5SWT/D/AOSepWUktRLccryWdg3GqGaWzeThVAeHLjXemU6vSR1H95q4Ed3pr5CaYTMe UCgfzJ87/md52sbPS3/L/W9P0iKb1tRtI0u3N3woYo3cW0fFFarEUNTQ7FQcyex9JotJk8SWWGQ9 N4xrv6nn9197DPLJONAcPwth9xp3nuK4tb/Q/IWr6Hq9i4ktL+0tbhSp6EOgt1Dqy7EH9VQek1va mg1GMwJx0f6cfx+pwdPpcuOV8Uj8Czvz9+Zf5r+a/KFz5eh/LvVNNkvhGl5eCG7lrGpDOscfoR8e bKBuzfDUdTUcnoOztJp8wyHPCXDyFxH++/Vu7GeSco1wlhXlDyr+Ux1ix0H8w7LzJ5R1C7SIJfTz 26WrMwZWlkSeyikghaReKmsgX9pgFLZ1mLPDILhISHkbcUxI5vsvyJ+VnkTyLA8flvSo7WaUUnvX LS3MgooIaaQs4UmMNwUhK7hRlisrxV2KuxV2KuxV2KuxV2KuxV2KuxVD3WnafdlTdW0VwUqEMqK9 K9acgcVUP0BoX/Vttf8AkTH/AM04q79AaF/1bbX/AJEx/wDNOKu/QGhf9W21/wCRMf8AzTirv0Bo X/Vttf8AkTH/AM04q79AaF/1bbX/AJEx/wDNOKrk0PREdXTT7ZXUgqwhjBBG4IIGKo3FXYq7FXYq 7FXjf/OWHlzWda/KWV9MVpTpV7Bf3kEYdne3RJIn4qgavpmZZGrsFUt2xV43+an5y+TPMHkLRtM8 v3s1ipuYF1bRLaOW3dLFYZEeAOqpbtGvwjgGofh6Uzluxex8mDVmeePFHpLbc2N++/2uRny8UKga LzfU77yJYWYvvLF1Laa9atHJZzwtdK/IMAx5SfCPhqe2dzrMeknjMQLJ6b/pdRpzqBMcXL4fofSs X/ORH5Reknq6+BLxHqBbS+K8qb0JgG1c8ml7P6yzUNv60f1u/wDzEO9f/wBDD/k9/wBTB/06Xv8A 1QyP+h/WfzP9lH9afzEO93/Qw/5Pf9TB/wBOl7/1Qx/0P6z+Z/so/rX8xDvYL+aH/ORWjXdnDonk vVDD9fBGoeYPRuEa1i6FII2RJDK/89PhHQ8jyTediezn7zi1I4QOQ5/E8P3deuzj6jUkR9G5eRX9 hoOuNBo3lO3uNc8zarcD98wle4dt3d2aQKKmpLGlKVZjtnf5jp44+HGLP3fjydRhGYzuewfoJpFn cWOk2Vlc3TXtza28UM17IKPM8aBWlYVbdyOR3Oa9zkXirsVdirsVdirsVdirsVdirsVdirsVdirs VeLfm7/zkTJ5Q1m58v8AlvRW13VtOgW51eYlhb2aOVCB+ALMT6i13UDkNyTQKsK07/nLHzzb3sra 55MRtNs+Z1F7KST1IEinFvI5LeonwSsFoaVJG+KvpHQ9Z07W9HstY02UT2F/ClxbSjukihhUdjvu OxxVG4q7FXYq7FXYq7FXYqxq4/LH8tbm4lubnyno09xO7STTSafau7u55MzMYySxJqScVU/+VUfl d/1J2h/9w20/6p4q7/lVH5Xf9Sdof/cNtP8Aqnirv+VUfld/1J2h/wDcNtP+qeKu/wCVUfld/wBS dof/AHDbT/qnirv+VUfld/1J2h/9w20/6p4qmGi+SfJuhXT3eiaDp2l3UiGKS4srSC3kaMkMULxI rFaqDT2xVOcVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfNfmCbWPIP5+6tNdX40TSfPy266f5 kMMc0cEsLRF4pFl+AcuLRsSfhDq/bFU+/wCchNdTyxojaDoNxCJ/NlvcWEHlS1tIS1xc38gEl+0i /vFb4mVRT43avY4q9N/K3yveeVvy90HQL1g17YWiJdcaFRKxLuoI6hWYrXvirKcVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzP84/zttfy5k0qzj0mTWtV1cy GC0SUW6qkXEFmkKS7ktQAL41ptVVi1r/AM5TW+n3llD558n6n5UttQUtaX0nK4hdRSrisUDMoDAk xhjuNt8Ve2abqen6pYQahp1zHd2N0gkt7mFg8boehVhscVeE/wDOVdnpl7ffl5Z6ryOl3OtCG/Ef Ln9XkaJZePGrV4E0pvirxPyLpWgW3nbyNdWVtfW+oP5n9NxfKy1sOcD2PEHavpueVPbtTFX3Xirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirF/Pn5ZeS/Pdn Da+ZtPF39VLm0nV3ilhMgAYo8ZU70FVNVNBUYq+Ypvyh1kfmbq35daJfrqFt5ctW1vQLTV6vbvDd ejFdWchTiU9VZgOaU3QH4SahVn//ADjBdeZPLnmPzV+WWvxG3l0r09Rs7T1UnW3S4Cs6LIv2gyzR Nt3rsCTiqdf85Cf8pl+U3/gTW3/J+DFXfn1/5Mj8ov8AtuN/yctsVe2Yq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwz85PMuqeW/wAs9f1fSXWPVILYizdi Kq7kKzqG2LRoWcD2xV8maN+Xs0tvbeZNdjvPN9trcCXP6S0TVYkvIZXAMsF3Fco8jOj1BNaVHXwV Zd+X/wDzj5omuateav5juLjy3ojxhNO01tTt5tSkeorLPKqBEWg+xwr926qSa7+XXlK712/tfJek at5i07Qbg29/qVxrdlZq86buloJYqycKU5LXem3Sqqbwflv+Terflne+d9D8xatous6THNJDBqF5 D6tvf2yhxDxVI3JZuIRkIO4PX4cVfQX5H+Z9V8y/lboOq6vMJtVlhZLuSoLMY5Xjjd6dGkjVXPzx VnWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8barZ+XPN +rfmZr/ny+nufMfl64uItE8ufWktf3ELOFWNZASyrxFRHv1O7MMVYXe/lfY6d5RtPPM+raJqOmN9 XludAsbuZbz0p3VGQCT4hLGzUYb0oTuBir3WL/nHv/nG+SJJP00yc1DcX1SAMKitCKbHFaXf9C7/ APON/wD1fP8Aua2/9MVY1+YP5U/845eUvLzalBc3Os38si29hplnqULyTTyV4glVbgm3xORt86DF WD6d5W138ufM3lfWtI16wbzBq2owQDyvpNw14wt3YBo7mRHZXDEhKbgk1U/Dir7jxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvEfzc/6Ff/xOf+VgfVv8Q+mv rej9f9bjQcPX/R/7XGlPU3pTtirCP+sGf8/8QYod/wBYM/5/4gxV3/WDP+f+IMVd/wBYM/5/4gxV mX5U/wDQq/8AimL/AAL9W/xFxb6r9Y/SHqdDy9D9IfDz41+x8VMUvc8Vdir/AP/Z + + + + uuid:0edba0c7-0a0f-ad4d-b978-239c9d4f9d29 + xmp.did:5026a078-6e9e-4f7b-ac16-6a7f1655d4e4 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:76b108ec-dcfe-4d12-8a05-9b34b1fd2c86 + xmp.did:5cace282-7b96-2943-a43d-1dd8c9914347 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + EmbedByReference + + /Users/willmcgugan/Desktop/eg7fso9i.jpg + 0 + 0 + + + + + + + + /Users/willmcgugan/Desktop/eg7fso9i.jpg + 0 + 0 + + + + + + + saved + xmp.iid:5026a078-6e9e-4f7b-ac16-6a7f1655d4e4 + 2021-02-21T11:24:34Z + Adobe Illustrator 25.2 (Macintosh) + / + + + + Document + Print + AIRobin + False + False + 1 + + 595.276000 + 841.890000 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + CMYK Red + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + CMYK Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Green + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Cyan + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + CMYK Blue + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + CMYK Magenta + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 Y=90 K=10 + CMYK + PROCESS + 15.000000 + 100.000000 + 90.000000 + 10.000000 + + + C=0 M=90 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 35.000000 + 85.000000 + 0.000000 + + + C=5 M=0 Y=90 K=0 + CMYK + PROCESS + 5.000000 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 Y=100 K=0 + CMYK + PROCESS + 20.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 Y=100 K=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 Y=100 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 Y=100 K=10 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 10.000000 + + + C=90 M=30 Y=95 K=30 + CMYK + PROCESS + 90.000000 + 30.000000 + 95.000000 + 30.000000 + + + C=75 M=0 Y=75 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 Y=45 K=0 + CMYK + PROCESS + 80.000000 + 10.000000 + 45.000000 + 0.000000 + + + C=70 M=15 Y=0 K=0 + CMYK + PROCESS + 70.000000 + 15.000000 + 0.000000 + 0.000000 + + + C=85 M=50 Y=0 K=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 Y=5 K=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000000 + 0.000000 + + + C=100 M=100 Y=25 K=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 Y=0 K=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 Y=0 K=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 Y=35 K=10 + CMYK + PROCESS + 35.000000 + 100.000000 + 35.000000 + 10.000000 + + + C=10 M=100 Y=50 K=0 + CMYK + PROCESS + 10.000000 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 Y=20 K=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 20.000000 + 0.000000 + + + C=25 M=25 Y=40 K=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 40.000000 + 0.000000 + + + C=40 M=45 Y=50 K=5 + CMYK + PROCESS + 40.000000 + 45.000000 + 50.000000 + 5.000000 + + + C=50 M=50 Y=60 K=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000000 + 25.000000 + + + C=55 M=60 Y=65 K=40 + CMYK + PROCESS + 55.000000 + 60.000000 + 65.000000 + 40.000000 + + + C=25 M=40 Y=65 K=0 + CMYK + PROCESS + 25.000000 + 40.000000 + 65.000000 + 0.000000 + + + C=30 M=50 Y=75 K=10 + CMYK + PROCESS + 30.000000 + 50.000000 + 75.000000 + 10.000000 + + + C=35 M=60 Y=80 K=25 + CMYK + PROCESS + 35.000000 + 60.000000 + 80.000000 + 25.000000 + + + C=40 M=65 Y=90 K=35 + CMYK + PROCESS + 40.000000 + 65.000000 + 90.000000 + 35.000000 + + + C=40 M=70 Y=100 K=50 + CMYK + PROCESS + 40.000000 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 Y=80 K=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 Y=0 K=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999400 + + + C=0 M=0 Y=0 K=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998800 + + + C=0 M=0 Y=0 K=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999700 + + + C=0 M=0 Y=0 K=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999100 + + + C=0 M=0 Y=0 K=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 Y=0 K=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999400 + + + C=0 M=0 Y=0 K=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998800 + + + C=0 M=0 Y=0 K=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999700 + + + C=0 M=0 Y=0 K=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999100 + + + C=0 M=0 Y=0 K=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998800 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 10.000000 + 95.000000 + 0.000000 + + + C=85 M=10 Y=100 K=0 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 0.000000 + + + C=100 M=90 Y=0 K=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 Y=0 K=0 + CMYK + PROCESS + 60.000000 + 90.000000 + 0.003100 + 0.003100 + + + + + + + Adobe PDF library 15.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 595.276 841.89]/Type/Page>> endobj 33 0 obj <>stream +H���I�c�D�<ſ�b�*Z �Ћ>�ݵ�j�U���c 3+!!&=����_�����ϯ���߿^��n��9�>�2���^�e��ۯן�/_�����]˕���v>������C��?~������ WJم��b�8����~�~����� � �T�k����T�{�Յ\��Z4��X���1_^hŅ��1\ٶ`%�+x�F�Ӳ�E ѕ��n~�M�ܛK� Od�ֹ-�Q�Y����|�+ogeT��-��]��� +ijM�w�X+��Ot�$N*Ʌ2.^�:�!+�S���v�.�� +�@�;`�s��A�x��=����#6�뻅�z��k�O�u����M�/)p��]v}�j�I��Wî�E�Z���@XI��:�R 9���o�~U���x�*rϯ�r��{r�g�a�TpY�%(��&������]��v�߈��x�n)Q�r֎{�c�����|{��ǵ���) +��9Rh�� +s�qm0��}�J%�����<ǟ�y�2u�2�2�� �u�BQ�e� ����.cg��;�{a�5��>��c�S��*$�C�K����c~]~�VI.�$#u>�� ^߳Ꚅ��[P˃=���]@چ=���;��"O;�x�{I�H���_� +�Y��ž�S� ��t��k��U,��|‘��1x~�Nv�ٛ�NT�b;>�����3 +{�� 'NPrޙX+�y¬��3�ǡ���͂C��ڷ�?��PR4��'���-���=w����\�w� +�7 a���Nu� ��op��̰��d��YYT� Z@��&����� +�c�=� +��EGkOf�'Q��e?�ckAT �n��\�����b�,��^V��{���l<,"�+3�I�*���L�.�c��D) D����=�i9��kk�}���2X���gJ��Rޚ���`� �'e��s�D-B���z)�YQ jc��`��7h�(q s�[{� V I�W9"�V`x���)6j��м��[�[�1ï��@��Ft + F�X� r"EsQ�"������JQ��+��ݛ@� E�*�x@=��6��kTy�ˋ�Y�/&��j�?�.���1�{'J�4�(�"ɚ�t���$3�{�An.�=�95앳��E���8)� �: �-��V>�?Z"�Y��)��"�:U9ȫ+AR� ;ؘ� �ց��VLN�P$�Y�L�2�Z�����'�î��U \�X�(5�L���7�s��'����3 :}�4$���#���&�f7ۼ����o$L���\��v���IH<�4aKA+2�� �P�" 1� 5B��H3���6����Y1�o�R��fL,F�L���z�AɹxA +���I��>wgpa�^�v��ǡVNs_!��@��Ke=sP� P > F@ Vu��<��x���$wQ�/�'�l�2W�֓eڊ���,�"��.��6HW���젙�T�:Yww�c��Bs�T�NJ�L�*���Uo�U���Lh.�kf��R��D�[ֳ �`��vg�����;5l��� ��m��z�6�i�H_�r�)�Z���Ւ��B� �J� �"������F4%L�بY{�GU���Fj ���Y�j`��2��b`�����Ǟ�a��Bs���� ;4����H�:��$L�e���h�Ph;R���L,�J�o���m�C˶��r�^jڅ�̑86�����/��0Dp'�>.������}I��6�F��}UH�!�d������J��#��DfӔʄ�Y0�)-�FKq��:M��`�B[!�S�{���b�(aG{�y{�m�)������z�]'�4��ץ.�I�F��¼o��p[k=k������F`n�{� +�,� +6�' +���ZM"Qm�9^c��}��wE����:��J� ^� ��=-S0̦nJ��als�(<���w��i.UxMׁ���j�� +@Q��U�$W�c����Uݛ1�:�[��p����0�� ��1��m^kQ�p5i� >����^�jx��.y��Hr��F��0 �x�`^Sb}�YO��\e 06�Z>�zn�w9�����?�>f�'t��S𘠬�-d�:��� R��� X�c�h^� F�\!�T�`䙜u���"� � ��]�B�4r=�C��mڻ����R�M�̺��<�:8Q]C�\�E�8�H�y�$� +�� 7�*�L\kh5��D��b����u� $gc^Tr--o7Iʠ}����hm����_�$(}#I�j^7�gSu�N.���w޻��z���,�s9ɝ�}]u�|8������s�MJP?��s)Ž�zI���.�s���M���s&�枻|��m=�S{Au �� �Jz���ǚq你���-(W�-�L^Ѐ}q��}i����d�/��Аn&[�����¶�ƍ�-�:��*�D\S�D��^�����6y�.�F7�0�����;��f���Ѱ�P)� ���G\�vCS*�����w�q�m��{ĺ����X�G4�rW -V���F^��gV�r�`�e��"+�2��*�c���.�a�nrҭ�B� ��<�c��+؈H F(�/�n's;�c�+�7\��d�G&�zU�4��m`D66�� '�� �=�y��]kg��r��n"�g���#;y p�H��v��m�?0w�7,J�x�F[@5Ć��mq\��:W�5�9L���S6N���w@澎�8*����n��O\�����Xd�i�� �� +��@C�#H�(f�" �6$��$i�2�v��0��^G��K;�i���<��J�s�C�����m�RVK���b<����!{}͊O愉\>{|x�K6#��;�1�='�����E��wE�Ċxչ_���l��8����q�'�'��k�2@�lAC%�9G�|/ M�e���׻D��] m���3.�|g��];�x��xE���Wİy廥� � �!_� M@��7\D���|wLt��o�8�)qB����դ:+j���|+�=�˲W��+G3�k���q�%�4��_+8��۞C>��h�����;.3���^�&�'+�=l���9M�AjBvVۍ����k]��XAo$�m$���A��e�>5�t� +E'YJ���K���H���c�!�F ޵Ml�e�W�1ͫ��5�t�8���$�|�臿���r|h,�?פ����fx��א�].;����Z��S�� � ��n��R�Ղ�� �����������f׌�*|�R� +G��0��zI��H�?�w�Z���j`(��t�4��s�\c[Zr�Ĕ#P@1�7��/��iP�t<ʳ"�V�t^�� ?\#�c�s���P����^��뮁v���ne��ԛK]9-i9^�xt��`jV�F3���S���9Z�� ݀�=����W��sҴ�1��F��zS�Y ��V������8(X�����\�l81Ҁ�Ѓ�t��4��I�[}�F:tK�5�� �섷#�Hʽ�aV.^�� +xb.�-1�[( �W],v���DR�LD"/�.Ӌ+��i�A�M�#z��6E���J7M AA���h�̝��J��g}�W�Q�t�5�9�s��h2�j���~ +B��}�J�-nח���#ԁ��8�U�q �$. /ly�cȧ��Vq�̂P�]2PrxG�[q���j���q�q%.����_������Aȓܙ�H����V^��^˺�W�����N��P%g����R;��ؙ�_�HS�nO��������@D <��8Q�4aa �Xcx�@�P�DŽ���D�v�w�x�h�X�}�� Y9=��4�_n}6@(�SXZc���*V�#i܀�� C��m��-돈r�5� *���Ó�Җ�mv"`��9�hG� ��1)p�[+C� o�� 9�����ۖ�5<�Df����,󍒐^]�ph�<��@�p2�� ���jP֛Q�c�� ���e"��HG�Q�e{^��,�m +��i� �Z���&�m +� C���EC-�V�ܴ��Y��讵�S���,� E��Y�ƒ���bP%����uy��z+�zg�O`*��Z(p19�&�^@sWf������2����5�r��H�ڇϫ5����L�D��Y�~ˉ;ֲ�UP1�`e&�_��[-�;'�&� +�Q�%2��C���c׆7�����2<�"������M(�g�[0��Olܝ��h֖�s���{���:�d��jX�Ng|��_y�W�@�g�❈U�N��� yO����av &�Ӂ�M����> ��x�qfW{�H���9�Ql��x�8f&��;H�H4�X��b�?�c`�y���9G�Ÿ�"�"dS�?��^�G^���tc3���� �ab�(��"U�q��N����1���Ur$l�UOD�����NVSYڕ�P�>y�=���P���3���x��r�z-@~#�*�2l�k�Ŷ�d��&{aX\a1k����+{dSf��� ޗ���$�������*�@��E)�I��2�j��₃�h��,(*R���(1W�n��ۋ�����\�?�u��V ��c\�f�O�� �Wl�]�sk� ��J�i�G3Z�4��ѳ˽���vRe��-���S���L�����r1�vkd���+0� t�:�\�"����o[ s� ����$�!G/�À#&�Ր�P�.~ �[��;��D�|�I��8_@Y��T�Y����Wz��:��M��Y��}?�_��@q`CX�:K<�x5��,�X�IyL]Ȥ�L�򆦠����*al�լ��xS$�����v���Ҕ��%߬#E�S���/(�8��@��*::Sh�)��$'.�H7�k!͑�+~�Q�p��`�{)/B�4��\{? ��7dS�A_L�h�*�e�!v�5����xҴ�R6r@���/$�gE6vxNp���6 �Όv/�EJ��� a�F'���7g;�ᐿ�ī�� +˓{B�v�M�������ċ���#&��=�g���Y14_�B�>;��1�>�E���AђB��),m~�L~�B��H����)�=���ER��{����I� ]vL)ZN����E�#m���4��L֒�lf9�����մ|\=����e���re�i����}E���,:H�aؤ�1yj�|H����W;R�0 �s�\ 3r�M�PRpf���� ��l�A�{Y%�e[����� 7�wp햊i&5� ə\�@�'$O}xG[��‘ѹ���bµ�eX����IP:��� -s�\Zf�0Xm�q��\{�'��Y�9�2�.��g�J��]��ՑkƱ�!*,r�b�m0��ڵ�l��Bl�����o�7����3TWR9��>2i�C%^Ƭ���JI��� VW�����ċ����[��'� i7rhP�� K��4�G2r��qx�T�r�W�-�*b���S�϶����F���Ҁ��y=��B�8�qMҘL~�o�F�Ͳ2�[B4�<�q�LN���<�����%�!�{`\'�q +7�u`M�̺���-�y�6��!z��<��2� �.J��}{ݾ���Tq��$�J%n�s�+��l�Jw����兘&K�mE!�k�!�g��4|| ��9�-U�D�ߋN��q�Rr��8~>:���[�;4gG��sL8~���痧� d�Hz endstream endobj 36 0 obj <>stream +8;Z]!;%f'ju,*S]V2=UV5-MIk>WfX\M\sg'Tq) +Fpc8HdR!W^N&#]kcm_Pu$R\+VBA=reQPQAANCiC@]8'TY+f[>BbVt`7^mWc[%X#A> +`[Qe>W0;N9!5-E[N;~> endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 31 0 obj <> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 41 0 R] endobj 41 0 obj <>stream +H���uT�K�tK���KJI,��t(݋�4�K���%ҹ�H�4J#�Ғ�(H +w���q�y�y��~�3��̙g�<3���Y9El +@� ]��!O��-@���\����+BVKK ��:�OX�~�����WCa���iHKL���0�q�Y��� `�5�c����k�� +X�]�x=��� �8���� �X��Ŀ׽�>�.�f���#aP������n� �D^{y8�����  �d�p H�� st��:Y����׬cxc I�V�?S��!�:��_�����9[�YbQ�P�~�+rA +S�h�����Hh���t^�� �'0�߅�™kY�X��Y9�Yq�q�p��l�'���W����z�E����E$�%D>,��^|t*K)�%/�`���\�ҫ����:���&D ����[�7��dplDa5�|�mb���4�,�y�y��{�e��5� ������������3���⚅,t+w��h�l�������A  �� � � m k +��xYU���H�&%��Ȥ +�q��O'M�z�3�K�T�@v[NUnn^\�o�]�a�b�Tr��t�l��mE]e~U�+�j�א�Z�:�z��a�q�i�����5����};�C�S��������[�\_�ۆw�����C�a��Q�1������;>�L$Lz}4��:%8M7�l̎��Χ/�}�XT^�]�X>\�Ym[���n�!�ycsk��kƶ�ʷ;��v{���p����I�s���0���X������ݯ�3�s�󝋒�&�$��W�WW�*��)���!�$�$�%�!e$c��HNOAKIMEq�������� �����ƕ;KL�w�@��Y�X;ؚ��8^�+�Dsp����f���K�O��TC�P�p�J%���D=��+�+���O%$*������������8�I�Z�\�Z�^�U�K�_wL�������"d�x�����]�}����������>�9�=�;��s���_G�8/�̹N!G�z�[<�=��2�|B}����P�Q�z�l�H0Wc(E�e�n�|�Pds::5&8�9�y�F�T"o��d�䳔���i�/Z�K^&gd:fg����Q���l� ��kJХ�e����J�*�+��篍k�j5���U���[�ZU���h��0�|�e�m������6�]B�@�`�P�p�H�����������?QM1Msψ�*�iϛ.��Z [JY�Z)X-]��R�޸Ѻپ���w�������?��@��?��5� ǖ'v�N��g�� �� +��W������3�g����L�C#u!��M�M�M�E�vAms˔F�V�N���A���̝GL�w�A�̬,���l�l�ؿs�ݛ����n��ͽ����+���!B�²"�� 'R&k?���3�?�4+:�6o������T�\�ұڿ6���������V����ʝ�o���F?L����T;�:�>�::>�:�;��eq�vx^sa���wݥ��ʕ��'�_�E�F�O\D�K�LtAnF�F)F�|����ԭ6�\�`�@z?�m+F�;�L�wiAh�y���͖������)���M���g�w�~_ �@���ZH_XA,�"F)�%�/�*9���a�Z:�Q���,\�B^_AU񡒀2� +�*����'[j ��o5[����uR1u��h`f�m$1�xJgBdr�l�t�l�y�y�E�e$�fe�g-g#`�dGbwj��0���TOC9;��� �ܨ��ݿx�z6z�x��8��I����P��=A���!.��a�Axۑ��ϊ����}�b�G�-����ޒē����x�`�G�/����Ԝ��������q�_�O�?�0�"��������۬խЮ˯ǰı²����µŶȷ͸ӹۺ������� �0�@�R�f�zƏǦȾ����� �*�G�cЀџҿ����'�L�sٛ������F�s�����M����6����+����1����M����Z�����:�{���������T�?�~ò��~i��~L}��~cbA�~�Da�d�����~t�y�~W����~O��>~\���/~���|�~���`���C��x������}%��H}�1�X}%�z��}K���}�� {N}׋<_�~7��A�~��-ψ��|����|��Dz|+��E|[���s|���z} ��^�}w�O@�}��-�~ċ�� {G�u��{D�z�{]�Ĭ�{��f�{�Zx�|[��]�|ϕM?�}R��<}Ǝ���z��]�Yz��Hħz����|z�=��{L�Nw�{���\�|=��>�|��v|ېI�8z/�r� z�;�bz'�s�Mzd�6��zɬqv�{D�[�{��0> |;�|���y�����y��a�Iy��?y�a��zY��vzݮ�[{^��=c{Ф�I{R��*y�߄��yf���Uy`��Vy���y���uKz��Zi{ ��<�{z�%�zȎ���~+�~�}��͇}W���0}3���}HtЄ�}�Zk��}�=���~���z��ɇ������}�����!�~����Єd�*s}��Y���<9������w����p���S�w�u�����������u�VrU���W��؈|;,�뇔��{���R�s��Ѳ��������;����:�8����q)�P�CV���:4�.��8�����Ȅ���2������񡂡?�U�����p ����V�u��9S��� �����c� �b�փ����R�����.�ՁN��n�� ��U��38���8���A�/����ͬ�������δz��6�߆�ө�n1����T\�e��7݀t�XT����)�$̯̕�6�;���e�C��ʷˆ �i��mw�3��Sƀ�V7M� +�\��l�G�N��ػ�ځ��N�ā�a�5�t��N��zl�ߴ�S<��H6���*���<�a|��k�z|C�V��|�Ǎ|����|Ik���|�Ru��}26��'~2����F�-����B���*���o������������j�����Q^���@5z�I�`����ٳ��$ĝ�"�����c�ߘ���&�U����ij���|PJ�ˇv4v�y���V���G����.�2�{������������萾hS�掼O[���3��Œ�(����J��ьx�&�$�Ԟs�҉h� +~�2��gK�>�-N}�o��2ن�� N�%��է�����������>�w���֣A}⇤�\fX����M��ݘ�2,���� ��K��Ԑ�3�����g���°����[��} +�0�e��6��M �_��1�� �? ���1ӣ���Ǿ���I��^�����I|B�̯d��ܪwL���e1$���: �������r�W������]� ��1���S{��z�|di����L ���g0��\�� U��������{[���G{!����{ �ޔ`{&y�E{xbi�e{�Jr��|�/c�5}~ +~���:����f�#���������M�Kx+�C��a|�u��I~����.y�W�� ώ���әߎ���%�¡唘����[��w!�^�T`����^H��*��-����� 5�G��Ȩ�瘎��=�Π����4���r��v����_�ҍRG��f��,ދ̋������|�,���ƕ����{� �����Ҙ�t�ٕ�^��1��F�ő�,;�'��<�!���_���������Y�l�~�J���J��t�S�#]����'FA�4��+����;ۊL�P�f�&��ɔ��ޝ������ը�s@�夏]�0�E�����+:���ևSS 𧠨��jVPp,<XQ)�XVl�(Js�&�J!����K{�@B��E�. �e���WqQ䆓���~3��7���F�HI^�\�������ӡ���+j&Y���b�dML���{#�����)F���A�;q��T0��_� ^��9Iݤ�xֺ�ƢYFh�9Յ�hX;J���l�����n+j�ġ�(�m,ּJ�����(Va�V/���aؑ�@�Q~.�8_]���7]���������g�|�F�) -�/��MH�|����P��8�%�oFx��C��<��R�l� A�^����Q�l��z�rJAU�U����d*����N�$i܏� #�v b7F�*4ނ��� + ���pv�i�x֖�����I��o�����J۱�#� +���W��h�ԉ�l�"�kx wVjG�Dz���*��ߜx�W���:Ʃd��P���$�����j�4W�M��[��,]�ʫ$���W��$I�&��N���}�7¨ s������1@�9�TɎ.�E��zN�Df��*uwr ���� � *�#����,�h؅��"�8=���N� �%�=(�p���Qu�9s�Lӓ(�&��w�ھ�?��ER �AHi.R�~ Ԅ�6�����:�*tД3*���۱�x#�m?r~3��2�+�w����p���6�yXa�TO�#�� +U�¼<�_)�I�(��}��W2S�X U��w���� M��f�_T�)�����?k��YYF��K8��u;J$��þ*1T�>,��#h�%T�,�Qۥ{[��s�:��9󅼓�&^!Փ�a��@�!��" y� +��.��Jl6m�Hj�u�,b�U6�+s�� �hܸd�-ʥ�}�wi��-s�un=0�Ľ�i-_�*)U��_ˈ����b$��na+;ϧT�;p�pA7����C�4��.*�Iߥ�a�8��M��m�.���ACi���7�\j|fi������ԫ)��]ޭ�j����ʄ���U�]�3(í� �wh�J��c�h-�4x7���h׿*P0�H됎L����랇ڡu��Â������,�{�Bz}��8�v�g�g�Ҳ�d[�!XTZ�Z.��vl�A���g�� +{;S�m�`v��ؿ`~�?g�a.� +3�Ì�{����L�^�������W�����Y�e�4��]�L�7o����k����!w����I�~�Ir�a^=�C�#Z��h��`W�u}p����)��"�z�7ff&�3����$����F�����J8Ҷ5���m� +u��R�_,^V��S&�aR�~Pf��LL_Dw��*��`\�-�9]q����� �� ������T�I�6)�>u6 D�`e͢/���xq�Y%�9��ʜ�;�åO��d\˾�P�&eR�z��;�]����.�R�<o��Ρ�]�P{?�:� r̨\���ʻb �Ҥ�3|����m �s�؟���W�9����oZt]Rn��Å\�c�W�#+�n�I&�g����y��Ajs�N�06�HiD����'@����J+��a5V~�cR�I��̫�vwtU��c[3+?F|l(��i��U�����^+O�?R���s�����1�Hqil��$Wþh����=���(�RE +��1�B��vџ��n��F/�� Bs�G�����M�Y����9>�ܖ3��ȗqI�� ڣ��5����V��_�1ȣ�β��i��JiX�0�WV���H[8g��_�/��� +n3� `� ���38A.|�f|ј0I��6�b�v�%�&� ;Y��㿜�҄#�d��D.)��.p�'��3�J�12K[D�uɥ$s8�I<�R�i�m�J��8�}��f�� ���DJ�ƀ຃ws�!�ʫ���r��RX��-\y^�*�̏Ld'�雲9?) "�q��^��5�/<4��i +��Q<���� +��;/��Ա�JB"���7��t͚��,m��Xdھ^�;촞��&s�`�Y�"������Y�����{>Ɗ�.���z^48��e!��R�6}��vc����Mi�oz���o�0�'�=�~���i,3�:?-���?oS,���9���w������#��R�Oa����������;� ?������p��B���� +�֞I����O� ݟ�e#}ԯ�N$�\�l?�]�,�� ��y,��>&Р����q]�yh�0Aq��K)ĝB�F��ҍcH:��-h-�ǟc���f)�K9T��127]����q��EjL���<>h��;�|�U +��������d�p�G +ƫ�`�&!���8a��l���`83>�.��q��ɂ�n������A�9 +;� ���`��H��B�y�g��� KB���*k�㰗2fF�=#��OM�� �eT? +m��Tm���_����OBۊV��<ɆF('�n3u�G~�Ȯ#�7Њ�9��[��١`N�s�.�P..콤 'Knp��F��\�? �B>���-�����`����N��W�O�OW�B���l�f��x��W�^��b���-_�x&*/��(�j����_�=߆󑊢�zF���`�Ld��E:���SN��ʔ@S� 0���3�|T�O�Ko�k��t��o}bF���z$4���-���,�.m��'j*J���|)J�6�B������P ^�3ewܫpX���.��*��,0��7xP�ڳ�:2�X�OT�21|"7��=�0�ߴ���y}ĸB)H�[�����Fs� ��V�+���̯+Y(I���(����x&��9JAI���'tXm�y�G�=�X[8�TK�)�2����<�TSR�v�x��lȓGO�|�g�/�{�>���4��/�g�R��F�ȶ��&�A�5���2� uЯ*B<�i���0�g�r+O��A��,0���-�b�u�g[�\~�-����4:I>幃A��uF�Ǟѧ��u�D���)B�,�*�?n�` 'qQIz���K֗�4�{��B_g�6�8�#�ʉ2.A�$69�!�̒�ub1&D�3Q�x��"� >ɏn��νx�VG�&��Tۨ����Ó)�sx�d-5��Kx�����ߣD&��1���±���j�d��GjJ��|�J��{��Z��� ޲�f6�/vT�p̄ub�� ��P��mBU#g���B�g˷�)��-*�E +ar���>�>Ƶrn�[ɭ�F�-I���ByѸP�=��ĶK�UC w��G �D��}�����"��vN��.p�]�]Q��8u�Y��{�#q��C��v}sa���x_o��y�iN�r�����(� d8a�w�2C�Q�}V�8�UWO\�g���� ��\�����yk�@��d���c��Z�t���9$��u +p��-���1���z(�=�f) +�v���ě9����2� w u��煼��ת��#����{P6�+D��q3HIi����%��B�C��b�!���kc5�&U ):X�$܎���[��b�2�*@�PkcӘ�d�oT�B_L1Uwi"�)��=�2#���pI9,�R�O>�T@>�;�bn�����D��PuC����fk���^�^��\��G~� ��o�L�Rc�Hqܮ=-8^5Oń�y*9��:-\�g8:T<��?*����C;��[���y�X���+����I�;��lRL߭�$D��vY�TQ6�Dy��Vm��fy%/sIs��mXP1�Lռȭ����vow)�QB�b����_L�V�wu�p����eė���O*��|�+�]�(uH�װ4�W�U��.�{ �4�\�m.Q��w�����R~MAi���Rz+%�B����K��z�?'�{���� k�҉�a��a�{���H]��sX}d����a~�3��_�au���Qz� ��������VM\ĵv5I0�L�M�)�DŽ�p���1��:5���,�&����4�� %���!$}o���c��ޤ�A�]R^x���T◬M&/B�:D�wA��2�4�����?�c�d&g]5�b���4���a?������i�ǐ�� ��Ĉ��.OA 6�vfv�s�d��(5yT��H���/P��=�(�a��;zUs� �b�W��x�Da�)E�ʼ� $�sg�PJ�r�e�Y�3�w��`�c��F�o�0|U[j5k��.�5�J��&�����e�T��o�r ��È´��}I l�p�jC���8c���5�J=g�%U��o�|L5��8E" +ِ���[Ak]�����J��͆�VB�M�"{�N�r�����Q���ihЦ@�Y?��6��^߫ZWٯ�]ذ���c؋h�KSLj:>�O ɲ���.���ݰ��Q�{5mm<ٷ?^�v"��}�ъw��9��O��&�v��X�7�km[ �,70nΒ7|��e��P��\I;<��u�^`u�!��$P����B +ET9��ٲF��W��c����m$��="G +}K�e��6�~֔G_���M�DԿ�s`� g�]�v�p-9�\N��d{:�:�gv�H�_3fC;}�Ɠ P���N���p�H���d�U9u�;���9$8w�� ���3�r�#�A�F�iD1�n�����-}��t�e����D��H�!5$��,I�Q:�ȖR���1�3��<�7�� �j�1�[�ЊT��m���WwzU�x��|����վ+ք{������W��>��p���:ʤ�JRqY���^���`ǯ�<�~�j��!m�r.�B�+��'���OyY+��fN*żt �W�$��W\�2����M_�c[�g������jj�%WuU{{�,_��p�W��n%}P�I^�W�|nˆ;c!�p���u�cʨ�N!k#���)k��sd��5n�Ž�6Q{H10���U� +���-�"{⠇TZG �R�,��ɇjࣶZw8j ICF���:�b [ �\+�?� +���oA n'a + +��O�j0���`�%��|�^�/si�_�Xǣ�Lqi�w]�I�έ�D"J���!y�!�Զ�n��0�R� z�WC��c�c�h���ūK�_R [��*)! OSo��u���Oշ�܌W���ze�W�C���a�����ϝ�L���/�QB�o�_��k�/cg���&MV?��֫5z�� !g����"?w��P͚�I�Q"����P�AdtE)q4��j���G�s���n�{"� ���}e��UM�rk��zvi89C}���X�LB1W�".ꕝ^M �����t?WK�L�w�DP]t�U�揊1r�J���ոK��V����GM;ph�շm� �v>��-wg����FN� ��cI�P�#q��W�����I ��;�N�ٶ��A�)���H~�7i� t�hl�~��~dz�Y� C����x�2>*c&�m�b����{9f�1X*�L�� �#>��� + V@���g蒼]7n249=M����K% �;��,����F�\j� �1��kl�Z�i���؊������ΐ�.|Q��9��а�$_.!��;�̿�l���E�,����ɥDi�������}D��3^�a`Y5�g{J=m��ɳ���y�3���C�M'�jM�-i�Ц�m�� �n5? �SJ�E+U~ �;����q.t�Xd���~���~p*Q�eS��%�.��Ћ�"ư��Bs���Z�6-�����6[\d;�^z4�`;64藸����ͱw���;����|�+&�A�f�LU��3���X�T��m�����)l�F�'l �V��ɺ�gcG�Ob�bɜ9�;v \�C��L,� >B?�KGC��e"�z -@��E�����H���ILp<�5������'��҉�����$>��8#�g�L�2�m� ��c�����1 ��c� ��F�w)�P��+�r�kC q�p/��u8#�!�*g��°�Pa�`v�u��@��o�H�`"Ž��:�z���_��Q<,D�>'Ӆ��WP��� .����`�x�W��3�|!6�� � +�5��� El�["�,0� e���[Oz��0~l�U�O��+����&x��kP��c|u��$k�.�?�{Qp""k������r�6��isV�a���=~�@�W�_� +.<�7� +��2�#h?c~�m'r��E�_�xs��6����a��������G�+���K 1��4���L^kUp�^^��_��m�S^d�Ш���'����>���}��5�����$:τ!E��[�b�Jx&�n� t�(��m�;Z��s�F5u�q�X�.�Ղ�BqKP��� *�����l���%{�ٓ{�'��f';�,TT,�b���h�Uq�2Z���3���;�}�����T9�vw��R�R;GD� + K�*��/@hUv������$�j�!�@� �vyבm���,W�|-͢ �^� �~�D�_��􆭍�"��ĉ�����#c�禘�*�X/��Ϝ�e>�|�XH��;�:��)���d9gƖ�4�aB����Q4�E��w�,C +ۯB�U�#�>�SV�$L�-��5g�V ϯ*�B����#��}� np�þ�td�����U�$D�b&$^�\^�&Z"/˺+�-}��%�Z���:}��9���A��Yu�� ��rT�lP0�"���~! �͚*@5K�?�߫Z�-�P������=j��>��܈�[��O?)�a5� +�����?��W���Us����y�5^(ge�${C����m>� "���G�գ+�$�踿��ϫ&�� Xw��������8?��g��,'ō�=�"����/x����N����M)���'��������EF��q�rf� CįQ9ZY�$r!���6m�)�4� ��V�9�k�J�$#�� Fь�X��٥�C��p�[��ģ)C���S�;rFP#�I�m�K�G<��h/��U�-,C��O� kOK�YY�;�MH-�t��%�^N��ξ�B���7" +���O�aj��X�_84�V(N��-{D)��F�0�$�!�o�J��d�v/_��(�ǀ��U�H8�B�c�1����f�b5u��&�*�ҽ�n�2s���G4 0:�\=Y2�߯ �$bi�8亵M�$ҙ:ut�N�)��Eh��Dh��d�j�21|�*T��V�˰���T�5ȮM7-�^��S���84Te��hRҨj�[�U�G��U���1���K{�Nh6v�g֨�+��G?���` lݔ$Rq-�.ަ2��S�e�8pSՖ�k!�X��C�\�z0�0 nlh��j�<~I�����,K���r�L�)�IM����9M �_���c+"vҜݤ�L���$>ɺ��z���j>>��X�9,�ZL-j��Ib�k��ȉ8�˚?v�t�����x������P�IO}�_ay@��:����|Ve�6�����ubd/e�3<֭�z�t��e�a��'�c�LaM +�lz&,f^�_!��?�l����2x2�X�y���ń�3D����)�\?�y�e� ~��4��O�+9$� � +���E�V�D<�O0�Vbj&��mLB�2Z܈�b9��U��;n���6L0 �+��oˇCr�E.~�>T�Sؓ�7X����?MM�!���Լu�O��t����P Cbt;���i����ް��a��@gW��#�@��4c�9.D���o� z2>M�5��i�~�u0� �q�s�wQ�9�ǸLt��삟�Mz)>���kɝ���I�;���io�"���U)��]$Y���L >�$����$T����:gUo$���UK���,�C�`sCMAJMÄ��K��C(��g]���ٮ9�s�U�G�0?����L�5����QM%��0O�l��5&���`�Ƒ1,��x�'���{��k+�mY�}����-J�s#\��d���:�i/�N�K�����\8�H�����stQ#��-�ND�)�.s*�Z���y�m�n�f����\�1l����{��(E�=�VGW��9��s�:��?���w���ǟ�Q�Z�sC��6��A�1���ƃ��6K�@�8��O�UY�^��`���7��������j6�@�9?,y����t4&�}"�T��- +�\Y&k���V��x�녣3��9��1ٵqQ�=�b�eMq\��������`/nņ|���2��͌Jkz�D�mͫ�IR4�\~5Nl��օ���KɁZ]T�C�3�l�̅��D�3jSS�)�t��Ww$IX�[�w�V�� +WT���U�w^P�eU����h�WE�^ؓ~W�c�h���s �s��I��g�����`��w��g�s (�5�����mr�����] �� �B`7Jf�A����aA�3Ɠ��G�����?{�O[ �?�x�j�/����Z�*7�e�x��X�z� Ά��})��C���?`��K�c�M����Ռ��&)����Y�5����J]q':]$�؞�]Yv x�(�����ı��H1��e�U����>�_0�b�?*񸨎�b����¤،������D���;W�xm]|N�7U��13*�;��.�=��>���S�Üj)��CM��>��.��e�I����1���/�Q�v�Н���6T�kk+�Ɯn\\�F�F���V#���Xd���e�&~�WE��7�"�bj����u��^I@�j@�bQ� W��k��8���w��_�D ��^��z���� x�Z�KA �_`�T}�] +x�}�Ё�M0S�,r����V+ K��O&�ƈ�`�;�E{irf0F�]�� w86f� ����fm_8���c3����V�<)�r1��p���� +h��s|p��!Q��P'�Ղ��ʛ����2�r�Ӥe��j4Y� r���, �r�?4�! U��q�]f�(��*&umM+�;�1� +-���c�8�C���j�L=L��1�TDJ���7���>����)BH�*�c�HY}~�xI,{��7��W����jW�ާ�ʇ��h�g�_���Yov�MKi��N>��� Q��R���ǧ}��A��Q�j^��G �s��yJG"�?txt,L��>�֍p��_��>�Po$��^<�%}���K�D��S4� +�*S�<ܖ�y�d;���éIJ��~J�M�n>��ȸcI6��u���ɖژ��䩊i77�_�5W�2' 9��t�^}/��8%wd���0k��)��ͦ�F9����k����ih��3�Sh��PB�U�Lz��s���'0�$Y�/L3����o�����l���|��f �ɪ\AW#�si��S�-�O^�I��+�3��6���xas�� ���@M�� +�A h��m�4�5V�-��' ѵ�1���S+ �� ~*��%~k���˝��ʉl �*� +�lك�=�3���_2~���OgP��s +�C�����c���d���[�a�ے{<Х��j�A {! ߲ۓ���;O'��9+wEH�E�����&�J��V�?f�iӺ j0�5瀶bhW�Zx�o=��ƺ 0���z���hK5�m���o��v (Y�Ou����t�;���e=��R�*��yMV�n�,�$v:��Q�ڳE��.�y�Vl�;��svn��,��Wi.[�����@�����34S��D_!���M���F�>J柣ND ��@$�Y�~�-����C�Mu (+lBpБ��^��#$�~�2è /@̣�6 3�n�h� +�;������۪.��������3F��q3��\َv�Zn�Z"/��vNF����N�J2V{�#ΚV�s����e_쑮�T��a�8C¢�!Η��>F��L��\��M{���5��eH~7;F�� � �A���������B?���V���Y�=۩��Q i9�J.sӿc%��FVb�dեiL��`�a)kD���=W���������� \n����e�>�N�X7Ƒ†2I��Yf-�to7���/�~��U��as[��`W��*v3_�`~����:k����j�R("�E +*��� +��e)DDI��ss��,�f_n6�"���:hm�h+�]Aqñ��Qq��S�a����9�{~8�|�~b�h6�G���ZĠםN\�h��+��(E3�0�~�������k��T�MG�β����1�:zk�a'L��G�����2�>����,gt ���X&�@�?e%� +�����=@��Ih�s����)H��U�OeX^m��7R7�~�,���,� �\j�����J�Ԍf�ͬ�����8!*�]�JR:��W�R�]�M�ɚ� �P��Z��;��J�N�.8ɦ������,�[�r*�Α�]M��M"wa�X)Lbjd�`�>:�?����|:?u��>^��G���$��fa��.� +ʥ_��S��%�ED�8� �J��=�ĕK���{�����6r z�G��G�� ��� ��U�i�<����K�g��"���^ �q� +����I6����vP����W�y^,��u�c/5��@�:ǹ+[��N��+�l�i�{��P�#^��y����v�,ñ������-��N���ѳH�⺣<֡g�x���V�</���nb���6���󴳜�Ρ �+nhB˾�P��oT(�W��#�#ĉTw�ZU} � w-��v��T����-9O᭺HI�z)����� �z�9��R'�d�I5��a��Z��GS˟�ag��W=��.�P1ٜ y?����2����X�)r�4VaG������X����Be�`9�Q1��͚@8�5�����������$���W?�D�}��z��2�*� +�����p�t� +����;Br\ܕ�'> ���-��v��C�Neʔ�����L-ʌ�q��K�H���r �7�I� d<�����B�gNelB^փRγF2��A�qCR�&�t����7߄��{" D9����u)��C��w���1��t�}?"���'�[�7o�̩�~�1�{�>R�u*� ��ʖd�C��l���u�tqf�2[�l�~{S4�>�J$����.nQ�nl�P�#�x��])By`r+��w����LH?����VD:�|��iU�G��~ժ�+��&+R��b� gP��>��}������W�Թ�k�Qǖ]WSkq�w���Z +�D�Q���d����V���d�24����K�G�M�v���U35��K�J~�4&j��w�J�����*��y�;��X�߉˔��O���@��5�hw)�񘴕�o�-9E:��_��̂�o����&�6#�V��(ѽS�-te$ �פp}�4�%�4m�rn�z����he4�KX*��KÃ����2�9�ʩ�~���'Ǥ�l|O5ÍB� +�;�^��j�㛑Q�`�exH��;�J�\*�`l���˴K�h��k +&����t���F|(��8Vǡ�ܷ�R���:ϳ��o�G*UjSKk��nR���gl� ��ޅ-�6���&��Nŗ������7O�4��rGm��O[du_T��vY�{� ̏Iy�\�aR�Ky��&�P�7ݪJ)�l���"�W�5�{K�� ���S_����j0WSW;�w�ix��F1�^l�О伴^�'�1���b�%�OA�����X�hq)L�7��j�}=�9PX��=��n��`��ɗKX#Cù�A *7{� �j��WܴT�By�����ufכ���d=�A��f��]����F���=�_u*`�q������+�_i݋\�^`BaE�|�S&����%Z� �a�8����+Q��g�Q�[�IK��-�j��IKr2T�cju�=A �ʧ�Q�"7��{ٮ���ם*�X|,Y����z����ѽ�����}�ƈf:�jCo[>�]��x^���h����lhNr�ϳEDk��c�C���Ǫ ת9��c ���H�t<)��}�z��!�hE~DBӳ�2�S͆��i{;�o��u��I��p�??砃4�6ٺ��^"������1�R������<�-��65s��j�p�C�����Sjqi6dzھİ�紈�� 4�1�.��$�5E�G�9���:��=��o���b��쾄 v#��[��x�ﯦ�AF�+T��������(C@RQF��7�7�2��I$��^a$�Eq��>�.�AE��b����i����O0�����]Т�K5ΫPÛ�G��� ��� ����Z�d��J���*�$d���� ^�}E�*֤�>?��������Ƅ��������$d��O��� �_t�l�%��$^7��[�K��S��ECq�z�"$]�*���B]��}��W� zT[Rk�"�����n�]�E��U�Yv��FU�W\�B��6�-RB�^M��e�2B�4���/w�ͺ�h�4E��k�5˖�<1�U���[�t���D��>�Q!�.kR��涧�7�u�J��c�>�c�� +l���/��i^��3;i�����ڐ�0��s����Ā��Z�n�S� +���q�W7�N��p:�([���5�6�8���V�i�AFޜ�~h�9�P�ldüj�2�dO +�+����6��1�--��1E���wv�� �=JCH��W�3��4܏&�x��8,���&�����#Rc�3D�vz�6��RS��yu�_N/nm�ك��vT����֥Y˼?��RFװKz�n��9����Q��4�g�C�^�5l`�P\ܲ����G�&���ޫ`�� ��9�P����ҞٲX���r�6��� +V4,��{�a�؄���\tcY`]l�ǿԾ�a���r�鴯؏=b��!��&����Y�b �^[\�aYt�$w +���[��R�)���i��[�{$��7f"��o ���X��p +��z�Bz����'h�O|Ō4ǐ�|-�j�� +:���}̴a�%Tv��5��Y9QK� �d0 ?�$��ćH|�#�u�D�3� p��h���r�d�@,@Xm��VKY��@o��u��([���8#!OM~�.�7SoJn%<��I��dZ��=�1�D3�!P#4����(|:]SYd���_��kG�����Rh�+Ot�B���%�/e�䱖�&]�h��r5�sl�or��Q����"F�,bՓ�*2~��:ʼ��i��[�������t��˦����~M +�U�6�DU�e�"udPO:���]�x+����G��B���]��q:�ʥ�'�:�-ML3\�F$�7�K�3�C��*s�2��z�F�s�'�Ô��� � �̼K���s�����Ӛ��w�ER�� �!`%aT��H��v�R�W��SP�ƅT���}FVArB�[��SS &��}p�`� �~����_���1{�,y��o��������{�30��[�b� K���:w�3��Mn����e6�sz/0OG�" +Ü3N��|���/�'��O��-R_�1Vh&׺ N�Pz8de��� 勊ZTH;X����Q�6�}��+���'h��_�|ȋ��Cc�����u��H��j�BA�,�N�OS���{�3��� L���`]���1��> A��� ��rxӴ�*E^�.��ؐ`����Q5 �v{`=W6뼟�\9a����vGO��Xc& v��1���w�~����0�W�:ʎ~��f��: 0�/˵��%�m �KRK�A�������c�R�%� �P�#CS��ߥ�f�mD�5�oEx��1�7B����0����<&������Yd�8"1��wܡ5�� TaaJ3p��5����7�A>��+��y��I��M���c�u�� Zd?�B��k1���x-���r�sV��9s�H6p]D�G�g�O| y��5�S�$a�E�`$�Ls +[��Ym� �~u�8��p`6*I ߕ�`S8���8s�n��9O3nX�OE /7f�^�l�bN�[�PB�F�O��.�9����Z��_.�5�>�F �� �S��̉�R�'}ΪѬ`_d�X�|�{�d��HXԾ3�QlZe7P�R��q�ش�O5����OkZ��r�x5u`aǂ:��*`�T�)��,� +DPQʮ���dߓ�����J�����Rk=H+ +*�#u)���h��) ��)B�6��s�9߹瞏��H�ZG�z�G���T�"9��3h�D�ͺ ��s��r|��b�4��y �$��TK ���"�$��I��~�$�v(�B��#].��qi��?�C��N �����~�ޱ�|��ܷ�LcO�n���T~������vxj��̦5<.��f\K<��2p�:Cp���S�y,66��>|z�C +����E +T)��f/��:X1�}J+��>���_���~���Q;�^��ㆪvs&�۸>�.�k�7��yZ��S��:�˩㜍�r�ݖۜ���aKa���!l��.g5���7�Kv�0��!;ڗ�f����e� ��%�]"X�T� �J3�aժ�lwV�j=v�姠�α���e=b�I/��g�H&��� �:����g,(y 27�>a�b�a�8���8f��VV�q��ɌT���0��N���������ɉB�����`( �_"f��o!� �t}Wg��_0}H���X �9�,�Q���x���=�~Jٹ�x�>�����ӱe�9�M���2mF��S��)�Vk����-eZF�F٥bt�g0��O?�D��ǐ%7ey��ښ6��W��S��C��y�e��US}��l�`a�8i ��g"1лJ�"�|P�Kڝ�c�,��$����+�&���P����vꖴGBoj_t4I �vq�f熚(�e��C��!��b�׼�^�S��b�Yi1���¨;2��W�`/7u�h?4 +����!��z��@#(���T ���6�� ^��!�R S��#�>E/�S�q9�z_ /G%ӈ0C�9�[ۼ�@�(٩��P�� �,�}��X�T�Ok��p��QȫU�G6 �� �x�2�e,��>��� -?�ϭ��QެYz�/�T���5�FL��^`�tީ��3�\#�������̬D�:�,�v���w[mDW�����)��TB��Z���`0Ֆ`3t�BQ˟kk��s4�1y� �`�\�޸�c�V�#��z`X�Hhw�A��0�چFTy��qӵܫ*F˪�%��*����/>�9 +�gS'�"b'zL=N�)c��s�*����b�R�����)W<�#�S ��癛)K���� �� +&����L�\��9W�t�W!Y1�������7i*�%�����wJ_���� ��閥�n�WJ�!p�����-0�T`�:K6B�+��S��z�l��L,~��J#ZL�HBEe�߈E�q1 +ڸ��TD}�bB;��*O�TC�nՍl�$OY��Q��0m��z7�o��9NŻ�|h��DV�[V��e�֩b7���Y��ZÖ�H��l�����~I�)ܻ�J�5�����oO��ݑ���%(��,�h�Z��G��ҼmR�d���!��/NEWutV57z;�j���j��s���^�^lD�Ǿ0-a���_a��L�؁��w���44簍b^��ppi������&n�X� ����uƻ-�݂ �-c�Y4��_�������g ?�j�G�I�fH��� �%��J҂[��%ϩ�C6OzvW�z��oZ�t�A����$�?z���;��ؼ���FT2�/+��0���@��@S<@>0b��S�uq�w;j4S�'�/4s����E�թ(P[����V�^�5ƊH��k�g/�ۄ�w���� 0��*��֭ �a�j�yB��5�TC� �J(�_��F�4����!�m�, R��N� �?S����9�� :״��O��f��O�V��"յڇ1���,V)S��@�._ +���#��Q�`�K���|ͨ%c�j��/&\��: [��F�t�^Z"��q�٤Jm�뙊jMarח�`VCg +��w"�~><�� �8�i����}�X�T8�dzQ��VY<��<�J=��E�ۏ7G8v6��Z:�%���hBò�94^�ԥm!1���OD>�p%�H���G�����/�Û`rq�;��N�m�~M���s�\��/���Z�h�:�(�����MX�а^F�.꜋�.�Y����s}5�`a����(�(X0�T�+JS�� �4�&��~��|iB!! !)$�)ʰ�� ��WF�Y]E��븎3x,��˽�}���|d��c� +��|�i-��0�Ws�� +Q_G�pRj�y�0���׿�t����j��T̎�ԍ�D1��څ�ڍ›N�:ka? ���7�e���k��_�%]a;�ז���F�=�9��-b= &��Mm0-�vD�'^�j��+��/5(er�^�+E��L F1�$�1K���WE|f��O��FMK�����m��:�:1`�ڥf��X�ЩM�*i�9�� +l?+Lw?-Nx��͈��wɳ\C0���瑃f �s����M;iđ`��$����O���0z��*Rٹ�B9�@�"�k��5�����v��~�.l�B?�ug�]�ed�����8J�A�j���͹um�.��D�O��^^��v:�y;��ske��+,L�¶v���ŝ���Ҽ��خ�����d��_��5�Z����;q�#�k>���� �MU\��J����{l*͟��ґ�3Do����y����"UDc�����u��#H�)BP��it��/ v�`�_�Sʝ�{�e�5mp�Ppy�=�-2��[���m�+v��6*.�Wۿ��Sǔ��]� +^DMk��,2�.#��ɲ�\���!{�^��I4�Ԉ��.~�ç�lDc�BU\b�"c �j��v�����J�G�|�H`_��2�r�������H��ѥ� ��t��HH���BaG� :����B�f��{�'�9 +[�j��aЧ��e +&h��z6F�d�y?�>g�ۑx&�l$����^���:����^���n����x-'-����]�O 5�������@S� U��ڏy]�Tu �_,z��WPT�|BJ,ɕ}`8�ߴy?p�7gˢu��\JO(_��vOUue4���+Q����bi�?A.j����Cxy���R���J�駥�P��t㸲r��T��fd�d$ֺ�FR>P�a�L���'���v�����2M���*��׵�T�]`W��*�cD�*��h�A�e#�"�ɆKO9�J���KL��2��J����( KgK3jԉf��Z��nL��5��o��M(�_���>�FO����ӹGi}<���@w��#Nd����hoo4�Y� ̾�Fٸ2�����Y�A��z$�W��֜5��Copl�i��\� ���3�2�l�;��a�<;�S�?B�>��z��pr�j��s�m��1t�Z�c̥��{�s�/���J{��c�*�#�3��ހf�ϡne���h��-�>Bc9SJ���"�չO8�'�8ހ `yH�Ϥu�-�*`�� x[c')Oy����\x!�Q���S9q*;�$;�d'=�NY�� ,|ܶ3�4�����q�T�=�ka%���h�s��䬺��U�X7Fl��[�� o��1a�puxf�9��Q�Gk4�;e +˸�7荇�5��xB:�y����Zd�ͫ,�`2��?_�a[0�~9iY Fs�3���g�� �Ë9u����<,yx�87��� �1�����Ja���,O�@/g���O�㔛�9�4 �|.]�1�6��'�^��@1'��p:Xt�������wL,j��V���Qv@�wl{έ��̱���\�?R^�UV�\�GI�+�����9�����D�0���3o��y�d�[R<�"�"��" +.��2�}��"!<�4t�H~(��-r��2��5D�H@��l��"K�����濣,��/S}�������"+���~w�������F}V dR�z�,��:�w&?��C~Fq��J}Jݢ�����J��i���rjzE�gU�#��p]ZF���%��+���[�Pje�w�Vjl���W�7��wR��/*��C%�%�j��G�x� @EFH)&0_����Օ�|Xu� +D���RNXA�\0JS���H���30��7�͛7�3 C�Wc+��U#�r# aQOL4E�љ?�s~�{���s�I���y�?�y>�ҒL��ָKd-ޣJ1�v�*fH �6���h�����z�+~B�O�:I��Qq�Z��UՍ�P�[�U��D#�BM� ��>$� �z|��?��^�������!J0��W8�N� ��W�zX��f���щ@'h��<� +%sd�R۔e�[�$z�,��Z�2�H5����[&Ht L��� ��U�O� 췯�<�u��ɎrE�ᾀ{i�,8+ןwM2��O��\��7I8��i�l�2�ewkv"9k�r6±��U\�R��*�q��o�GCxxy���;�:j��Y�E)a���ΰ!Xid�j�� q(���8�S��=���l�(�P��9Iue�&��k)���W1����=k��Z�b;8�zB�C�����4��ڕa�v��?�su��UuP���\Vf�>+�5�2��j&�P�6���uR�ɮ�! +a�+�r���k�!�o�4 ���`��ܗ�P)f��%��V��Q�T��F�(Z�]s���,��TR�|O)O?��h�o�# ]�6y�л�)��O�U�,F��٠����E})�g�s��ٴG�y�Ҙp/kw~˖��I'Y��;Td��g�Y�U���'��I8�@F�*�� �8 $�I���+A2((�+y�8O��ϋW��ȗE�� {բ�b�W�"@�}@�C׌�t�e�Y��gv�ֈ���H���o�fE`�ea��gbN�_�����4�!/�e%����O;m���ht��Wv6�������[���i���������yF�y���4ʔa�t V�]�� au��� �#������Q�Ym3rM�/q{�~��tj��D�� �7���f�i���ɷ ������� �. =[�n`4���qSh��B�r�x_�5wԐ �%��n�Q����~x�'G[ �`+qb�]Q�2Ը�i�=UGn�~���ڋJ�(�����Aݪ��d�� ���E�7��K�z +M��]������!}�� j�nh-Cզ_�魺��������a�٭�D�fr�j�6�$-�4�n�U�Z�F)�Zp��ux'�@��]U���/�ٳ�ۿ�3�Ug`iU�}��ڰ��U�L��W���u����+��S��U��[���;u��������XJP�v��O�ŀ��{$�KF�,q�Q���r�u��H��.���}i�m����fZ�h~a���t���M����B�b0*��iW���C䶧���jZ��m��n��[nKfi �c�+.�&oV.��&ʭ��{���5�_�s�9�d�m��I�A. �*s�5: �1���Ů� m!�|f���l'�6#N� +Z��>���\�oM�k�CZ8�)*���bEE@��(2���7{�I�" $!��0a�=+vU�ZŁ`-x�E���JUǺ +����~��~�7�T�S�s��V6�������i�1=�2J眆Jh�@ U���u�;��7!�0 +߽�\�醮���������%-;��=.��e�/�T�7D�$v�{�.ʫ�����|�Z�Ѯ�mcDֲ+-C��u�_��{�>�1�H�1]�"�D^n�R� �ٺ�:����E3�[�h9������� ��7�TJOW+3 v�œ�Limc @�6'��[�c�`Ǧ8v���!���b�R�{��1�_ӵ��u���o��P��E�2��\@;4"�mO�� �����m{�� ߺE1�d��A����}C=W����B�}[3']\PJ�G5�V��mnY�G Xy�ahd�'J�[U~ v��W�ۅWo�]�Wn�G�n�R���9H7�Ѩ��Au �1�v�����Zm�]lU�r��T�V�A +sj�6l�hm,M��y�4A����*0����v�J��R�?�� �Ĵ>���2C!*�#�q0�MJ!:ŏ�C�����R�|�d�F�a?��2�݂�c�h3��dB��z��SI�t?�%�L��m��F[�A��x�Y�G�ҏ0m�;GY1űh%[�sጒ@�9� q��_8�G>r� �W�n���)jod�E��z�C�.q�JviN&�If���8b��g� +� �v|�s��d��%:uT���f�����&�L��0���~�p����.(R���U +; _)�w%$��/�� �t#� +~�#�u`u[�w�.��q�s����Y��_�-����*'̳ɩ��k/���)2* i�9��$�7fU�z�fl���c�9}�]��,툏WYC�I���kS�-��t�y7>�T!������ ���26�����Kݲ�� m�&c��ӣh����' �..+�upC�6�&@j�5�t���d�����P��0����=��I�˂Ė���� +�C�{޶$tR:(ϭuO��R4����$=��jl����uq�1?פ��9��S�i|c��q�F!�_z^�S��K}��`�d�%D�T �wV�>�;�<�'�V=�(�5H�%j���WM��V�#��9�Y�D2��֓��p~�����~J ��}�D�]�gN�S�s�jJm�n-�>,v�g&S�L�l�#�����>���^�i���8��ʞ��%��4'��R��JD��h�RN0hB�A0�(r�0K+�a�������M��Y��|"�E�G����E_R^�v���4�/�?��m[˨�y�N`�K/5[�7�1���[G�ؒ'� '�铯R�G��hqꭁ�]��>���iI��X� +5�'�\�GB� ��ć����d�^u��x�+���[�^��%e�� �֪�p��xE�� +� �6�%!It�ި@�Ҿ#%�� ����:��*�h$r��7ש�ׁ�55�׈��Ց'I�+6��*ЮwȰ��%U�#��zD�+J�t�� �B�a�Uؕ 6����}��uO�r��7��d����P���� �Cu}FEu�a7�RV�"KS����T���20 E���N�{��^��lk��ƕ$vW��(�,�F7��b ˢÞ��O���y����<"_��)���.k�h���[n �9W�?g��ڈ7��yș�*����Ӽ�uA@ �Op��I�R��rP�(�$e[i<�H����������/�\�t�/��G�inQ��a�@��q�I�a�{�Yʒ�]��e��?D��98ߙ����y��dx,�8�?����Pe�1�N�W��wA�i�N,� B��=�%P�K����~�҈�G�!Oʽ��R=e�"!�]:�:B�I�\��MJ1�j�G�K)b 'xL"W?D\G�ԝC��{���A�A ?u#U���������UJ����ǹ� H{�F[�5h���[N6��){((��%��>�V�Y�R +n��#����(a����F�q�&mq�3%�\g?�%�ӆ��M5������X�D3�b$ʁW�� ����ƿ��5&͔D4�®K���c��Ꮚ �. +��1Z�o +^`��~¿`�6z �q��� ��aX����ǰ�)��Ӽ܄'��84� n"Db.�����yC<K��� d��},��{�*h� +ڸ�h�>���wMv^ c��8�Iƻ�(~��j?��� +e�o��y��l/��Dl5�����Żר�p�y1���ܣܵ�����^004�{ �����.��%C�A2��2�d�Wu�����Q�>�o�kL<������5.ſȠi�f��fh�7S��-��|�^����T�jX[�wC�Y�*��sG^1�Ve֗�+�˃������L���3� ��/2y���{�����+�.�;C�t��J �}�� ���-��>٫y6q<���� ���W���x�A�_P�Z�? �Q ��y�����1�>y��K���\.�!�O�q�M�� +0C�l����];�S�k)��=RZ@�[ɷ�5�����JBe�ǐ$��Ni"�0 -�ú�R4H��~�9.☫|Dϸah��-�)�r�~"��e�oM��������K�%4 _7�"�‘e� +QD~�0T��.��>"x*�O�>�酧��.Ey+HVy55R���Ws�����Ek*�PxEGB����;(J� X��(8h�iq�mh��^� �0`���}���_APW�D���L��Z�‹]�<��4��zG֦`��oy��Z�R|�u^��g��C�F#�n�r)��Va��5�ƪw�����9��n�j�yI���t�� +xI��1b�Iy�>}���-A��گ����OSh��KF�x���6xq�qQ +�3��S�U���\ka��椚̩�Di�~ �?{�>���J�3m�tߐ��Z���t����]�Y���N�ju]�ɒ���QY�lZZ�s��NѴѷ���W�>S���ݥ0�B��j������+�7��q�҄fU7���m� �����:�8���^�;�#�eտ�+���*,�_����C�Y�3����M���S��U*���L�X�.jQ�Ȗg�_I��W�J5a"9R��'�C�\y׳qH)��V�U��-Z��.�\+�Ѥ�/�a��en�/|F�[��?S��Pkr�"� +^�Y��>����V�H9 &ya���I��x�Q�<�zU1\��� +ٽ�l�*7�}���hu;Twfa^���cn����YS q;)oZ�u�G!�uT�U�Or����lk;�H�F�-�x/,u� s�m��>fd��}�+] +U�.o�.����=��q�-y�]�[��v�i�R����g���k*�`/p����LBu���+��A����@��[�)��&P���YQ�?���i�m/��K,�Y*g�u��(i�2�`��؀V�"f��JSs��=�RU@���7+���>d��ْ���s�m�Y���)�w�=U?ο��3D����� qjv��8<��!zg�)�b���^�[$z�RYjT����)�Ԭ1�c�?M�2q�=�@��?��ܣ5�ew?SIf�q���D7���� k�\�L�24A<D1` (T@@+���7{��d�I؁ 3*8����:@-�m��q�*���8r����><�u���ݹ�\��id��Xm�m��J����J������"��U��jb'm_�z$b�"�uO����b�M��q_'�is��ͼ?M#mp_=~m��=�İ���+ȡ�:�L��;48l��mb�3�埒-m�$�Y|H��n��]�c�k�k{>3�׽} ��1�r�@v��y:{�Eͩԡ.�޸�,珈��~�CH{k�s�v�_l�毁@��"�l�OR�."0���Fl�]]C���˧�������M��f���i n�q��˶Q���{�5�����6e�f� e l��[I��u��Y_(i��&;����t��o��� ������5��k������Z���/�� j���j��p��~Ch��⨿���䦿�iR�s!G�-�����֠���5���� �� +�����&w���a7W��AƫX���U����r�8��+}E)�oV�ӃIÌ}�qZl��h�<�gw� +���A��?�=��$�6-�ޡ|,)!<�*�ǘ*z!���8�߀ϸu��Pp��D|�Ŝ�e�=s�m4'���Ң�ؽ�YaP�OZ(���vj?�VG�gxI=V��-�̹��u�MCJ���H_�-C�]����B~�2A\�8����*�E8P�T��Δ�To� 9/�w���h������������a�ߣ�b�y\��'�F,Ռ�o%��w�U/�ժ���n�M�*��T Ƌ{�5NJ����ԢT�9L��;y _fX�D\���u��ַA���:x�"�)�V%�V/*��]1���# ���)ԋ���@�X�"�SV�Ӆ����4u�.�f�?��Uչk�%��Nj����;c�~?�]Pۺ˄�W��Ҍ=V�듍�1� +E� �ֻqd{q�׉�;� +�N���������YH�d�fttc� ���#&�v�P�tQ��jd����1�o� ��­�R)�ʽ@}����<7� �&���8�w��y�y�b��H��04���͂@>�o` �����~�M�<��a9����(��n����c9̼4��<o��/��E1�������:��ɕ��7e�� �.{��Շ�Pi WE�Y���x�ޝr�� +�EJ�7�T����|4��'�r41������� n�s��#?�Cśhk�6�/ϻ����7�n � ��HIT�����c6�߱=�zz!�?z��_)��c�)�u�e�T��}nS�3��&iq4r����E�U�Y�X\�K���88IX�`}7yIi�� +��S��iG���r3�8Eiօ�$f ����l+n��.���*d}0Qe��:F����S��S�퍆���֯�SȺ�8��~�%;[ژ�l0~{��^�� KbV+�T �sI��x)�oe���q��ra5),k�xU����Q"��YN�פ����ܾWu8G�Q�d�!H�9��2�'���31c�C\��!Q-�;U���9� �d�Z�o�8C�N�T1+�hڟl-?63��z�,�=]���Aw7!�z6��*H��H*[|C���_@m���s2U�r]^9��n������0�"��PuT�t$�#:H���@�бjy�b��~�=�噛��*��ku��U��Q�m�9�]'pu �����d��SۖHgi۬��6r-���>`Oi#�T�2��"-�!NSn\ z��$���S�C%�Q���%;���O���z�c�T)!�M�.wf�.P��o�1���U=B��l1�F�#F0HD�\u̞rڜ*��u�jQ��O5��u8�E$�7:"��І���(Uu�AN�gulW�YE�*Z�"cT\���k���Tx�l�x)�$��<�hT��',ʷ� �����y�={V?$�N�)�D��P�Vl������]:�|�d��̏��"���w1*��=3*gB'����|�'#�sB�F�S^PR�8�?� +$ m�:��@����l���(蕉9 Ea,�_܎i�ǀ/O I��4�a��S8!��%UJ������8C�(�&2�J:�;{��Mጫ~J����dm��rFW �jg�Y�?��;��s�8Ҁ�����Z6\Fq�D,���H Y'{����$a@Q��k�^���ж��r��h��"j�}+�m�j����y��s�������әM���D]�_CJQw�)��/ʹ�5���״2�s�7�v���}���7� T�V���S���6~G���oLF�� YH����Km�k�v���~�U��.+�jp��o8Ɖ$�5�)�\R��������(��g��H�m}�w�5j�N) ++����������p�vO[n��Hj�͌%=h�� ��4�^"��l�q:i����%S,��P����=�Ƌ�G����T���� �B�ULR8LW������$G�xLcLS��},�?�E�;�8Q��E�$?\.�e�!&���KK����J����G���7��|�_ ��Ҟl8!>�8��(Y�B�I�Y�`[�}��.�B���b ��T���$��=U8O��ŧ y��P��-x��$�]��0��_��� +�j��(��sO�����H|/=�wKR���������`� p�t�l>f*�ӡ����uU��<�=�T��s�(�&zpK��A?sL�o`N0M�q+~*m��-��~F7�^���5惬H]�${��|�-Ҷ9Y&�=X'�V�u+^�ϖE�m��� +��Y/�0�X� c����A��dPc��_X�� �V�Rx�6���b�|C�6������^FeC]���o�-�F?f7���Q3�V�>͝y�Fs���y]�ݯM�F�����͊��k�^Nն��I�����#F�Z�.�7��Ɔ�Q�f�eϫCJ�n�;Aj�B JF���w +��mԗ��6��t�����(�I5�beE���l���X���Q����͌���� i,)�6QS �1zJ�ezVBf�� ۹���ʹ�/��� HQ8�9�SnE%�o���-�4�NJ�`�`,��)�~u�t��yQ��N��]�vح�p����+e�"�x����N�6y�*������,�7�$'�x�\���C���QL���[8.d@}���C�ɏE)1���D?@晹���b��$�?7� + �Y��M��� N�|����� _�Td'wa�}��0Z��������<���9|��3�����閗3~o=��Y>���l0Wb=P1��jmE� ��X�R[l�o�uv:.�C=���;.�a.��Bř�S[�n�W�J3�ǟN�1='\Xr���8�۲��:K�X��j�6�e �g΀a�p���%z"��K�1��.c1�ɇzɭ�G�T�Ri�VB�e�����-�)K@iͬ�!�u�@_�`�&2�q�� u�p�%P��� +��S�Ч|N�WP� !���o-t_�� ��n�y��V|�ؤ��賐�e`Hʏ�E�=>\��Tǀ�|��cҎ�k�IS�T!������%Gu,%[IR�'�������+#T�}m���3��\��/���df)��`����n2�#���\�M����(��CQ�d�6f��l��qG����v�첵).Z&���w�I�����Te{�������JQ�����ܕQ����E\m�`�p�`��Ҵ���\�z�[�v7OV�o9ݜQ�����}��$SSFMW�d��ny��u�я�:� �*�o�[��3� ���O ��FRJ���0��ո�l�����+��L+�&�o�E�+d�-� +�@�?��^f�E��ko�o�\fy���J���8�z���ΰ�Xmi ���� -Nw�}����OY�pz&�@>��g�ݪHc���.�� ��]7M����z�#�f�����e"�g���\��a��@�\�qyºJc�\��3ܔ��� �����r�'W�QV�E� D�|��P�L���s�\h_h��#��9�Z-�T�d��L�>˼!���WS/b�n�iA�3���.1Fx@Ǡ�3UN�N^n�POZ�d��t<�jGLy��s=���>�vW�O&�-8ךs��hv���eSȉ���`wPU_�c�a��ř�=շ}�m`�<<�$�+��UV�6�6d�����o�88{��η���zkG}ڻ��<<�7�\���jvg!5M��!�w�&�GmpfS����g��O�3x?��� +wZs�LR�q�/�~l�K�]Q�V�����:�o��m��<Q�'��� R]�AMXy��u�� �^��ȩ���� �$�}�!� 9LH��aH8��h��ʡrTtD-�*��fY]]wu������u[bg���g޼ߛ����"���ȹ�� I7�����H�R�7�H�B�H�u��d�t� �*�Ჲ=e���J��t�j�|��� �#T����I�/��W?�{�Ν��O�^��'�`�����v�'$�^��E�=7�I����TF�2˵���7-��^�'Z�"[�x ;�����[U�7�,���QyWrr�9��E��6c�y'�I� �gIR�m��2���Z�Q���� +�{0K�,�^�H�/>�>G��@l`�T��=FZ����nZ�H �ѳ$m�¯鵩�K�A�3D;w�����7����ŏw��^J<��`i$�M_�x��8w��U-,�/h!��pbP���1��|*�k _U�;���N�45�����j���X���_�:�]��$ %�ͫX�+é� ��Miwz��z{7��`fOE���5Fo�h�X�}�fL�}��k%�J�q�_b��_��A�5��4WK������'h?�:l��TH�mm. �m�&�"�X7�r��V7�����l̨b�]r+� �O�pK�[�{0�E�uwrf�ӵ�Fa�jCCP�k��t�M�ݻ�Vw�[FR��(�Y�-V��E8���� ������P��?�)�p>��͛�5� #��T��t�F%�����3� qhk���� �;�`�LVOp���Z�ۓ. ��j��&�\Cʡ <�*�g�!��r)J����;ȁ��&x�K0�N�\��B�&���Գ����$�bԍ7f��p��t(�0��H�2����3�ӲG1�d?ź��� +�b�Vֆ|�����\[�w+�tj�j?b7����h���wJ�Cm�m�#�b.^V��B���DR�b��8��E]4�J� 7LG�c.Xd���/�a�&ڎ� �@�顢��zQuֈ4T��q�i˽�èb˕ 4�3���~,�y�moθ�[��0� � +�l�} ��T�C�u�L�Bt 2��Z���W�>��Eh�@+[�Ř��y����0= +�s�U"r]�;�û]���(��̏{�����e� �E=�m��a^2�'FKv�~.�Оm��0O�j(�e�s�ߺ��� �Pk*!��3�I�BЦ��s4�{^�|{6��k\* �}X�Y��Ǡ���D�=A %��$�hǹW���ǂORV����� ����U�B��ꯪ��r��+C�a6���� ��K��ԣe�� :Zڿu�6&��?�W�&�k�).��]%��]�,l�b7MX]�[H"}���WL)RI�r�f�r?A��ƁY�&�I�~_�IB��$�{X��l��Z����X�E�&|�w�#����؆�`��_v�ߢf���u���3����f����m��8�9�?��9� +̟��N�Վ��`�jz1*�������.�@��爎܋��`�o�ْ�J_����+-�4α6@��/DWE�jE}HR�Dl���;Y+� ���z���/������1�D�ѓ(z)oι&�;��.�4��aZ�#�g��s�b�Z+�X�Wi;�<~�n�"�(� �����M�'��b6��!G ���lP<�^\��nM8-�-a��G+dyXP�^��s:����0q \p3b����W�u.�,R�&�r��m��#<�He�ĸ�vQ�l���.ˍ���J>��қ�s)��lej�(�^ ��,�=�/����FV���6fj����;e���x��%�D�����k�%�!FW@a��o2QT�vs� �5��h�0��B�{�U��H�i�GCO����zL'�pb�I�q����+'_1���Lv�� +���Q��A����%���$��[H~�}{�1�f��K�ٲ�:HmW�S +��ëd}�2w7���� j����<� �O�����7�i�2�G��;S�W�ݒ�!�@Y�s�Z~��*���PƐ6�x�Q�ܡ��/9i�7c�G��HV�f�3��R>K�����2j�Z�xH"Z�"�)�vH�D�} �@���} Y�J64�T(P_�(*�C]���mi���S�Jq�OZ�g�A��(n�y8}wν3���7���;�?߇�*x"D���6�Hae�Z +�5K� e +tE=H�������\ƒ�W�8 ��7��2�y��m��]L����y��� ��1N<�8͍�@��������:�> �>���6p������ӹ�<�AМ�*쵮�5M +��N5����g���ܿ��]7�c�D�!\����O��6N�(���b���H����ֲr�t1g���u��N�'w�ߢ�e�Gr��u�b�J1��a�#�g�i�|��Gc��"���� �'x��&�YH;�����4�T1}�Ϯ;c�V*���ܲw��f����|�H2;�R��l��{��K��*��G��ZPg��׸z *ۿ��?ʗ��� +�ד:�N����9u�����L7�o����|j�B�jEV�QR��!Ū��;~;�Z�Z����xٲ� +�(�񆜦q�����E蠟�V����7�:b��g3��h\y����g�.:O�������0�7��Ң��b�4=�N��Hdto{�<��WZgH�NR���RZ\��s�W*Zx�� ƻQͮ�l<�I���Ts|���X)���c?��p�\B� ��K��u��e��|0|/a�hB�|樕���sEG���M���s��M�d���?�*G,����H����R�g�[)|�3��C�Q��{0b��Iט%9*��X�����R�M��U)+�^� �P�,�p�y*��~uR�Hw,r�~L���;�_���vN���"������ۿ�]���//S{̑��Ͷ�^���0X 7�4�����㊈�#�ޒ{Y�<mg�$���5`��Vs-*l��ۻ�g��r��i�˕[ ����L��X#DEhgq!N-_����c YP�a �!w����|Em��"�����P�D�OUHS�r5�a�+[�� m��� +�Wh�*¥{I/1Ywû�Jy�׸j�k�@p[�����z�3*R�e���RXwq3�0���u%�B�AŒ%\N�C)�W�'5�꡵ +&�F+U,��d5�gR "J�r��VDB�SDO]V�[EסdyVӃ�1,+�Iev�"���`��Wrw�Ka���G��|����`��%+T�VR�C�F���{Ys*���Z�5�߬�R�e�s� Q3 +���j�QA�4Ӌ<>���$�.7�$C$p�������A�)h����J��ew�T��*Fm���K�g-��l�m��*{��{�����v\ܲ�s�Ja>3_*ݑ���ہ>��V�5�|���WG_�>��R��R_YL�!�R�F�jz�� S�5fځO�2��<�� `��}I\:��X�i�Zk�R���H*��4����[(�x��X��$u|I9̺TkV���z����l�_�׼g�C��%�*��w�XR ��nY)N.�9+�wZ�[��E9�ľW����J%�w�p`Nj���[���.�b|JOsd�W,��R�~�#�* Ľ�yF�dwC��p���*�L(8�Oe��lL��˞)A��� ��v�f���F��ʹ.��Kn�d�~A򥾺]�Di��(i���]Yʯ�J����ߟ�?�>�w�[侾�7���KK�6�w"��!e��D�p��5��V* �3VEa{:KoED��cɾ���J�#�oOU4���4����l�TjF�k�,>�{S�?ý�Sk�>��Su�����=�|��j}�����T +�SU�.nk�.����������m�c�Ů)Rx�b�T�<�T�V*y�Ù<+�`R�C�;S�^����0�-�itp��<ȗ�2I�Z_0�ȡ�VVKHW�ol���9�=�fd� j��b��%}D�C��y�{�s��I*�{ZL����1������r`n}+�D�����_�*�Uz�3�����}�i7��7��9_�k��jx�L�+u �;�FxL�.�m�m���Q`sK�z�������K#�>����&����ޗxiB�V�^�\s�3�_X��X_�ر��C�+ҭj�|S�� �k�Ͻ�|j|[����X +Ά�BL���.�?�\��D��C��q��ߢ7n�O(M�&���JO����������i�ݖw0�����I�J�LM,NCOYPoQ�R�S�T�U�V�X Y#Z:[Q\f]x^�_�`�a�b�c�d�fgh#i3jBkRl^mgnqozp�q�r�s�t�u�v�w�x�y�z�{�|�}�~�ˀɁǂф����������������������{�p�d�X�L�@�3�&�� �����֜ȝ��������|�j�W�E�3� �����תū������}�k�Y�G�6�$�����ڷȸ������~�k�Y�G�5�"���������ŵƣǑ�~�l�Y�D�.������оѧҐ�y�a�I�1������ڲۘ�}�b�G�,��������{�W�3�������q�H�������v�U�3��������s�I��������a�)�����\� ���Z����,��� +    ������������ �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/�0�1�2�3�4�5678�9�:;~<|=|>|?}@A�B�C�D�E�F�G�H�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�cdee�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�|z}o~dX�M�A�5�)������ۈʉ��������q�`�N�=�,�� +����ٖɗ��������m�Z�H�6�%������ؤʥ�������������w�o�g�`�Z�T�O�L�I�F�E�D�E�F�H�J�N�R�W�]�c�j�r�{ĄŊƐǖȝɥʭ˶̿����������������*�7�D�Q�^�k�yކߔ���������������������� �,�8�C�N�Y�c�j�n�o�l�d�V�D�/����h� 2 +R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$�%�&�'�(�)�*�+�,�-�.�/|0p1d2Y3M4A566+7!89 ::�;�<�=�>�?�@�A�B�C�D�E�F�G�H�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�b�c�d�e�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�||}v~oi�a�Z�Q�H�>�5�+�!�� ������؎͏Ð��������������x�p�j�c�^�Y�U�R�P�O�O�P�R�U�Y�_�f�n�x�����������̰߱� � �8�Q�l�����»��!�C�e��ª������9�^ɂʦ������2�T�tҔӲ�������6�L�a�t݇ޘߧ���������������������o�X�\�[�V�L�=�*����������b�/�����f����M���q���� T� � +� � � �p_L7! ������}tfUA, �!�"�#�$�%z&d'N(9)%**�+�,�-�.�/�0�1y2g3U4D526"788�9�:�;�<�=�>�?�@}AoBbCUDIE~% �ہ‚����r�W�;� ���ϊ����}�b�G�-����ޒē����x�`�G�/����Ԝ��������q�_�O�?�0�"��������۬խЮ˯ǰı²����µŶȷ͸ӹۺ������� �0�@�R�f�zƏǦȾ����� �*�G�cЀџҿ����'�L�sٛ������F�s�����M����6����+����1����M����Z�����:�{��������O�X͙�~ʹ��~y��~e�L�~�j��~�Q��c=9����~|�4�~c�l�@~]�̳�~n�f��~��C�~لOiZ/�gP����8�v����}6�q��}0����}>�ϲ:}i�^��}��,��~� ׉_L�p����K�-~~,*���~��&E()D9�v��yo�w�y���=�TS3�wI�!�D)�J��%����OBv���w�N6��4��;�>��FVW���m�� +S�^�D�i��*��bPk�������pة�?�%"�1�#!ϼK`���L�<�n-e��2*���+�) X䥂C@�v2l Q?����(=�0�q�� Mz�ǃI�z����7ME�Y;��� Y��@K (�-��\��U��������&>�r���I�^���2���I�Me;Ya����"��V�N�,S�;��o�_%s��D;��f�Ǝ.�����R?l ;0Dq�>���8z��D�KG)�3o��+�&�<4��@n͗0�E��O�9�4��#��Ґ���n�W9 �b���_��7}B�2�yːv���/ąJH삻Ȧ��p$�ȫވy;�Æ���ǘ�f��o虔�F¨Ls���I���,Kh�W2�!�A��jHE^�τ���� _�w�d�lX�g�g�Ωr!jU)�[%�B��\D��Cf�p� �<_��\?�k�,.���w�Ȳ����irJ����R����ݐ=>0�+cv���Z�{Hl�l�L���VA��c�۠���� ^{6o�Cҏ���S���م�bȏ���:sz � 7�j�P@�Q������;[�w�g�|z3�0Uq`!�P����-~|���X�3��+�z2lIђ��:�_<����a�X��S5\}���E�^����G��� +�X��J4�^�Ƭw��/��I!5 +�bn�#�F���O�������`.ܙ�-�J\�!gZ0� +)�ݥq Aß���O��k�V����^B���f8KĈza>p-F���O�J*����Yr(���".��O��'����q�ä����f��rC���RJ'�dc~��h��!€�?�`���}W�zBd;�hѲG��ϲ�m�T ��SAi�j9�<�� � +ߨ��%�@`��8xL��T��qė=�,Mk $hJ�����d�����x_�r�̰gʱ��h�t�G,�K��ytomVK0����X�?R<�J%��m�q���=Џ �]ٛ��a��`sʠ�7���g&Gr�ŀ�?>��r&�z`�b>&���z��%��sx�bw�&�{�~�څ��]"W�R�%��c"z�D ����zA ����r���s!֝=jcf]��rm��A��NJl$��ے�#ؑ �>���wTf�GF�F69�9<׵.�'S�Z*�˺#�-�Jl.��Z�Zx�%m*�|����� �o� �2�ӝ_T��W�K4�eRsu33'jRF�B����Wl|�� +��F��gml0L�1�, �����y�+�Hu��2��f;�[�T�0BE��{�:���qn������to�T�]o������kI, + ��LgV_R:�Kϋ0�d�P?= ��v��E̷փ(M4�m����\��T�k׉o�����,�H��=����������Z��w/��E�I�-LQ����[���� �8�F/�g֖'$��?�[��u~f�g���h�X�j����ݚ-� VI�m�K��Հ,%i�b���Q���*e9�7���������WK�����M�YiHt�X�T���BUD���w�-�4��9#i�ԗ/�r]�hGވ�/� + +lD2 h�‘�%TT�T*F���dw">���G��Y?�"��[f r5��ʊ4��`��TAo��4H5�rW�S�8��Xy��;$Yr���'�q �vUP��V&�����4m�/5LJ��E�:��S�7��Hv�y..�� �k�P�X��Al���`�� +��,e��: E�$@B�Kr��.!{�A$A�,�C�Y[EA;|� TJkU>���4�1a�Ɯd�cT.�����Us R�&�Bc�h�R�)����� +� Pd;���ʟH�b����l?1;_�:i�^��m�Mh9Ӝ+,�x�+(�‡j3�=P6u�>��a}�&���b� (���0�=��.À<��2&�m�%�u9��_�~z�����L��!�S`(�6͟>թV���l��W䨸�m5y�pg�!�2��<�� P�R%�wC�>��u�b�v���b�F�.0���UK�$�K�;�؂�P�,�!�rA�5��%\��v���"� +[2�g�w���dx��J���:��_�'�Eښ_+^Cژ�� ���I! v��,���V7�2UJ������L��N�ITU�K�ɎIy/R+�=+(֨����v��6������!M���� ��@P�B�%�R-��-�3��|4�-�����)#ͯ� �w����.�ܘ�<�;���b��#��;*��>$e�G��� +�>�3������"�و~A��Z���$xOU��x�� �f𜓜x;٥Q�� h X�(�Z�����x=�`dš�� 8�b�†i��d�, ϐ��!�enZ +b��� /�޲��І�����2��P�0~� �+��1�b��a��k��tT�� �?�g�)��˧�9�� С�`.ޓ�`>'4��\DRd���Paxԗ������?i|�9�,�t ��Ĵ�q]��"��m-�9�O�D��'���Ex�>�#B������z6����Nk�%��tm���6BDzV��Q�G�q,2�O:�� y�{i��Hcy[]�v�a�Z��T�5 �Ȩ�R 3��4�5N�@q���G!�fYXr����{�3^���M7HX1��ey����������8����7ҙ;N�������P9��tn��/D�=����}*��I�:��2s�̋%�����G{���7��a�b�����T�B��m�6ۺ�4JZm�I��׶�F�הz�\F�D*r��E�y���ք� ̣�V��-�8ˉi��#�7���Xm��Z�LW:2 +$Iⷱd�`U�+�����z�3�� 8"}��Y\�E^�\Q��ܵ���)<&uZ�!FM)V��"�ڟ}���&à/���� ď�� ���5�� ����O546�PW�눤0�� �f�GlE�bd�c ��'�ƪ�r��Ӭ[��{�K(��"M/y%���0=����zF�Bx}��{w6{Y5��0��%,��4�0�R}ԓ�vT��p>�K@�f�R�$�7H�U�( �����/1��0�f<,��1�B�S>���٨RI3#&�&���p�a�5j����1��9#yT����H�9c�I���[��է��j���U̟�~��?����� �+�7��N�zM�`k�|-�k�qJ�}(Ҙ2������S��aӼG�i� �;� ��b�:`uǤayU�}T�� 2����Ftm�̔%OpuD�����U0m~L-_������:�q��W��g�0~�huw�-]� NV��rP� =<�]x;Y���1�iw@��8,���n����\(z��q�������b� !$zB��&5d��n��6�1Q&� �&� ��C��u�Ўy#����c%$7�]w'z\���0L�k{8 �;��f�G�S� �Fx¬P�~���K�����m�%t3�M����c��cM(���bC�B��$ _� ��J�,���@��՜ ��%ӸZ�;�.�6��B��)�P��T�~��~���:_��tH�NI�T�S��c��Τ5���_�3���b�O�6�-[o� �7�$���c�n����:�zN�q��n�E2~�7\N��T���'� �"[�fTT��^2F������&��+������c5r~ԕ��(����j����l 4�8mW�DC]X�#���<����n�_ �T�� 45 �C0 V���~ m��&AG�A����7w����@�w����;����Q8���Q�� ��?d��9���#1�y�ʕq�_eS]y|�d�*�&6Q��3�0J(�WG>�H���N� v���Ag��+�[�o:y1ډ�G�m�UV�'p�J{"�����M@3��X���|��*�oƙ�ޞ�%sfJ�<��ߔ��[����-0R'G ��i�++q��NPF�\���&���XT~y�k�P�x�>����–����������~u2LX'��P �M�O�W� �rة Z?q�U�����\+w�>-�q}y/sR�Q�Q�����J��@737���K�a[t̷�����E�8X��,��T����p����!��P���V��K$��`�����Κ�׵�b�u~*L��lB�z-��<�R&,��+?�AP�]�o����L�K�ِ 'y���� �Y�?� +~�t-"X�n�v&�����?����VA�G��+�����7�W����h�K��D�Y��Z�%4YF�g�[���� ��C_�M�6ЅLJ��!��)�9��!6��-��l?�@��W ���?�t`k�;�����p��}� +P���>�f�{��i8Db����Mp/Ų�F��_<`w�[�U�q��. ���Y!�'i7�L'� �R�z$���v]�c�-�ީ%HY�~�ٕ���� �鞀ws{)W�a��˹��ԑ`����{�[z�� ���ϡ������Z�& ���z +-�� ��U��@u�BP.8�jz �B�{G�tϤ1�ޕq# ���^�o�2��N*`�D��Z�m錞c�@QY��@����O�����y`��ŕ^ ��)�H�?�?��s %�����J�@�f���-���H�%�{#}ř�PKn@�u�5w:=�Y�X9����(5#p �9#���A�v(~�-�"]�Qb'䠡�y����a +�������'����£� +��vO@��%�7_�*Z-r*��~z Ց�4��!��w�Bp����G-q.�a+��c��"wmqk=���WfB +k^����0����>n�pu�5��㞃= �m]0o�����-1��:ǒ~��%ui����;�p�V��O�/a3��;0�o��KܼL���6��E���d@�ZU%�{ ����^� Ͱ�y�O��V�NHLm���u�?�uM��B�EQ1\�IُO�u�i�@L����7�Nk\��dd��[i��|����lRܰ��3"���rW^ �� +�1��9�~�(�V��ZQjsf���b�5~Nl�, $LAE ���\�����Y�v����3k��"�*��Ie����.�gj4u��D��k"�*T�~~���g�^� �~��<|�1�c��Px7��kF�84�K(/AI�\%�H��G;�'��6�������`kK���� +���Z�J���A�Fq��K�q�$5�GT��#.��a<��C]�s�zO��9�����@yQђ�-��D�RP����G�D{��n�����o��^�7�P��vU�v����T_F"�T��e� ��^�9��^�9���(Zi����*���J�|1�"�]����.��g:��E�TI�FzN���%T�|�k&�J�l���I��3ʌ�+�r^�qf��SNM���X��e�� $��v�{�ꢫ?�I��B�-��-Oi�0iX�o� �葚T\���.%kR&-?(�m��=���?~3�Jncu �/�mS<��Ð,��Le�H:��i�_+MSV��a� k�@\Ѓ*��+w��qDS!h��e +�4��9"(h�d}+ɗ�7��)T��� b�ǪԪhm��`Y�ջ�� �s<��-�,@��͋������SCg�Zw��N� CU�c��W�����-JGm\Q��A]Q�]�h&D��0���Zvnw�%����0��z��MT�X�I����:��l���<�7��a�` ���5�P`��ݰDh��k?�(�b�� ��?�`F��g�����ű��y���=�4EJ����0 GvQ�O4��W����d� SA�nM�C��� +ұ|`�7ø_��vY���Io���R�yYqE�,D�;�&Q�\�B�xW��r���v t� �[���\"]����U���ˋ� ����w�髐�<� |Mc+����� �Z�9�(WZ�ʳͰ��f����t��~X)�U�i��?�m��;1 p�'t.t-SSUn;Q��Y(sў��*�M�8=��� +BHZ# ��GcD�S���{d'�,U�t���l�=��,}�*��v�cr�+�]�(_�1r�Ø@?A[��K�Dl�v'”o�>=��ԏ������[���?�Q� �ôn!ܘ���e���o���i���B]�u3����PzP'ߧ�%�4�4Qw� � L7@�?;�gSVjgo�ho�p�7��sy����R�\7�����V�%xL| 3�n��|�2Q|��-��Go�t��u�V֘��Gk�}��fd�'�̐�yQ/;^��+b�#��&�~����ي2����(��<��c 3�;�n`9��2[�Lqzt�.��)�<����lJ�a�n�� X>��ɚ��p��Tֆ��)��$��Dr�u:5�z�j�,|�~��0T\~�>�*,6�Y +�]�7E9!��7���;a����u�*��8Y?��Ң��#����W�f�iA�~�\���mB\�$��O�wDh�E��16:_�����J��qB���R%��*X���3 �!��O���:�`I�����o��k��2�+��}�Y��'1�%Y �G����PMJ{rK �����w�������_�� ��L�&N����� �N�yA'�ճmﺾo4gz"�v;L� j�e��� %Ɯ���{��N�S6��U'*���@�d���jNc��v�o^=�Bi ���7�95���l�€A��ⶫ62�7�I����C�k�yV�_}B��.I=��YR2��U^�c���~�o��\Ƙa3Ƹ2���@e���U*Tl��m�c�ӱ������~� x������n��N��������U���)o`Iχa]�����P���F�ŚVTC&�ϣ�࿋Y�=�d]/���.��.F�BX�s+$��=�}buM�>�RWm6�Ŗ6ᢐ�FX �5�x{v*������j;�zv��<���_~����A��VUJϐ��^Ij�Q�x�シu�Q�o�=l�K�_��Ց�E�kZ\4��s�qU7��vOa �J?��Q)�4C��^����\��k[{��3��y�~���M�|J��'g��4Ay,$�0�( j�H��l�:Q"V҉�1X��&e��������� �s)M�Z��(�W� �|�Ϲ�\���8�8&�t��c�p��Ҕ��a�����͔���� �C��C� GU�$^�fb���|�8u����̸����&���A֍�9k�e�7�;�㥦���k�o����Av���Տ0o5����y�'�����������<�!�����H���P�4��|y��C�{_�2e��lTr�s��*��Idg_���'V +Fv�z|"��ƞ��ҩn2=�3[�"s����t� �}N��8����`�����1`X�i��]�x���(�U2\�o[v1�d%JOO&rؗ��0ܵ9�Yx�ݨ \����D�m����]=H�j�ovfd���)�:�t��b�dH9\��ϛ�Y�?�8�� <%�}��dV�ەh��nu�ӻkV��3�+��(+�$���-������#��Ջ��QҰ�����Ж���X@��h-Nd���$�a��>�M3��q��"y���$�[Y�@S���g�Ó=ݎ��P����1�)L<�d�"�d��rՕs����W�� ��DJ� +t��b�� �c�j��*���!�A�q +hG�|�3j z�O������|�N� +��*�π�������%2#�Ǔ�H�7!� ;v�����'�;��O����~h�ĥ�%�,v6�Bբ��Tx��Dv"Lt�ïK"N#��.ec�}f��˺��d�&�T���R��AS�;Yq!������E,������AA�m?~������[�7��[��> \�!�B;U��!�)/������C$N���$�A�³u�e�uU}�,3Y'��/J���c�� .8_[O�����N-<"N�����awG��m��_+�yj~P�]ſ^\y� X��,r-�|�㒒��ܳ���<���L^T}��,�^eDR��,��n�kqց%��|r,�!g��Jx�����=~�p{"��\ee�E�N;��Þ��=���$���{q@Q��_��\?�/иLe���>�u��#��M����p�'Y��n�_e<�q㼅����Ra8p�LB�=��(�YK��[l��`BK����B#4;c��;H�S��^��OA<�J��~�I4,���$"���,B\HV'&fಀ/pO_*���_�_�#���&l��Wc�K B�Z�(��|Z���b��+|���KpT�� +�Ar3v�*>�����>Ʉ�x\�+�0lk������O�Լ`��F���cfup�.���wlC�n���KJIi]����&���f�����XPA���n�1ک���F�TK��BoI!��Ӯ���Z�� f�)~��X��h���y���9� ݨO��C5�����&�|�T2���Ӳ���n�SLB5eD0��:��yP�;��(��w��9m��Ϊn�Wh����K�u����{�`��w��k����� +��kH���>*�ڲ��1��� �w�p5�����Q����݌�$�;����LvvJ1��f����3n�*���T�g@oO#9|}����?V0M�5.�ۀz�{" N�K?�C�_$ P�&B̆e>�(q��I�u���`���|o�b|�_�0l2�Wꂝ�sC��ܴLT��I�a?�f(/+���P�Iw��B W�h�g��šH ��Ei�Ů���(G6 +�����" � +"(�H2�̙�dfr� $��x�Z�EP>�ţ�������C������~���E��F�:}< �\{ +�����%���� rH�6N$(߫Nᷘ_%�1�����]�2�:$����o��-�8ȥ I-qt;�'k��TjJW^�}�k��fQUr\�u��l�N�kHn᫂�H����*�W������d6��M2 *{���`�V%���VR�oJJ����`+"�yO|s8����6�V��y8� �:+����;��9��ɨ�=�.q�q���ѝ=���ɥ��^ӏ�w�ld���G���;<�bSh� ���(������%]� �N�}uAܹ� �`MV����?g�=�&�o:R�����(�tWS-{66C�S����������U���foEI��hzE�'�ܜ��&��Q�8,�g�]-2t��%��F@}S|��QJĜ�h&S콧�bor 2w�q�|�o�����/�$� Ĭ�7�Aң���I�MXIc>��f���H^�2��`�zB�ȳ� ŞO�*�{M�2MoR�0�i����:�T�~%�$�9ED~c�j<}���${.�-��+P]c��=Vz��pwz\S�;!?���C:�G�F����Iױ�q�Y�Ş ݇>;��]�����m�S�)�yr���Ez�_n˕�aI"l�|s�G���������vm��ߵ���_7e]֭�>��Г��U�)i:��D΂�G�}�V W�5*��{�f��?� +�(��$�p\)9D$ZY�r|�����(�4D܁O�H���ʳ ;ܫ��v۱j�x�Lr_r� ���;Wi�� nV�|�R��u��dܦ�;�@������Y�N��l-�Q���nJ��Ȳ�c�/�����14���C:�'K��&���̕BO�J{ߴz�f�sW��|F-��q2�� ?���}Y[�pXd�Y<\��v�+��M{��i�r��8��~��LJޯ���� �vlL:�� ?@���o�[g�`���}�>?Ur�ǛI2��L�k.�}GpI8�Q�RV%܂L0/PU���E�� ?�ɹT��c�ۼ�f�H��s��^QM�C!��)�$ �; �ej� �uIy �W����6���#L��Mi9�Ħͱ��P�*���H��ʘ����F�g��]�m��ߝn�+|���X$Z�6K'��O�Q�J�q ���m�(B~�lj��Su�Z �ť�bhW��P"��z@�U��V��J�΂\�,<\H��A� ��5�����O�af΍�C75O ����Uݮ�x�7�����F���>Q��L��~:ʥ�#�]�[eTS�2��%��c� ���Æ~EW��g�9��i���%�3W4ފ:�}޼0�_�X|���-�ƣ�µ������V�u�8H{���Y�F�"qĔ-�F95E!L��/���3z���Lw@��"���F���Rm�O����Q&�[�#������Z�O��/�x��ˤ�r�~9�T0�0b��ܬ �4��Pߋb�>_nMFY%��<�ip +�;R�x���@��|���qj#�l�j�?Ape��[�ۊ�x�{� +�s�H�t-bM�#���t8f���5�}s�c��0�f0 CcB�K�R�mc�E�����k���ץ�JH�[�ۢŚ���MO�a��N�$ʡ˖~ &(��$~��>�����t�BM%^i���3��ϐ�Ef8UB ������'`-�icIaͨ��+�� ��دR���=�Z�����Ⱦ��Ł�=�5�U#��5H����R����>njky/����s6��H؃�E oL��y����C�G��/��?QE%��F�v��MMz)=Z�B.��ϡƋ��/��•��3������O��8��5&�Y�����K�լ(�ST� e�ҝ���ZV���x'�xaV�4�Ë�*H�]z~�h~ �i�0d,�K��8��CZy�{j��CF')�b�|x���NJ>�V�{�0��e�#|S���E�1b狛*_�R��"������37�����B���oξ��(p�3_�<ݥ%-��t��ɫ�B�e��t�Ɠ��px H��uRuɵ)H?�m������f@�Iz�͂qrgM_����D�|Ce� +��ӯ_���w�CՄYK/��Ԩ ��佨/���Y0�����y��̸7�.]�*ѳ���a �!�d��[�m��9���#{-�;�W�[���� ��U�$�mb?ci�3�ؘs���q�6�ĂT� t�֠}��� �dl����v��{�F�yt/ټ�t�����̰��K��Q8��� N��"���4�ʻ�c�'׸N��s6��I�� <�fWϚvЕ*�҇�T� ��9� �I#�{� ��mVx�@�. ��\�EyT��}��W�*�fҿS�ѵ:'��hP��of��ħ/7��n� u�3֭F����c���ȶT���5��y�ŴѪ����L��i�Ӕ���%v�I��G� �ɒ3�m?PH-k� �;?�v�bkk���Չy��^��4o B[�*�Bo���R 9���^F�t�b�Iyd����W��$ګږ��N��T3�VYzl ((�m��"U�a.\�vz��C�5H8�H�$?sZ�6���=:�hh�B�!É8 +`,� g6�$cN���!L�p�<�b<���Nz;�0y�%� )��"� �D�B@� ;�.a��$G=�W+����v�F�v-�����|d%��ݿǁ�gOŨ��;$KF���lb�u#�^$(�b� ���,���jdM�[s��kx�v�͆��c��?s�B��fl�S����k����Me͈Ly�i��3�TZu�g�v���#���V'{�F�,���8+�5��%\���Y`kY o���C��,VQ�"�B�k�5Wjؚ�� a�x����h�k�"� �A�ƛ�/����d�X��!xJ��(}�~��&�|����� �h��?����.��������XS����qX�}|�#Ci�ch�K��VF @ d��w^��NH L +jk�u�j����V�JE)������swm��^ ��VQe��^*���7�c���Su�5�.�:��5!{3�A/��u@v�?�aD��UNC�k���H2)� 1�z%�9�U鱛������v򹰗�!�k��0>][#�?�w�sb���,4U��_ f�)��E�ď�* uä6Go7�6ɵ����{�����'C���Ga��+���RU�A=�@��5_�rgs1OU��G��*��ʚ�O�&��Q͡�4��%������nl�c=�%Z� ��v�Y �Ze��ਝ4�? eC����`��� �_���wvĦ10�K�B/��*Br�v�4όwM�� 0����r� �`���$����C�ܝ�G�a6;g-N_�&ɰ�.` �`�0����M/s\�P���M�f�`p��3������ $��A7� i�� ���c���(y <�N������6��e/� �c�POj��m�+�YЪC�z��Xa-��T��`ao�t�t�._ ,qg��O�����I]@��f"� �?4|T�]�T7[��r�5+��D4UffN�]Ϭ��'�Md�d����Y��%A'-�:�x�>�j����Ӎ �5!�U��iMSD�-rB�FL��&����^:O����F�-T��4��w �������T��3c q]�2��R��d�/3���U�\;?���Up=���@�b� +TYRJ��3���O�)*+s�W�u�.��[��L6�Ǽ��A�. �귒�h���oN_�=C��|��HW� Gz}��w\��2�h{?�U��r_ס�,[<���4�Dm�D��〷����C/�F�l� M�r_򑹾�g"�P\T�M�Ii�D��w�$��=` ��I�Ӑ ��}����6�.��jY�x^���h}]����"�]���l +��8�"ӽ΃ǐ��L����"�H�ڝ��k��:^֖T��m���������.���^�@1�~qxT���l�U����#U7�����5��:��L�E|4�&W2��5e��xz��*̖̆;�����M�0��do�^�lpm����aI�S�7�kD#���'͊$�"lL�?b�A���DI����N�mEh� ��8��Ԍ*�"vұ�E���������݌5Z��5��� �`z�~x�[�MN&�a�|�b�(��ǁ$�ch� �����|cq�)M�_���Ɔw>bSО$ �� �D�p���z�!G@o3������a]Pn�N2);K4 U����"�p+q ��7b�������L����a�y�$�04��iC�c9��(�6�>E3a�{� R䏡�0`�?�s0��7y9'`L�q��`S��cLr&M���P.ڽ��,��_�r��u����/�F������=܏��=1lt�Ŝ ��9>1�lם +��KX_�t+ � �=���#�ثL��� +u�uW�K���̹� u)�F�@�������j�R��_$����YuBś�G�bQl+$���,o8�q�l����g�!) ����n�2Q��ή��U�>Yt�w�(���^��'Y�������!�� %��G�U��9������,� ��&>�YcwU��� �M����j"���Z�o6V��WF9�=�a��l m�y������nqA/2�A�I�̐���i��� +q��AN?!9Nxl�b�O���{�e�i�Y�Q�̶�>S���Z� .&�s���b��j?1_��ǡP���k���ٟ��x�`дY�!��n��6f�VJ�?ff�o���n��0�����6l�)�7�B�u�yMA�Ѣ�&�m�>�>�Nj��#4J%���&|���E]ۊ:��i�2g�0��io*�6zX������h +�҂��3;���1"��2ҍ�+O�?���K��ja��������Y|��n�MH�p�A/�LsI5��cu�*ΐDx�!W� {�|m�p�q%��q�eh��r�Yb�Bt M7��u�A-� +w%5��,x�+ �z�!Ί}|%��w�pȩ�xe�Xx|Y��y$M�}y�A��z�5��{�+=�}5"6�~�{άq~�p^�Q~Md��~*XŸ�~,L��U~S@��~�5�� ~�+f�2T"��P�{p�U�Ip�<��dG���X]���'Lz�J��@��ς5��)��+��g�I"ۇ���{�~�o��e��c��,�dX�؈ L;�o��@���}5��^�E+����#���zЩג�oy����cơz��Wܝ��L����@��E��5�����+����#N����z��O��oK�/��c����W���� K՘$�B@W���|5��%��+׊��#x�A�qzt���&oM�ɜ9c��l��W���K×���@V��5�����+�@�)#����q���h�f��j�[Ű1lmPʪ�npEХip�; ��s 0�Xu�'���xzŒr{�qD��o�f��p�[ԯq�P䩪sNE�t�;=�%v�15�x�( +��z� W�W} q(��vsf���v�[���wLP̨OxE뢳y +;N��z11c��{v(_��|� ׊b~mq�C|�fL�o|�[y�[|�P��|�Eҡt};O��}�1���~/(���~�!E���p޵�f&�B�p[Q�/��Pt�ہgE��S�;P����1��ƀ�(�Ā�!��ހ�p��,�Rf�O�6[B�5�Pc���E��`��;U���1���*)��^!��H��p��y�`f ����[>�f� P[��AE�����;Z����1ٓ0�U)F�j��"0�΂op~���7f ��![B����PY�_�EE����;T�\��1撠�C)k��"d�j�pm����f�r�=[M�,�1P\�Ǒ�E��S��;`�Ћ�1�'��)}���"����Ρmf���n�i=��p�kq��r^m���to�lVu�rX w�tDy�w'0�|Yz>̾j�qźjl�r�`n�t��p�u0�rnvgkbtgw�WIv~yCtx�z�0b{x|b��h�|~��j�|���l�|��^n�|�~pp�|�j\s}AVtu[}�B�w�}�0z�~l�;fׇ ��i� +�9kD���mh�5})o��viNqꂿU�tX�BEv��=/�y��VǧeP�{�qg�����i卞�|l��{�no��hLp�(T�su�SA�v@�Z/ryX��_d�ִ2f}��}hƖ�Mk�/z�mt�Lgdo��jT3r��xAKu��I/8xσ��[c&��5e��[�}gܞr�Qj.�xy�l���f�oD��S�r �d@�u��/x\�ębp� �vdܫ���g%����iw��y3k��ye�n��bSq��@�t��o.�w��U�a����d`�R�f��W��h�-x�kk�emn)��R�q�\@?t@��.�w��Z��t�f4��u�h���v�j��xxm0x�yosekz.q�R|{itP?�|�w-�~�zK�'r�p{��s�qԜ�u#s��vFtgw�wtu�d�x�w*Q�z%x�?E{�zb-�}�|X��p�z���r'z�ssj{@�(t�{�vxv|c�wy|Qy +}>�z�}�-R|�~H�(o���Yp�����q݃^��s=��uPt��;b�vS��PPx �<>Ay���-|0���m��{��o���p��z��r��t?s��^a�uQ��O�w+�T=�y>��,�{��¹�lu�S��m���oou���{p���sGr��latq��Ovk�?=tx��j,�{ �@��k�� ��m�ܖ�n��l��p��rxqؔM`Ws���N�uȌ�=&x��,�z�����j׫��4lg����m���om��q�q0��_�s*�9N uI�_<�w��6,�z@����ja�観k���)m\�|�2n��q)p�� _�|2s�o�|�u]�}@v�LO}�xT;"~�z-*��|L��y(x�*y�yr� z$y� �gWT�aˢ�ĮkTd@D\dPPp-HG��&]�30�����;s�Cg(�� 1DE�*n�6ܵa�z�*�&��<��//6�� �O?��Q}�0$ 8 _��{���[w� �/��!f�UmxrI�WB���5�(����)2����.$��5U��o�}Z�!O�O����q��m����� ��>�>P�3��ĸg| �,�X񦁓�`���S$�>BG�� �DǕu��#�i��#��܌-�`��xJ��!w����م:��(�����`[H�W��eQ�2U��FD�����`�|���:C��d���2��~Tv���k��dEeUb2�̽��p� ʠ������~��[����@��Qd��F!��7��H��$�������� ����#��d�Lt�!BO�K�*��G-i���C��r�B�.�U�l�mO�>� �,B�2W�<+�3�6��7���ߛ��@�� �)�۠&KO� 0ޏ���O� igm��82=D� �4FB[���!A�Ib4�~����Z�� *��fz\��O�t��F&�����ӝN&3x��F��[�H��j���z��&3n14���b��M� �zB��!� ��|��+�� +/�hw{��V�\l�s��T�j�g�?қ����۟�u �깮�D�}û�.��5�ʺ�(wM� ��ұ=�L����j�e�o(u\��� y�P�X�����Ƣ8�p2�����23�2"uh�0 �;�(3���-ybݷ�3����Wd��sF�@w� �,��8#���!��H*9��)iF^ +��P7��D�g��3I�33D_�����)�J�QNdO�m2�t�a':�=���J��.�۱� +s�`d��+�uu�-� ǵ�i�ȵ\L +�kw��/i���&G�1|91�:H�^���gW���@-�E���if�?Q��F?�/�Kv��ř�M�kz�݈u�N�0:ӎ3BJ]�PU@��׊VV�z��D��PC����9>R��Tl�{=E�Y^Sc��yjN��9����6b~mwj[�� Zl'�d}��[�Y�ގM�:tU9����WI�-#�d�=�sѣ�S ��I�Ku�Ʒ6i/JO{�s��{��c@6o���P�U,�'9cV�~�M6���I�Q�1�W�wo��T+�ml��F0��\�O��d��?�o���i��4��M��4M�C%�H�f�M[�r0p�[����p�|R�’��/Ld/_c8]�׍�� �YpF�KM(���Ewo�@�jj�I0/���k�ad[�H�>��|/ѓ�L�� ��|0�0S���VR��ׂV2C�æ���a��v��4x��,'L��82��'�7���&n���&CĿ���f]9�-f]i{���T������a��4EeNٟ�����ή"�V��_�ǔ3���t�f6���5��ҷ��,� �jP���6E���x)ͻ��U��Su�@��6M6�d����������F�����V��SˬG���Ŧw�Ơ��u�y�@>.���TȆ���V�Odj�?#驺�syc���A)w,zl<�����ـ�B��*��7�i�j,\���P#���;}}�~��r4��fx�O�"Zh���NM���Be�@�(7���8,i���A#F�a�N}����qǖ*�lf ����Z�ۋ M��2�HB-����7�߅�,y�Y��#p��9|����q�����eے�NYƐ*��M��}�"A�튘6؈U�,��ۅ�#�����||���(qW�,��e��s��Y���!M�����ANJj�e6Ç�,��}��#��5��t�Pc�jO��f=_`�rh�T��kH���m�=o��p�2���s�(��Hv� "��zbtu�5k#j��l�_-�$nnS��jpDH���rB=t�ytn2ݑOv�)�yL ���|t��ri��Is ^ٟ�tS���uSHt�#v�=_�.x02�y�)B��{�! +��}~s���t(�o.w����]^����`c���CcH�l�Vf+�;t)i0�a�ld��O�ȯ�>tsw�[-�wn���w\-����_A���Mb0���ke#�SsShA�!a7k���O|o��>#r� -�v��0��[D�n��^a����aS�h��dL�%r�g{��`�j哟On��-=�rf�v-�v��m�3Z���p]­ ��`��܄c���r f؝C` jR��N�n�b=�q���-�vB�w�~o�`^��q&cc�r�fB��ti q�u�k�_�wIn�N1yq�<�{u8,-}py�mjy��n�lp�ptnR��rp/qs�r_;u�tM�w�v2���>��@?�n���C)�HKс�#�Eu��$�%������`^>[� +�(?`~�^x��0����_�+�OË��v&"Y��D�>s�5x'��]����~���-��i�f�~�>NF" P�����^O��G�#�� �ǖ����0�<�7�ӆ�7 �:s���XL��!kݱr�����x�{6�R�t�"+��@��q��*�7k�1��U誘Y�}(��~\H��`J䞂��\�� +����5�2[{�F�;�On������ݦ�� �*C�{2H�<��N-�S��2��Ur��u�UKm��5ųBu�� +}�����3�!�J�H$��#h^Qv�0�q�U���Y:�ʫ�a�Z=V.���}V�Z��fs�y ����֧�M���P�8�:�x-k�ն(+�rީ�G�S�I�Э����O ���w��iι�9јy��������&��z�8,k�.$��x�=rmRM���R����u�Mb;d��w0y� �2֤�T�{������WƊ�6m|�+�8�EC`�� �Gd]��Mm��"��W�rS禜D��~A���S������ ��+�G6W#��jnA>p��u�w0�D(�MHO�B$������vKѻX��{���'V���' 5�c + +�sh�]T4�I�� ��D�G�ãTD�(2BNlz�9�eB_ ݫ.�#�J�U��bG������ɰ������ �P��c36����߅!�3����?�o/˼� ��4Ta1l-vKWZ������A�p�ɾ���<���>\�Щ��ހk�a8�Z5$�G���d�W#��{{��ߢ��! �e�8l&�V�lu4��ʚ��@ԸQ��������WJ"�������쎛�����)�9(�6�gf �y�'��1?�J��L)��b���쭢���l��]4�L�kۘ�Pp�u�ﲹ�)nCA �Ŷ+2d���EH�'��H�m&Y3�u���ѷ��k�ѽ���ӭ���1��n�]�_Z�<ڮ�Rvӛ���pj�m9G݂������#j}d��A�-uڠ����� +�0�\C"���dhK>م�����ٸ�:IF�q�\BVhF�'$�[I�&3����B��t��K\ �D��'�`;�I [�"��%�#���N���\����I +|?�a��8+�ş3�"-A��ש�_ZZ�K�O%u6`����X{c�ͯw1� ���$���+��O�M{�'���E�],�j�z6���+���~� �Q��k a=�_���/E ��q����bV�k��&S��7f�g\"�&]��KOÑ:� %ije�B>�%���j�:l=��T1e~��/�ߪg� ���I0^Y��V)�<�^�ϑ�% +�զՏQS-W��GpaθD�8�ߠ9�D֑Ճ�XM'� +��U��J�]I�"��mt��e�uuE�)��-3`�Ҍ� SoO����������6Ju@$�Z�Z��ǚ����;���o������a��m>݄92)@m��{�����������>�-�V�|���������WU�>r�$Ӳ]�qّ¸��z�EYuɔ��>�GT@蚩�\�'��}њG����9��mp.d.@L4c�&,��r;b� ӂ���d�l����t3�ݦ�]Q<�b��-w ����N�k�� k� b�K�%����H���@ j��"�W4�sf��|A�a{��8�c�%�J@b��W���\��E���':Ehs�ř�=�}��9fǹ��T��W� !3ߔ�% פԘ�]YzĀ&XIkWdP�ي�b�]�9g���bI��i� ����$ �O�1wu_)��x��S$P�)m/�UI �.m�psf5�Uwl}oy�h� 4�;=DU�IKS��DS�j�j:�?�2�*w�0P��4��o���+G��4O6�j�eu�� �H�W)ϛ=���ݮȆ��s�51�� o���k���a�I�ӽ֒Wo�0�%>��#}?V�5N���_�����r}��%�7��� +�Լ��{�!`�D}���K_�4� +�!���Q\��Hҽ��zȔ�H�N�>�uA-^Ჰ�bg��%+k�5���8�W� #�wi+���q��0��k�hc��uTT�[����`�5�Z[�`�J� &���-��v�**��cs0���:�-�7���o�3G�(�Z!�d �� �z Q}v��x�'E����}���aQ#*��'���vi�Ʒ|'i��n����˵Y���;�eR{��E�1��v��i�k�Y��T�2����4o�/��;��K�� |O c�� +Rr_��T��'�U�t�Kyγ�z�a�L�= z�s#k�)��|O����Ā�܇��:a�x�im&��&^c���ŽoIѓ`� +���W��8�2K/�ױϬ˽���^��i�����p�u�����O���:JD�:WtG��<�8Y�J] + Մ�y�iZP�-|xm�4��r�Qe�`�dZ�H ;4�S����X1̚�`��w����p�u>�7� H��2��%�C�d>�zES�?��+��&��e�{�\�Q>��+)� ��^T9Z�P���F��������V+�@������l@ A ��B� +r�3����L2�$��$���x ����*,^-�ڷ[]��<**�R�������I�npdk� ŻΫ �:�������C�������>�KXi��<�_�TT���Ֆ��q�cs�.�JmZ�E�Œ����:��^΄���hsVIbm8tS��X&^ a*Ɋ���n�^�m����=A2�s��^�mICca|k��`�K��{��"Y١:nf�,ڱ�W x�_n~� �� +!f�睥��#� ��A�ɧo��(u� +gį�Vg攷���E)��?n�/ؠ�bd��S�u3�Q��Q���I�B`�\��C!���d� +�P�,���2QC���[P���һ�n�`��R������XYU�^��'�,|Y5G�4-}�<����k�C���fގo�ۆ3�����7��%�R����/4��!=�a�'��m���fUg�L���(CfU]@::&�� +�wo��߿���D[D$��<��H�׽k���U��*I�#;He6�i*��80C���T�N/h%�� u�hvL�5'�ƭs*=%s+�:V9˲O�%����(LWӖ�s��w��n0~~ I`����F��嵃v���&��K^U�*^�6U>,�V��{�:T�5zG�Fd������x|��4Z�ٲ�� �u�'�ʦ��"��Ww��[��f^�'0X�cx���������2��rK�J�J�D��������Jm��B�|CÁ=�55oc/�����h��N��L9�'0�jI��.��������� =$!_��3�s�^�>pX0�]S�c���Թ`gi�9��Q?�+�,O�|ek���kC)6b���f!)�,�M�����jQ����Z�F��_��Y[-�ۈfiv&���m�H�!�����`5o��I��xu�d��P#�F� +�P&�����h_2�n�nm��MsC�?�������w�����O��t�[P�k+�j��n��A ��ǐ�����H�ځ��Y�*�z��ל`�L﵋TL��0������1|w:4�4o�����(���%����j��̨5Y��J_���|���f������y�l0���0����D��O+/�.5�T�"��$8��[g)T`MH��?�Ɠ��\�fިÕyL/�\Z������j�@Ν(�W�ڢu�����d>�P"Y��d'$�$�ʗ���V�J+W�>pG��[��^���Gڻ����2|M 5��k�ci{��ZJb��ILF<�fB>�P��C��R7<]'�w����K�Í���QXb����*� +��$f»��~ ^�̈́:�)�]��}�p��A(��+�R���X�zE����;b1t�!���9�ݠ�B���j�`� d�>� ��!�L7g���h%����7n�ׅ��� �_Qg1�R2Ǽĸ:@�n�\�K�X������)�'�WI�C0hݤ�!XL}����4��l5� Vh2��,��?��bLb#(sÀy�tk]:ibP�_"��2S&�F�� ߆*:�/~���5�l�6���fݻ� ���Ӡ��v��(l1���u��;8��q������i�7m�L[�@��Wxl��g���� �Y<�#nMD��yY�ZO�E�X�;/C<_��IfG��u��R���O��M�++c�7�S�� +�4ƊaZ���ԃ������u���� Mߊ]�>]o����/�m^&=�Nh̕.�g*>d_�$�� +]�k����oj-���]��w�z��`��g`�@�XR�������SZ^6�u�V���^��o�����g��~X��Q�� �濮��a%{s T���p4{���HLydW�)YU�&R?��FD�/�'�g�H�7yO��G +�S0᪄�g :�po��)�-.XF:��e���*d�i��G{.㯙nwn.�t���Y���<�"��`����7�d��sSC���!�x$��g��:S����X9��Y������%�r_��']4K�� ��. q c�Yv�.㏢�Mr��m������*ADbW냊��M1�Dq�by��9���m��T'b�u�q�7�O�r����� ��}�y�XK�8���`����微�.;������~1K�}w���ҭ���rB;�ҏ�ޒ &�6 �Rr���*?j���䆑lu��g�ICk���M��|���v����h�ZY�Hn8�V��z��Q3N?�?��֫zGP������5�|No�(RG�J[�5���&Hs)qq}^�&2���n:z����ǰ�kFmP�03;7�N�s���i+Z�iӍ��� �^��z�s�7�T�m ,� ��zb�@��p����2�2{�9���6��ʄ��/�=� �4�)�c��� x +t&8�3��B��-�(;�^S��e���dSy�7yG^�H@�Es��7<�A��Q|��h�[�\j���e��Z�Ҏy1|i�-��M�']�����|�k!���3h{�&��m��5&[K�i��K%�}UE���k̀��u hT��[�*�F���kkO��Z �e�� ��e�v]G �ؼ;�G��L��W��[����d;o��o��3x�������Y{OEk[@��|�l��2��섐���^򒼗��F6a �9�u�UQ[�E�m�'*u�WA���w��:^WfA�w:�R�c��$DZ9-N�7���~c +� +?��;�A�34VfO� ����� 5��*Dv��Ue_�Rqr�_����pM�v��]���{�қ[;��f�4�( �c5ڑG����d�x�����E�jO����-n +|� �g8�� K��ٶŲ�]�{r3�J�(��?ұ���q�l��u;S7���qWA}�ǰ�����=��o +�n��xg�|�GCT�p�T�aH���͗O�0�U`llڤ�C�lt��0�j�h�~��pڱY�_�,x��'�,�IU�jn�\�[M�� z�����DB�b<Ô��]��T7S0C�o�}�2�%�s�F͘�MQ��� ś�!�7f�Sѕ&.!m����Fk����(+O� ���Oȏ��@ �W�1��f���G �0J��Z����-#�=����q�b>@@�g�IxFz�|�����޴\�E=�Y�g6�at�Һ*��SY�����5��T9vh� �� �%2{}n���}I�90�v zRf����8kO�ʼ��jV�o�:*�x��H3�_ 6�WWx�4�\;�5ju���K:��:i�7�rʶ��Y�Ad��~X����:J1<����;��e�� +(�;�M�s���rlڪ�U[y5�����vw�(k +-��Ol��H���WeG㐣�݆L9s����ŠFp6���i&x���Иp0�C2�}�Txm�C���H#�ѽZy�ڇ�m{��+�E�Aa����W��d�V�Sy%�ې���8b�ש"SLL����1�4�$Bs��&��B��j��&�d@��Y��?O��+82}����-D^�����ݒD��(��P��R��{���Ѭ.��s��!�$��4��P���ڣ���o\�i�(�����#�u"��D��8� +��:�]�C������>�6����ڒ������׶�*������m@1GQm �lìOrus�g#� tk-ۤ��<���v+l�U�w +]�@��V9�9'��3ի�� �P�?#�0eD�a���S���#�[%�����LY����ƉU��U�_n����F��η4F�/V[��&+�;�k�+�4e[D7\�~YCm[�D�����������4M���n/���9�0����:/[�o��`�K����(�� +��T��o��r M�8���FECw�LhT��l������� �;=���L�t��^r%���|�TXN��d�R3O>����^������G�)� y����ۂ�2��b�+�Pg�DW�B��;T��+�4Q�v�����{����9輵;���!f��6~/ė|@�r~��E�M�$,<��`�2���+��oM�ҿ$ȵk�뤆���)<$�\nnu|�LX������+z-]�:�r"���Xꗺ.KW�;���–YFC� �:�Aǔ+�I�U� u���+�U>.+͋�;�SN@]��� ���LU������X�Kx�6 ͑8=�*�U��4^q�ݗۥ>S韒�+�Ż �e�L��sf��� v?���m�!���'�粈�Y��v0��z�ْ2G����wT�1��e{B��H��M�,� �&fr(y���)�% ��P����� Ehl�% +$EVDĶ����t o�� \~6-�s��/�/���E��� 2<뤪t� ���:���mb��p��V�����n(Q�7:��ziZ����N�l*�3��m�iИ��`���� s���nX +�U��\П�b�i0���^Kc�=�!!{pwp�y��K��H��&�Ș/�U�D���g�#M@���1�����&����yf_s�Ir����Ŕ\ �B�c���7�H�e�x�Xl��tbu�!��hI +&)�� ֩�ršbp�s���;�Cu GF�q�~~c6RbO��'l�"<͖����z [��T���0}�5y V�|E�W�r��ф�\�2�aAA��0 ��/ɷW&a�A +���AK]מ �q\k�P���U�"�Jѻ�?�W���{��j#�'rG�^���$U��)~V�H�D��Tup����7��e��Ê⚊��R�"�I��^�w0�^�+m��O��X���iM��i�-T��5ȝ��'���N�]�~{e�� ��r���5Ճ�-w��A������-��V��YF~�Ug��BO�Jt�8y�0���.{K��O�(��vlJ� u�S��0��փy��k�^?��6W��c+� +�C���l�]��E�ko�%���ݼ�脦����g}�h0�[[���tVۃw,���U���^|}�X?����4:a<X� s��%���هU)��<�@Z�Q�/�[�6��� �.� �0A=��f���x�Iҗ��Q�l�3\�P�BoJ]Դ�\>[3��������?,���ЛMOyI�Oi>� �'�|���2��k��x��o��6��oy*��Zo�9��XY��i�����fNP?��1�k�𾠣�� *���_B����u�p�ֲB[� ����4X������φ��}�����P����73�d"�dٮ&�<����ăT�>���x4�Y��"��G��XF%N�g��t2��S 8.h��pq��܏��#~��2�Hl�eҢ��(j =����~�n$�� Y9P�K���C‰/�q䢘��&l���r��S��1��|�8��+�����ۺ���p5q �Z����(�QӸ�AX��!\�$$$C�srL2�$�L��%,���*OQ�u��Oł��BuUX뵊]�x��V��~�n�,��[�|�nC� +-�bY@�X?(�e�92�"կ)f�m��6@>��_�|�Xȼ ���L N�+VJ2�v&����ǂ��g�a:y�*=>�C�,꽅�zq����wΣa���V�bP$���Ԇ3H����* +|�t�c^�7�C�v��f�C���UʆN�\�A� X�)�M��Ȋ��Q�r�K{���Fۏe�"j��%��h��C�����i�24��.$�Ҳ�ɹ�D��Ӯ�?2����]HMt���a���PZ�+C��9�J*��_r%QN�H�4�r�{W)� |�em}�^�e ��ٻ +�.�v���_.e'T�)�V4��(F��o��Ugzf��0�=�r��ƣ�[(h��GjK��Ң��y�}����%�]�ʟ%��(y쭬��0�����L1���s�R1w^N�J�O�7� ��نy�oxõ��O���`�i0)�¿6T���@J���JL#��״��C��[!�)��9!���w�+����@,�&T��Q�0GU5����a�� +�5\1(���-�9]���������s�4���1y3���yʍ����/� ��G䇫~IĴ41��_�35g%@���.1N§� N�̡�P��i'�7����4��@r�z�8�Z?� ��i�;�f� +�c�E�N�O�ri@�D�������u{A�6.ѱ>1���_�:,� ��Jf?�/�L���C�N�N��*E]٭!�����mq�=p�)���ݍ� +�c�F�M�H���?��b;t�%�� 7�r�~�����L&�3>��ﰞ�~6slD'9�?��6��T­�ϙ��^ 5�;� +k[�}����gX0^h�q$W�KJm3�qV/f�̔��&��|�}3����1���s�O[�9�"6��ε�6 �9�K���+�|d���j�8a�&�k��ɐ���=9w�U�ͩ��?�������|����0,����lug��z��eU,}*� ��e-���^u��G�S���oy��7��7��bC#Q����ş�n��[�,( ��l�^ 6���!���ʌ�>�"�:�j���biq������2�$V1�\$���Ǖw��kGԣ����Q���%�[�����`�ѐ�J� Ή `��]���+Y�)�u�!*�5��(H��Id��a�oE�lw1��7�����hY�xЈr���M��y�A39S��cLYg�Bل*d��lQ��� ���P/���Džm���l)��I�R�`i��?Ğ���A��Y訌�:��e���t��/� �y�sn琸�M����>d�SG�&H�P���e*p���:��v��F���ӫ�}9��|%*�C��d�ڌ����T���m ؍��θSV��k��q�����~V�Q< ��f�� +�C�B��'��L�H�?� 6���ǍZWz��jxA�|�+cs�h�i�#a�43��� �K�Zr?�'H:���m�2��A�Ľ �e�Эd�c�M^��k�^�C�j#,���@D�L2���I~tHGǫ��J̀�e�� � W`_q�Z�b�� +�"�p�p߄CH�� I&�d2�L�)x�ʪ��*j�XEtJ�J]�EZ_=@�X��Y�����#>�(�U���T��#tg��E �����U�O4E���]cD��ix`Ff����w0b(���U +��Y��]sA��vj�fh�w@A,b��x#�i���u+����E���_�X��x˼U-�E�W'��_�@��c�e2b1(�� h�^EN�� +�`V�[@-k��b���n�_P����e�:��60���������l�u-'\��j|D�me;��tH�GD�˪&����աD!ߪ�@��M��?B�=�r���Εt<�GH�8�Jd ��l�M���i�lv>Sw��o2�Y�!�;DL��ž�]��򮆁�����˶�R�����f;˷��-r��0�ۏ첸�R}�"��?5#��mk+3�(���(.���R���xP{K$ ���~?uX� m�����(U$C[K����Il9v���L�"�F���]C2q�.�OI�6�1�Q��x� �1i��Q�Zxl��e_��)O&uZ���C�j7$6����} �A~��8zX�������m�b|�n�^i>�]��fQ����Bch�JDj^�� k��]�r�ou��#I���h +8ЂTc�1)�ü��W�+�-�*�kx�u��e�I�~���PE�:���LR] &��t-¬^�*$M�4-�b������B ����c��鎳�A9Z�u�K�Dۄ������T}��p�p;dz��x0w +� ��7 ? r����lJ�����U/�3B��K3h��f@��j�m1��R�זD*��p����֓�2��O�(Vv�� +n���d���mMAO���;�1�S`�M����-a6��)��N�˛,��_ +�l[c�.H�і%�Ŗش+#]l��c�ٶ����$ �s�~�&���b�~In^�Y�6-�쪸ʟ���/F�R��a` �����Ei|��o���$Գ��h:)=�k�Zv��6���g|V'E����;�R�����^�t\"ZW�� +Y���nN'⢒���Li�K�[��!6b����jnf�$=�+ *�.Ӄ���K�vI�chP�*%�z��ډ,1-�pGs���D�8D�C7x��&�X���8e�!j5kL��4�Y�� ��&Xq���Y�LA)$�]�s�_g�^.��[����fx���́{�s��Hq� �� ������o���݌�� K���Fa�a)1$Poגי�DO̐Ń��w�q?0$װ����ޮxYZ�N��8$��8�� _ُ$�`�l�cZ��6��ݐ?�ȇY�+�0�H5z�ቔkQ}Ö!���~QQ���2�&P{B�cH��|��7g�z�9^sy��l������u^�A� �;�R�ckU�>�)����v�Q� 8�:oV�c���s�K���6��8#7�>^nNk�_�<w�*>��m�ڹ3���"Ψ��Ţl�`���� D#��������ޣ7W-��#���h���<�L�qf6��6@��0}����ك�i���h�� �� �ӛ��R�$�0�a�p��s���T9��˟� sJЫ��lO��I�w7±A8j^Տ�ork�l��17�x�&��e���o��U��d!SQ2��b+��(k�m\5���/���>�D��:G"DxA4� >���X�(� �� �6b��-X>����*�'q�k�xO��OX�+�{�5�| fP|~NE����z�E�y?��|�S���-�2��<�3��}����=���`�[��~���#l���t��G���P���j_� �_���߷,����c��n�$k��a�����M�=U�lM�Q���"g��Ɇ 5iЉ�5M�%7R�%q���v�L�S�G�[]]��M���� vK�s��w��>���q|� +�7�p�L=��#.��[��CjϨ��^w�UOl���Tv�Ce�����������]�j2��0�uuFf�ձ��ʪ�:�AƆ"E�*��S��'_ +�!���Z�:���Qpt��4��7�rv�윽Ys��9��{�<����Fr��׃d�+G1 F�~ /b�m1�&��&x���,� ^� �LtZn��D<�t"��7�4�"���ף.9���m��-��6��Iq�5�����5.1g�)�j�����������!0��OD<%n�{?ns ��������8�Y����F<�p ���r�wPq�D��!\ ���F���KA��^���Z�Ũ�ˍ� �R���휃�E��Ꮵ��l�a�������?��aZ�뵘lt�U��t�W�z������s1��͘iea1�����M�1�g͞���v��w���� ��x��e�W�m��O�V�����u�m6l�Ǧ�mav��ov�u��m�w8�������m�^wO/o�}����?t���c�N� :|���s�/\ �u9:&�J\|B"�D�1X I�dJ��Դ�k�Y����y��Bz���bs�<��D(K�2��T�*+���RWkjj봺z}CcSsKk[{���������[}��w�������>z4����g�?�x����7o߽�0���6m��3fB|=k���s��Λ� 4�|K��5~X��p���%�&�(�*�,�.�0���<��6��6�4^�����?|�X@`P�sB�#�b�$ PX<1����A͹�O�3�l.O I�r���O�S��#?UB�P' +�B�P��T;��}� *~>22 +E�OL���_�~���[�������� g ,v�,�cy]�zF��l�(��}FVύP�q㫪���J6�A�$�*�H���$���Ρ�����`v0;��f�×9�zL2���ٞQC|�Q�M5���x��zA�R+��Ԕ k*x��Gj�sH�%Ť^Va�ݼ����r~��Lȡ�3h��5$؋�#����2��'$ �� +�,��F�P].����V!���fo��Dc&�2`* �_'ǹ{# ݰw%{2��>��aQ�*X�� SV*�5r1V/��\�����2���d��L9�x~d����E �]0� +���^z[�AKm���<�L!���� |���t䳁�,&p#�A�e* �aʁ�'pB�r�� }��1��zw�A���j$��� +�,��9�Kͅ|�-��7\c��L� Sy� r���Rꈼ_��bl؞�Ұ�U��KT�U|YB[��3�@S��J���Ӹ�!�C�2�)gO��|�dgس�u�����zw��2P�W^R�d���\=M4� +�� �z�Oh'���7�@�nOP��J�-�y���V;Lg�]f�Γ'�R���j�^[(���Ā� +y�C�B I@l3�o?� �q�M����zۨ{�6����T�և�*?]FW^V���|�.G�2 �T�!YHl" Iͦ +~���]��tˑ�ն��:6^��m5�������� +�)��U� +�&G��͒�ҥ�U �>IL�ŤSK�`�`�;��m\�o����j��c{.]w�{]}A�][�U���T�5�䄚T9��"#֑�$-QJ֙ +(���R;�7������n^���윆����a�:V�V�T����ST@e���&��� +�P�kL�l���vw���6�Է�U8{`>��5#��8-Eʦhc�5I��j� ��ɱUx�(EU��������u=X�U=���ux�}{tj�G +�����4�a�(=���Gr��(n�Ë���qZ��T�i�����vU�肝��� F7�� :&|�ؾ����ĮȬ8CLNlG\nt{B��vx~T2?�]ъ�����?����:��B':���� ����n��A���S�+���w.�"nG%���PB��RBz�^�ML�p�z�&*�T@�� �mH����h���؇��Dc���΢��&Z�T_Wj �5yI5���LOї��5��m + � �һE��/��`v0;��f��ˡp��;�ϙ־�A���}��U�l��K��8��SQC#k�דtY�FU��VEr�AF̾!���b7���E�|��{�e�� ��w��Y�쓌�E��8�T�@V�4U4��<7�I�Ii�����������A(��R��@�����: j:��8������v��ug����*t��E@EQ��*�r �럄B��;� !�rI�C@V@�]��_���Ӈ�Q����5��<�n��.>��U�W�/)�a�Y�/-Ry%�F���2"�  InK/i��"�t��Y�{�p�8d�|�Q\Đx�i'6ĩ/�U�Ui��5��gԧye�bLY��(k�e��&�\1q�(h��-����Ev;w��Λ�6 ��!5kC�(x�H��@����m�՝�N��&ו�y UF�e�a�f5n\+#�$�,�۾���.�w���A��ڐ&�T%_}ؗ�Y6"�s� ��9G��&��j�� �ơ���R9a�WL����t~�-��m� ��A���Nv$�&��! �2p��0t�{z$�?5Z uTj���]Ġ��`9��t�& f,���h�؈!�%g�S$��&T<6n�cK /��'z&��b�p��`F*��8b�(�@����H3x!}'�: yo8�I��P&\���P����{�C��@R�t(���ɓ�ʌ*rH1𵐗��&���d��x'�McČ��`�$f��>��m|�S�~䃱ؕ�$�x0�mq]P��e&� i�#�eF6AWB~��8��QChi�T�ɞ <|�����]z��[u*�nz!�b�g��9�Ԓ�r3l��q X�r3"��� >��4�SPh=m@����A�8� {Ͼ�+\�Ǖ--�F�����3a��@��4�M�6�;ҩ'�Z���8JԐ�pj��j�6 �D�z�Q0�'����չ=��;Q���v��(��X���� �N#��0-z���#��}���2��Ң�����>�ƾ#�Ah��w��8Vw�5�C�/[�r�:mU�5�f�Y���H�7H�����)N���6��S P��X�'>�}�<��5ӽ�e�~y'NNdtO���ݗd��jM� ��Z��̓x3�Y��A��dE��CM&�-ڀjG �o����ž�����>ْm\��-��u� �Z���T��S#%��xG�;�Ѣ�8]�0^�`#�Hƺ����b~ں�n����A��-9���*�V��i��TR8� +��`'�yM>��a�AT�m#GђZVZ��˪ݐ��ETD������_l �}�m�ϒdo�8�z�����P���c�)���Vd�jG�T �*��:YϪ �z*�M���S�qK�P�}���W7��K۫Ov*�o���m;C��z�z�q�t}�J���e��V�l��|e��ryI�t��V2�j)�k��b腳��h �����?��|��lIl�N^�mz�Qr}�\E���+������ݫl(�[�Xp��1ٔ�Z��[m@_Xi�䮠����p��v�f�y�?q�)����?GZ�3�=��@W��� =T�����2lvsd�rڰ�P챢�ށz��E    ���� ���q�5�Y�Tp +yO�C�Ż���R�eb &��l�[Ghm������b9��M�%��>]8��!p���~�{��g���k�l’�B�4�2?ȩV����n���I�����6 +�e%2G-8�o ��Q����P6n�c���N/J/�F�Q�&= }-9�>#,� �+�>n���ƙ�,��Π� ��z,�>3�'Џ�ԍ���I�����6�M���o$G������Wd�o�s�f��ܐ�T:�jGyh��K�ڻ)k[��Le���ٓ���#�ceA>V�l� ��������o�iE�Ǫ�2p˪l�Me.{J~I�T��"��C�vn�c���5�3�}-���"Ðh�I'ِ,���kHM"D�[Yj�sUZ�CM:f��D˂�+�)U� +��N�a��a␽Zfk@�� �0�,��"IBL�tr�AlĐ �� N9�V�r�:��#�Q��1��h�a� x!c��oD��jԀE������_�dLq�i&]8�N�L�S����NI��S��/�)W����K�lƜ5�==\�[jTv]�٨@�(��W�K�s�m!fwO��)�ii�L�ڤ���?鑓�#�tɕOL�=�?ٯ������9��,o�9̳��t���2����UA��P��@C6����-!d!��@ BB6�B�ĂQD���k���op��9��4����M��re���9�*��Ӎ������RM��d�0W�:�r�B�5*G1G�R�Bd; �ib"P'd�h8^��`B��5yϕJ\ ���L�΄*nW��2���b�߭�L�)�3t�*E&�' �sd�r* ��i����@s��?��/=:V�h,~ߗ��;{���u15����k�}6�EnA;��xo��bh�S$u�,N%��ɕ�8�j�� ��'����q/�q�O=�`�S)����г �,�T���ר�s���=@o5�-z�$^˚Fk�3(�l�UA�?5(��!�4���v��(_uw1�f�f:�w-�}h�X��Kvz�q��A���O�Q�� NϜ@�:&�z�$B/� ��$Gc�*�8�?���z0�;ߗ��]�/ZZ���V��#sY]�X&q�zlK�NC���d P¶�G�F������ޜ�=��;�����èj��!,�z�5�ϥ�+D�`���C��^����n��"�NJ��f�9�0 2����?��������}�ɉ��=y���Ν���i*��m��Jn�L����6M�$_��e A� (��$e��EU����� Ȁ�ӏ^9���������,�>I�oG�s}YE�HBW����h���֯�յ�������YTw�L3�r�S1M��O�eS-��)*d`���[�������hh��%؝��j��ӣ��͓��\$|�[��X�RK���@-_��J���oЌ+כ�ŋ8V�"����]�?���/&�����������{���d_$]B?�,k�ʯ������2x�F5�x�u�n#��s���� +[�������o�y�D��s?����{h�ow���1,��8 �f�L?��CVA��yE%� +K.?)-������amU���� [�5�[�ڜ���Ⱥ�Mt��M�0���o�?�s�}*�Ϝ|-��.̩� �{JZV�u �(�lIne�C�6�����%�F��Q������n�j̍�;\M�{��w ��5��6��4��q@p�$��{�{�bK��XQVx� �&�\^f��A{�O�򒻭��m�����.���B����0b�� ���@��ħ/��d�?��4m�/�o +��y0��w��A6k��lo�z�=vV�tbd.R�C�{,�DŽ4����]@��Г z�Ӂ4#���L�#y��,�xK|�}]Xÿ�C���>�A𵲇�i�6��p�D�1�|܎��,H�ψ���P�(@c��� �ii@���Rq���2��[eaU^��FR��6J�z��!���` {��v'��� ��f��Q��m�)0}^(�6Rc�$5 (�r~P�,y�9��wM�:���(�^�։gDH�D��ϡy�l������"�0A4�t!5F�5�bl��� ”#@�� +�)�ۚ�+Ou�`����;�\� mqׂ�Z4+�+'�8���bqu2Ǭ�N� ���G��t$���� ���F��7 �G�,)�������O '�6��b��gSo��/+�Wu��������Q.ml���c`rj�($oQM +��0��rIF?�i����#@���I�_�S�����>8�Z7g�W-[���ܫ�� J?&�[���1Ck\����B�"�mф;[���� + ���7q��D +�$f�Øt�;Sj͖%q�z��f�g,��;�-�^��Q`-}"Ҙ�G�H���v��- �35Sl�.�J7��oÉ�@�� ���5�p�Ng�mw���ٱ�ٙ�mu���*ꊸ����/#7H �NH  ��@HB��\�$77!�P���x�E�.�o�v��[������O���8������bD>��������Π����)Q���6A�Y�-�a�W�j�LGU-o��F�7k1Fj�@3����\=ۉ� <��'��#Gޙ�?���u��ߎ�o� �q���xeP I�É�h1�nzY���=�W�u M��զ��g��ԥ��'�(e]-gCGi.�];^���ɹ�>�~��o�[?)� �oO�P^�M!=�aǠ����tR�l69m^�rU�4��\� O��%�%�-,O�]T�B��*s�;�?M���w�+��Pm���v{ւC)��#H������ܥ��O��)�i����h�\L�C.�!�K��'b��1� ����HQs�.�����w��{�ϟ��/�2��Tp� �c6�#s6"���b�I��)���i�+��˰��exV��z�:;�9� ��s�YAn�S�K�G?��v��O������W{����$����a �R*����ը��1�o���7��l���� ���˯�WC^������kh��+���qf7� :�B|�J�+*�u}B�2#�P�C���Ѧˋ�S%e���*���:�g� c�Ch�܁li��)� +�`�Fm�5�{����kï �� ��5���!>s���^���sUX�t�9UJ厓���7��YΆ�-P��7 $*g�z0W��]y�����l`\:XA>�s9�7<�5'&c�E=ff��ӕD�dyi�x M8ZH�6�.����"4F�m Iz���9��)�d�1�� ź� F+)mju�@a��7�g��DfFiUcԝR��ڊ�X�x�i�>6|X�G��/@@+$���k��a�����Qbќ0��/�n�M��ҋ��]%�:c!ר�ZTxY� ��jq4�F�ּ]X��yw�?����=5a'��v:�u�]��㌵��u=���,�"�@n9� �$$!�+���E�@�AHGBB�p��EA.�"(�hA� P�뷙�ӗ}�Ї��w� +oP�E�i������ԑ9�q�ͩ�[ �q)Q<\U�h.g�Y}��WS(35Q���EJ�Yj)zS ��h/P�k�����<�^~��'���?aS�|�� ��A� :8}F�/�R�+�����|����cha +� 4�Y^��H���j��ZU�7 +����[C��1 ?w�<}A�w�{�_�K�yē����]P�m�p\�+�ؐ-� T�źˠ���RV�YĐ[�t��X;�-i�(i���7[�9GP�q4z��g�6����@���0�=4kֈ�\�c�-M�ANTij ��*�A�+7V� �|��ZQ�4�f��m�l��d/ �5����@�� +�ݽ��#�]�w̋���Usri07mN� w�ˌ|��!W��Q�RQI���c� fWlerU���:Gg���&{�� q? +�n.��� �����|f�0�rg$u͚B���8�6���9�A�$�Vˊ:�bVoi �L�,EU���J�@!Og)�Л�����@�v4�>4�=A�[�+�g�� $fy4"nv,9r1��gJc�:�5J-AY�L�� +:J匞Y��*��ϗȭy�5�Zg!W�����6�����@����@6,�G����D�OMBӆF`�+��٘^-��+*u�j���/i�u�UcnC�9K)��7h�����s�z����� �5�]��N��������ٰ;��Td~>T�J�4& *��o��w��}�� ��u��?���z�X�c���Α�ggS�+~���P2u.���3�M��V�&����*��1Z,�_e����%I#\i�P�pYRg/Pph������m�s�Y��}��~'�kG��s4���T�j`�ޅ��X~>�3�e�n؈��2�4�"y�� ���'�����ʸq~t�Zh/���5�����k���o�f�صO�a��8�s߸F�_�$����@3q˰<�R �����d%��'���nQ�q����4f�M+���Ҩ|������׆�n��|�q���j��p�Ch��#�/ⳟ_�c�bQ�G0l� +�%=+�>>'n9;7�^^^�=1�.5?j���D'_X,�D,�Q��n�����?��t��/����J���\p� ��&��w!��ב���0؋���g�T�StZ�*j���|��� D„=�bC�B�3�WYx{�o��t}�5�[�,�w������$ ���4LB�A#�oaQQ���\x�����ą�ʈ}IH��N��K �ȇ�ߠ�� ��K��e���'�s�}*_}�;v����$p��;���$p�\,��1~ �?$�� � + +��� ��!� +9�~��|?��}�S����R���wp����^@��Y�H{��VD�rqQ�"�Ş'Vpo�TU�$�V�d�DױJ�tz�t +�*�B��M"{�i��1�����a�=~o����ض�R[�� ��Q!��q/��e��UV.y�VH[(`��I����ʪY���L<�SJ�0Mu��V���~٫�@(���C��[����=着0�#�?��/0�S.2s�C -3)��bg����$�395���t2C!��6+�ӵ�khC�5�Iu�?F�;��;���?�z��{w��]-�SUԧU� ""{*(CF� +DF$L�@ �;���/�d:�!��Zu]�{��w����T �*��ʇ��F����9xɉ��Y��9E���G4v����؊�?�Ƹ�@��ֱ���B��J�|��/7)�˜����b@Ջ<��*���@��;��€ ��f��e>� 1K�Wi��E2�c���9��rg0]����D��g�Q])����ܚd��]ѯ�W�iMU}:o��@�:�vN�?ćѱ�@���F�q�?��.�[cT��(��y�1�o�M70œh~�8J���h.#l�QD���ҭ�W��F�[�����3j;�E���#@����O���<��~����.;��YK��h�k&�qt�d=��r�T}�J����+z�PU��X}Ψ�9gT��z�<�����#��8:���<1��)y/�%O$y����evU�m:�>Cn�^!R$��,�@�P��18Q�r� �.���e�F��Һs&o|<�#�A��D�1�@q4�7剜_���NJ��5yvAT�<��P�hx�0�,��w*�\��^j4�5]�ͪD;��:�U�qZ�W�s��~���,�0PD�u������gڴ‡�lIJ�}����8Ma��)�BU��,��QdRb�n��&�8����mpZ9�.�7>8a�@��Â�*2 +hc�^�3~1��3�J�E�i�颸����r!:Aj$�U��^N���Mr���s!�����&����xt�~8���ۀ��>�4�@s�W�Ѵ�m)9�PV�-kQŸ��iP��8��S�Y��FR��4���c�4Kl] �I�C4<Q ��z�á�s���!{�2� Ѕ��f�NxfKH~�Jμ��Οu�F^4��܊����p�rf�J@�г:���6��BRBd���� +Am-[[��ꍏ��m@��Ch�[kd�+>�~r��`v��S�!��C����k��B�D��+Y]d=��a&���JD���;Dlw؛��7c�_�so����` + y툈z���6��tk4 6֗��7Z ��*�-��Kآ&%�ת#q�fB׆cʡ��2 G��MT���C?�����.�X�� [��Z�H�����5:�W�t6譥d����U�E��FIҬŋ(��ZǗ�kxZ����,����z0=�� >�=P���~����?�Y�9=1��y~4����t��V$�a��i��x%A��!j�Ls�LdE�Զr��V!tZQ<����s`�i���� ,{߸�?�x���Q��#/N�e��`%���z�yx+�U��nG��z)�xVY�'i��NC�V`�k��"��|Fy�T&�`y������'_��z>����#�n/F�\L���z�2���Cs/)��Tb%Ӌ�\8y��U ��B��+��|Ȫ/����:��� ��{7Ӟ޸��h�o��;A[����,��8N����(��V�'O7������*� �����x�Uzj�ޝ;�Wd�(aCV%l`P��Pyp<����}�捑�^��g�Օ���B�kQG5w�a…g����7�p�kŭ�Y�l���hd����˿L�^b��/IİK�(�����9�w} ۿy���7�S[��Z�����h=(L�0��~l.}-����Z�Y�n@�."��@����P +g�SDF�d{W���5��d�˸�:n�8� ������\���o3K>^��=ݻ_�%�%4��$&��8�� ��j%��| ���A +oմ��Ķ�^Ƿî�:�f�Ԍ&�� ��6-�L��zH|� ���b�?����ӑu����[}U�� +^��^��_��b6��Q�Y������U8��2��Tݘ��i�-4�3�4�o��'�iͩ��ZRn +Z�o�H��͟�s��ӹ��?}����W>ߪ�m���7� +�b��#�1��e����n�� ��?�#s"*a�Q��{u5�k �i�xt�JK}� +��L���jH��� +0}�����0:����[gAM v��t�v�3�t�љvZuծ]��u�C�;r�CDD ��@ !`BBHHB�r�;��\B���ZP�X��nŋu�� ���؇}��f~/������76ذQ ����@Bbh�\��Y��u��un^�R!�� lQ�wL�s6���H-M{��#��R�p�R�ʒKʓ���7k׌M�rM��'����?��g�İk�S!"� q8@&� ���x�w���3�Ks�ޖG�!禼�:�����􊑟��� �%����X~H�<�齾v�m�Wka��İu�~A���D� +(Dh>�F����,�A�C~�I)��o|J"��&����x��ŭԤǮ03b��gF��}P����M}�3-�z���[6|�Ǔ�oK�@C��' �룐��A����� P�tD`#c��{xʢ���H���jl80bÀ�!s�'�<�jc�/q/Ӄ@� �|� +�8�-� ��QMxFeU>��i�HR�|������/1����{��.�K<[�'�-<+�A�IgPW�7 �K��� �g����� +��� N ���H]iD����/X�"�IY����E���M�o��(��� +g�]�Yt�d��_6]8��|�pR~ =)��L�}�U�z�����{@� yf4HsRA�:�VPR�����X[CY�q��Du*ܹr��.� ��Y%3X�lsZ~=��*UN^i��\U^,��t{�gP�5�y ��- A�Er(ӣA�����eQq�����>IY`��<<)`?����5�Y�^2]b����+�0g�n�Ϫn]T_�\V�c/�=�˚�%>����x[@���A����#I��=�,-B- ��g ��Vm�<�Ǿ_%�߭P�f�ZewJ-�۸�?�{5��#�� �%��Sr�y�����UC�� �� ��ݠ>���Ф'��X��ʂ��Rl�Fy�C���r�sT��I��0%ŭ�Ґ���Ǟ���݌!�W���i�� ��K�F�M�vW�Z��fC?�������]>jq�F-V��Ty�l���?d^�6b�#�Sl0�b�Y��K���O̹�4�KftD�uE5s����px�!�D�GS�vWL��v��|�j'�mm����c�U�Z�գ_��E�&Ѕmc�~0�� �֑��ܙ���y��W���k�:nv}�þv �sv$4��y4A֏�K磻��2��n������uJ�����UaDG�2��2��2�qwQ؃���R�pa�WPg�����M/� �uL�nm�X�i�����vu:3��_0%yN䍡I/�ɴQ:�8��nj� ��%b�P�,|�Tv�@��������^@q���;$����8ΐ��BOG�hO����t��P_��__����r��:!͆�i`�=l���i_(x���1����r�a q��#Ь��$������� �� ��$v�@���m��dx��8�$� F{���8� +;��("���a��)^ST���S�� ��7���� +Ә>��ɟA�dL� �b�c�!�3쨠�bU�o����m`kR���S2i����@��1�ȏ�l�r���>>��^��@=͚#�K�+���ڴW�+�lc�4�`}_8�������1C���Q~u��6�hx�F �0�l? � �y�;H� �!?��)|�$Y�"3?i�V����徊�H�!�fL��S��I̝�It�x�#��{���v�MH��!��!��M@�0���c��r�?H�+��e.���%f�N�M�c�H����͐/dLk����� � �V-�<����I��ϥ�A����������=�j�2 !���}��A�P�t�<�d�F�d20��)䷩B��$9K�Tr_�K�Ӕr�dlM��N2��Y�ے�۝=���$d��>��I�9wȫ�_G� �7��^P��6P����%��Ȩ�ea�-��\`�X���L��)jY��F��X����| ך3����"�紒�jro�/���&�ꀣm�j�v;!��Nz�A1������ +1�+�d�)��V�a�s��YV.o*�X0N?'�Tg����<'�T�Zs�{�ZI=yw)=�?S�4О\�������� ���p���|��*�N�{���?(�ы +Q#e�MeX�q�i��Jѳ�R�SF���z9���X�FR����w�O�M�n�Uzw�Oq��KqOVg��Kx}E5��q�cu��(�:�ʢ2�� R��^��P)R @JH��C�"BE0 A\�� ���g��nև}����9���9? �^��!H�yY������z@-��F*#��1K���cH9}�b_�R�h2/s/g���f��� 97y��7� H���P������a ������0����WRX�3a�A *�v=A)%�(����j*5ybf?���7�� �+�@\��MH�@�2� �� ��P��7��]���AP�e���B<�*#������q� +r��|�h%�x�\N�/b�z�|VV�iè�-�� +5(n@�� +�^$����k� +��$���ub�� +wk����d�߁z�����f���������0��]1>���F��)�\d7KheR��U�r:[D��x%2Q5I%eu��aYI+��t�J�^�%�(G-��i��l \~N�S�y�U�����0��.Fy��a��M𔋵d�CPq d��&��؜��L,�Q��d��J��)��B�J)d��B֋�$SC� �w�N���yߧ6�Ʈ�6/���> +q����J�hMI�l��m���"Y�+�q��� &�WQ%�+�ŕm�������� +��T�����bs@���������@�ӞE��o�ܭ���-�~b0��������䤶��2'��rą� >�U�epK�y�B�B�c^��3��X�VV��IqUz1� >7�������O;A������t�����������z��B;��~ICț���F-��LZ�,�8G��K�(^�4��#��J��]�c�z�9���@�Y���A�����}�O�_\;��������n�z�G�PLh�%���%l�Ʋ.�I�*\Y��������(ؼ�X�%m�K�$i�k� �^�-!��Bs@�i�� +�?�l�u���������?o��v����9�ц�w�D���%H�S2�{31�����| +����n)c!��5�*!/�Q)Hj�&���I A�� �� |s��Psp�3�F����>�M/G�l|t�ĺκ�>�m�w3ȭU���N��ӑ��98�żbt�,��B�w2�I�j����Vs�:�L&9�Z&9�&�����^ M��a��ݕ���ɤ���v�O���e�q'�Ey+�_h��bh�'�G���DzCȺB(�k���AzE��*f��5�Ό�0"4ӌ��)ft��Pnj���X��o��]+o?سB�쨅手e��36M�$�Po��(u +v�0�������2`�R��y=�0^G/�����z*T�N �k��㷩a#3��� +s�r%�ۿ +��V���e��� ˴����?��s�i���1�ߓ��A�ԇa��q���I�w3�S��Y*v��5�(������Y51讆to�4��0x�Q�9���r�l�|��Wӆu�s��^�Y�~m�����Kw�|NQ^���#B��q��s���ғ�i1s�̈����9Zn�0/G�Ϸ`��{�|�������{�c�n[:6-���2vk-��oV��Z�m-�F�C ��q�����4F�c����qƴ�(c j�&��Rߕ��}�L�{#��}�����9����,��W�ϼ3 �, S��!��VC�fi�}ؼ��þM�G��N�K?z8���O�.{—��`�bc?���[BD/b�>b��S�P���o�9����3)�{��J<��#��}�Yw:W@F4� �WAZ�Y�۾��[h�Ϊ8,�v�� +]�#�xA�7���̀���}@a� �zZ�`C�? �O-�"ܖ#�>6�5ڷ�;��2�"{��+�vM%��\ �-��yp�I^vq����2_gQM�g�9�=ǥ=Gg��>�(*(�Ȏ��;�H�����d%| � ��,심���@EE�R�VOU����0��l*���w�o�{��_����;�C��i zC�g н����|_H���)O���m�;�ݠ0�ʃ]�ʬ��_Y4���(��"6����5p`��63�q' ܭ��c��~�3��!�>G� ��P��~�؎�wr��+ ..��:���r�N@���uᎅE�c ��*�lظ +�����z�H�MQ�� x��������zAԾ����DkW p���N�8t8�@`s$��@fk�a;P��Y�l�����n "��b H�Q�ƺ��������oc.᮳c�ً��9 ��ܹ�1�1���������?�` v뀍5�}w��G!�Bj�/�Y���D�}�鈿S +�+�����5�wq�����������Y���.���棇x�c�y/q��1�4o(v�7��kH�x�� ��A�An8�x�|A� +����e=�1��ı�.��$�{5p���נq� +&+����0ȋ9 ���55l e��Ԅ��J�tJ{�U�K�?Mj�>��"��k�>��G�>EO�sE7�ڙ��+���2�<�b )�׃��א���{�A���1(�r���hH<=�fDϠ��H:�X�N���KS2jd�К2�SB�Q��w)������봑�6�HV+c$��i���:����F�-P����,��SY��r �g��2m�G�k�q#(B�C�8�z���B�]NEz7���ܒ�I���N����/3����au#kX]�y�2x�V���:ȶ�yΛ��k������?T�9���>�k1`�0)쉑Kx��P{ +�]D#��؄t +J2:xՙ�&�V������"�_�����8C�j�7�1R���u�Ӳ +�6�Y�P��sM��ҹ��>���j���Y����,BO��z;[��Rd�:��MR�h�g7��5��V]=����{__�З�s���b����c �kA���EN�Bv?k��|��?0�j7��8�H89PE +�-a�o�Poꤜ�Y���B#k�� �����5�*a��\p�P&�k,� +E�|�>O<�3�Kb��XC�㟡�m+�y�~�oߛ�`������b<�&������Uȥ\5�9��颦�lY�€VɋTg�*uũ� �6c���dJ�3��F�t@��6�cv����`���^GK�q��;��}�^] +��h;c;����H �N�]/eS�� � ��V��Uf��Re�� ��$�7�e�MZYW�F�0W-�3����|@oΗ� l�1a ؜�u����m��%�]���V�;B=��v�B\pW-%�����\�g��KE�R�S�y*�ʐU��(������E�_0}&�7���9 ���@�͟� +�S��߮\t�n��c��u��O:�>h�p�{+!�Z#9�RM2���Ǫ* K��H�)��T*m�N��6���M2յ�4��\D�gB������9_2����?B�� p����%�M�u�m���w��������u��L���@#��p���BA^ ��S�T���:��:��8���iQ�i�m��lY"��Y�Y��9�}�^�Pd9(R�6�� �D�)L��I3� %�8���)��������������|�'r2$E9)y���W �ro���?(}S�ӑ���)� �֩ CO���ǥ]����%c7M�5Y,�i�Y��!i��F�y�-_RM-ϻ�R�?{9,��Rl��|RRF�$5�t����YqE�������7 � )�ɏ<ޑ��)� � Y4P��SF��5;��/x�W�����g-���^f7�2�����.Ԋ��U!AyW��2*R/}8�Bfz��c�%9�gʥAgj�ĥ:�NwJC��rg�EC�zu��6W���zs����ms��w��~a���������5��e�J�mN�� q��ȈԪ���k�Rb���WH���:&*���_V��/���+�w���_rDg�f�IkU�����[4Pe�1vGO}�MO���@�ٛ�K�_�o���mϕ���Y�'� �Yw�������F��HN�M?x=G�_s���b��:�Uݔɬy�ɮ|�ɭ��RA�b/+�զ�tU�|�J��� +�W�mR}�m��N����W���)6'�����|����c�DŽ�6%ň��w����3�\Heܩ��%�w_J�{����1�� GV(�d�2*uT�n�V�y��xիE���5��.���vmy����N���5���ҏ��.b�< �>����o�DrZ�c}[���-��U����$r��D���$j���� {�.�TB�2����/^�#.SjПS3�gi�{ݒ>'��O����q�b����_B�]�\~g��ݑ&ft�{w� �t\ �ꨎ��l�t�z��9���)z68�D W�o��Z�?u�#ꇗ�T ,��i���C�zҏNF�<,�i�QL�����?Л����O`��S���,�W��}���u���e��y�UL��+v��S��;3��$~�S'��� ��j���#*eߩ]�o^T,7Y�+��O�;'�=�#e4�@ӑ/�rdbO�,�B��&��xȏ����Y����h����u��X#w��v�ݗ� +C3깢L<��F�{�F�x�A\�T:�����۴�����|��O'�w7�S�x� [�ׁ>!r�L�:{NF��N&��&%�����S���T��˴}P<4�Mt��� +/f��V��wW��kS%*�4�ҩ��ǡ;� �Ra�:6�p`��F~ �0�cF����n�uF��#��#��G�!�� +E$K�s�@��9�]��0�������D� �T���e��8�v,����`X�`� �������N70�I��>��~�� r�>ę["���fȱ2E�>��ރ�w��f6uw���� ��� r�3W)˕���� �0��b� +�WS��� $x�9�[�Lkp�XB��A������{��c7$;��C#��@��!��M�O��/ �X/A�b��Ah)c���5��2� +�E�0�"�Z�+l�� x����j=���ir��$�5w«����� �/�U���r�c3���\���嬃h�D1w!���av%8���?)�b|������J��ؠ�s���~S�6�$� o��=��O�Q��3M�����������Ad��pm�:���f�2�ɷ@H��q$�K��ˡ�S� �YeL�T���~S�z���7I}��t ��_(Â�h#�t���!���� ��Nu�M5e��x�uH�،x�1b��Cp �= Ȣ�{�v)�K�i�5�)�Zޤw=��@0A}����N�7�PF�,���`Ȅݾr��<`&��O�l��X+m$9�C���iF�g�#Zd���= ̠�W���5���o��*o�Q+�����~(�F{.���0F�0L���w$�sD��% lg�gEw�:�v/@��2ڿ�.���b�����ϰ��=��l.R��-�:�{R�U��p#V�$BB�� Y$9Y�$�0B�aod�����(PW+^!,E�^�������y�>���9/��y��w��}�q�zP�!��q��O���( �CT�=��gd ���W o#�oŸ_F� M"�#Q/I�ѯȷP�(7b��5.�� 0w~��B~`9P�XT?�9�; �<�q���� +��'j��p1�Ƙ0o�E�ר*���F���<��� ~�L!f(#Q�Q�P/i�1s�k�9���9�= n�mq����b��5�_ 4!ۀ��?P���(�}�c�y�J MKB�$��g�s�f����2�dLe�N�E��F������c~c�Dϲ�1��� vK�}76���'P�^4����c�A�-�B��ǔ�}�7bj��6Ö#����qr&�)�D�Qa���c����n� �.{=����p��3�V�snC�sn�>@X��\���V���?,� ���!tǻ4���̡Y%�Դ�jH�#u�z:~��C�C��o��X}�:No\{�5�M�U�����?ͯ�O�+���r�3��n��w���f�B`�� ����9����H�Y}L���p���u��D�(0�9Z�MF�5��M.�t+y�&A ��� ?,�'L�����2򤨈2%����� `�u�M�����%�;����Ě����sy�~���QC|� ��%�'�bzjb7���2����zj���R�XM�I\I�-)'�K��b mB\@�ḨO�H�8�W����w~r���C��s��k�� 3�s�63��Q6���4r��6�[!¶K�&��~�������˙��F����"�D�]�?�L �4�9.5��%Y� �=7p��H��`�1��],��Y1W|r�T��MO��w��eC�/0m�|L�"�H�� +Q��o\J��h�K�ٍ��U��}_����6HϵIӹ�{n����� � �O��O�?|�{��e/ʏ��U�{P��u�''�L��٠K�T���2��^�fq� Ohg�K� ^�\��R����Q��?&� +lLj��wx�Ѭw����݂�{��"��YMв֞\;T�w�}�˄ nʦD֤�c�tB�5YN7)S�92� C�'N�E�E��C�,P�GI����1YR� �P��J�[�r������Y��¹�}�'}�K��5U�v�� �Y��/�Ηg1c��|�I'�S�CR����(N�Yd*�R!�Z�2�_ɞ*!hTAc2����p�x�3H]��}=@�����]�_��Y0���^���}�gwt�# cOU� E�ttAV�����J�N��S��r�Y&U�+U�J��J�����E�1�Ha���U�@�5����i�������kwxN���|ҹ�k�5��zC���������'K����Ԙ�<^�-�j3��$��/K5�u&��-Qp5 J�暒�Qr4�rn�,Am�����@7d���K[�>Tluٰ�}�s��ë� o�txՕ�`ߦ��*�P'�����B2�p��5 (�\���R'� �G�&�w5\gZ׻�^��<|}���W�w��V�Pr9꘩{.���+a�%��R��!(Pq9���<���c��952|N�<>�g�83mR�a�.��� $�r��t��� >�SWV:�rk���>��W�X��}rKEG�K 2�؀9�ZG@$U�b�\��TDc+شB-�h��.Y�K�}�6(E[�%XӸ$.wBl���y;� +�OU+��ڼG����r꽳ݳ��Қ�7����y(��n���)(A=Ǯ��52:�Z��Vf$�+̂�J��]���#���EO�P�)�=@��/q֯��/qx���po�ӡ��r�Ο}=��K��+��3�F���NȺ�� :�VMi��� ӒLC5���vDS7����<��]~�QmP.rF/P���m��`��C߽yݏ�:6��Ž�ў%��GVg �� �uDЏ f��B)7��^^L�u)6�Z2>����u�䝆�c Ъh](VED$ +�*���d��/�FI� +� ��Œb��#ngT-.uGܷ��0�n� +�B����39��+r��?����%�R�C]9�˻R���z��U.y�;�w�;�l�`�W��q��y��-g��?c�S�_�i���y����=*�|� BKZ��JO6>�b��)MS�X�T*�4V��Uj^cu:��Zvc���tW�n��`>�ӳ~�˴[��9N;W/9��'��%j:f8�����#�m�ϲ�L�����viTv�:^ۖ��֚ǔ�.�[W���d�1�u���V#e�����ߴj�����%?P�b�v$�k���4����mv!�&��2yҶ��]7tG�۝8������ ��/�t)�]�8IWN���0�׵���^�bvWrR��s�L�y��c��?��=����*��˷�� ��/����m�� ���$������K�Q��� ���T��L�� �e��P�`F80+�c�_ĴŦXJ�U$& U%� �J�>�=r25j�"#�C##��K�n�D]�=q�=��ɑ���gD�Gw��>ѝW!p|!�ݲ7=�^Jp|��R��q�^��>(9!�Q����( ����H����a�Y��1!��;����BG.��;Q�ȞX?2�n ����)~c3:Q��/�H�&à r"�d(|���!�/1��B������?���T��`���G�MG� b� ��� ֶ�j��+��}<�Aw�#`� 'p3���nI`�ǃ�Ѵ(ȦG@=# :�d� �R�����y��=[���9��}�Ʀ����߷��� V��|���a��S��t��D�}���Hp G��P�'����'�C>i>ԓ}��<9S|P�6%_z����=P5uv�1�� ġ�P/r�.� �ܙ�I�H�@Z^(�%Q�| ��D�J�/�&8�X`�a����:�$�I���!����a� ��x��a��;�{K����!�Ȉr�a��93aӡ�@� +eq��q�u1�S���y�n-��\�H�n��l��f����裆X�T?g�o"����a��H��i�9C� +c�rY3a�aH @FVҖEC�m<$�� �1�n&x� k���&�i��}�V3� ��#�~�{P�i�� کaa5, �>.�A� C�+�Ĺ!��<��2��0�DC�:���oe@X�u� �Q�S|p�S�\��(��n���D�{�;rP�o��,�'�!��6@f� �A� c�8�L�ש(�� _��6 ��h��L�j] +䛙��āh���'��#�N�wY���3��a��)X�<��,��a�&Fc42��Q��)mkD�����,�B��g��_� �ܒ��Z��T����O�.P�&6+%��_e�- ���/ _'�E���}�4�p��R4��B�o��`,L�\�j�V���[x�����~�IvX�%=!+9�x-���7+_�_)[��T-��=�YsSn�\V��/*G�5�f. 9s�Pl�8���P���Y^X#��*E�P�.r`i^|onI�)k-筮����E��җ���vE���l�S�e�c�M�셦Y֓~G�>��A�^W�֯;�����8"߇�UcP���wG���s-�}�5�bc����)���pڳ�S�2�$�kw�[4�UՇ5������w��t��O�7T]�K���zu�ᔦ�p<��p,ctPY3dz;���/J�?G�� ��ʔC��9}��~�kUa������O�^�i�[+h2VJ���n�57��^K�YEs�pI}%낺)�����3�=��=ƣ�c��'���ݨ�6��^�(������aS�+6�L�X�4�}���7�o�FyP�:}�o�K��Vq�.[#���B~5wsڥ�� {��������S���]_QM�i��P��XP��2*:�� +�� қR �ɗ� ��Ih��%t!�Q"ʂh��x�w�#I�Y �f��o�:^�������O������ERS�"��H���N�� +8����LA�Ȳ5���,�2��_*\7���{�|�Ž�%a?<ˏ=���?� �JI ���EޢĨȥ��ۅo�w�:����f�0E���4�(��7�*����H��w #��jc�\ ��[����Y��X-Tyl����f�"�n�(��<��=ŷ?�|#�jd7+'�T��J��5�k���r��ZC�K�&<�K�:Z%IO����7�8�+�6�9��(8�.?b�\����̺�:�M/꼷�, �Ք]r`\�sH��3A]i�ȶ+��&vAB�,IF�"I�rj%��^N��(�P)�5TL�х4=M@[�~�̦#�����3�+�}��Xlp\�J�~Z���#����ʈ꒸s�B<�+�Ԛ�)��S��M�J)�W�Ť2f=��P�z��g�d�1�P.SG�a�i�!p2���o;�:��ڭX�?f�k:a1�vz͓f7��~�V��+�9�,���PsX2^Z�$=+A���S+ȅ)����V(��b��#,^� &/Y��L�A��z���X��H�f}g�!����������mG͞w���hs�:����6��^I�K�(�[^L +�0"Ĺ�1eY�af>?����VM��63�rz�\�?Y� B��r����s9z�!p2;i�k#�|��r���[�a�[�!�g=�,Ʈ�l�ׂ�w�1�XW�e�f ƫVD����)���tL^Nn?���Γ�8�rFJF7��q���x��g�3�Pr���|UO3& �S�5��`��їƽ���}�/�0~��_5�t�<�᳷�9�h[C䙆�xO�$�_TN ���r��0��󖻍\�g'�9Y��ߎA�Z��-�՘M��O����d%LM59���U}�v��!�5J�@��X�Ė�1f�G�y�P�d�вp�.O8���0v�9���f< smO��v�c���b��8��fZ�p��(%-�$T�,��,5��K3�4��HDuQ�P"Kٗd�ZN<�9����\��v�updi��}��{����>�����������Q���� ����`��>�7�ZN�HM���$R�C��Æ��Gda�����+2Z���B�'p��Ăp2�S������Hr]������ +�j� ����yh��C�_���K^�h���yb�5b�=����lО���# p�Q��,�[��8X��G*�c�����E�_�O��D�N�C��VN�š)�����i��8�G���U;ۈ�����&��_�HfPHZ�!I��!q�"��E���mB�"�~>"��p�g�#�!��(Ohg�����3a��N�Q�4��N�B�8k�C{�-�!v�,t���5�J� d ���@T~�|p7���c1�?�#�H�KAo��*�V�����"t�@�' �@� P{��}dY�7�` +b�� u�:� Z�34b(����@�,�����i!�����֡%`��D��(0~���N����}���� ��G6�9��?CL � [(B�[�=� q.Ш=�4�B�qq������%���x�g�`]��y��=�;�{���5���x��5,k 2�)���Bl��p'���0�\�Wx@c�2;�U ._ QM;#�����tp[�\��6s������������cc~�����p�����G����{�Ü�ʘ�T� �e0�}���� �5a�lZ���(���~��'���gY�b.�cn��y�8=�לO�O�1��1�v +�{*D̿D�[�!އ��-L�쑾h �h�ś����H�� 1%:K谺8|H�!rP��6 ����c��a�=��,���(������^���%��~�w�Bx/�[b��E�܋=!��9��a�� gr�ܑ��N6��C����=ڵQ�TU�nE�/������?%'b������W/�w���s�ᓸ����ے�R��ȬC�A�I�Ƀ�L;�8b��Xɜ��!�|n�>�sZz�s~��Ē�7 ѯ4[؝����>�s�Q�SY���r���_��?ߓ�ߑ�ǷK��W��ҋ�a�y�u�!C�NF +�;��ڢ0x��ǡ���ؐ|Ѹ#��i{�KcmJ�qkjobMZ��:�Oo t��g�w%�;�y���}����w,p��>��z��ݭB��������/M�6小�\!8��D�߲^�7�ZՐU�����P�q̸%�5�:�=iszGRU�g���cefobEf��� +b�,g�":�z������_Jמ �獡#�N����v�F:�u�n��rsԱ�LvSQ���p�xW�Zy}�&�6K��&w��*簩2��yC�����g�u9�I�r������r{�A"�r��YLtފ#�os����e�r��Ɂ`��{�&^�ɛu�6��L�f��JSdSy:�qM���P\��T�ee���`KBE~Cb����2�is��jr��q��ؤϷ&�,��%!T��� ; (]@���{�:!P�R�B( R'�DD H�*" � �������qw��Pag��ȇ���9�9��ߒ�s���9I$�(��B��VK� �S%>�� ~��"^��=�7��y�^a��s���`��&�E������T�S�Y����A������ʨcG�q�'y�3좂s�‚�n�Ô�/.w��-XO�l�D�de1�%�P�D _����*�s�:�bhqИv��N~V�q�t��`�~��x�v>ǵ�6Ç_�TSq4������Һ�"މDn���W4��9z)�p�}��8�E���Gדr�l�D����@`�V�FExߡ³J�dT��=bH�2`#7��>"���a��k{����?~л�>;���0����y��&6��)!��3)�l09�l:�`��9�e�����̒ �(�F�P��y�yX햅�#��`\���/�X˜pQ�������<c���r�9��U�t(��PZ�=/2��*�PmC|zu;+��lrJ�'��&I�̩Zg�Tn$�Vl�D�t�_$ X' ڤ�E���m�ۓJper7uj�Rzd�Y�g�g穾P��3Qֵ]���S��N��A&&���t.�C�#I�.�^h�������z�-�;XO#v�>��c>N6�n��k�Rl��r��k���}����x�����g.+�98=�����7Q�;�� pa``��4ݣA��RP.�F}�C�ycJO��$ ]ㅾjQ�P�pa�v����:M���aC/�a����o�,l���f���ʹ%�?wHo,� �ן�DY\�$��o����4(^���U5"kU���fJg��l�YsV�X�V^ R x�_��m����d-��;]���:���f��ֳ{�l`�^`h�>jd�~��r��gc��"�� �t^hX�x@@��!�����`��C��Ә��J*䣃t�'w9�O~[=>�*�~fns���������K�����;���jZ|����[����=8��t��#�42B�/��kd�@�s��u:pP�Q��D-J�S�ь�6t7t�䌞[�_�Ce�!S� +��"g�f(�`���*`���Tݍ=���.�n��e��4.����O�H�"Q(��D����'�P\Ј���hC�FG t���}Ja��FK�!k�.<�y'�l��b�a��&6�j`鬜:���:7��ict�5A��=Ș0EƬ�_l�WX�i�?M�1�2�q�����J$��ވ�:&$���*eQyP�EY+:긺� �(��#�� �~�������|�� �G �E������ 3N:8ͺ��;8Oz����@�5��!8����&�c�G��́���� +|5;�Gk �:{�nq����#x�9��g�� ��8����f�Ӹ/�<���.o��u��[@�1?�s�!p�@�3�� �if �o^�9��-��j �y;�Rf�5@nr�v' �tR/���2�}�e����_^��S��\?zq��fLxÞ7$������>h��p� A���N�AF\2��r6�h�jі�I���,[����t���;�RZq3~�.Ӿg\��^�3E�&���$��ߑ����N�_���%�|�� +�,���� @`iRkCٽ��V@8y5�l� �9H�:��f����f� +(w�Ĭ�Mқ\?����'���?���z�� u��:L�w�~v��{ S��?x�J�;�oe;���5C�B��"��/�oS����l�Kl�Yk3)N��d;����9����u�����t�3{ܟ1�N|ʸI�/���W�����I���s� >@�e@��>�A��ngkJ����X��O]�%��i2B�ӟ��֯e�Ǥ鎣����2��Մ!n� ���1���!���k�t����k��k��:K�7�J?(}\��[0���G}Eb�=l A�d<�L0�R�׼?��8/��":��<�n($��_A�{w��^��f�-�q� ^��5^?e�{�z�;B���������#Z�h] ��>HQ�@[�!�Mڮ���{��W{�z��n4��yX)��(6��~��;aj���<ⵠ���*�+�����6�E�I���>�9�?��nj3�qf�� �K�10�$H 0�<�_��^ ꝉh�4 ]����\ܒ�\w��,_�!5{�o��mw�r�q�qQ�{/�3=.�iH}!徽�jϾ&�)i�d`O���ˬ����c�6�'v��M��U����E]s�z=H٤�[��� �<��E!~鰆d�[6�A���Zr���܅�ngc�<{�r}��Ŕa���:�߂�X��nN���Iv�� {ƫ ��=��V��*8�����P~��$�=�Q�4��Xh�����p��y�b�Uw +h�e�-/�����#�{(ܺɞ�q��� �5��~4�&�A~�]�ɭ ;˯ +�&� h�'�����e�y^�|�[�-��ӃH�7�P��\���lқ(ݢ���J���]�w����r>ע/Kj{F�ܕ��XR�gk��ܴ?�ZWL���dUE7p�Q���=’�_Dő�E�Qo��Q3�C�:~A��W=� ���1��%�ޙ���h�F�I�i�V��� V��\-�[���SO�xgWV�S{z���T�g�*�|$1�Z�p�qXq�U_�-�khbO��c/�sc�s�^�r⦅��s��x!��!n꽫Q�Z�M�}���y6T�v�n���j��� +��Ҁ�' �;�����#���=��T>)��2U>�(���I���*�ي.Q��$]qW�V���S�4��)u߀`�_�vP��@c�MjM�給����`����:���IkOk[�� +lZ +���ϗ�Ή#j3I%�i�Ci����bVvr/]�$8��)NIC5��Cǝ��/: �;��/��1���n&�K� `ŏ���X�4jFt��M�@-�� + a�P����B�zV�Y�a��L��Yㅘk��|kO�b����X3��ٱ��~�&��6r6�ȻO�O��G��6��ɠDW�9������i"�ӽQE����h��Ɯ� ,�0�b*�e9�,'�a�ՖS�����3c��3����{���D�Q�4H�0�)ځ�P�qE�! +�<Q=0�����i����`� 4L�O�t�=.��a.��ʰ�"��a��D��CE�����4T��Q�DU8 �c�P�f����([�� .R��n(���A������S�x���X�9���xG r09���������A�C��ڗ�Z1�Jj ֨I�Gբ����8�hJ����*���\��'8(>M\���'��ot� b`������8�d��LT������;Y�R6�*�q�~�u���F.J�=Qr����Nި�����?(���KGy�R�������$��%�zQQţ��GC���1� ���0Vg�����်��Q�f��@e�;���b/Cxb�Qި�$D�*�,�,�� � ��]��彂w��9z��Ч[����0�OE-��z c� � L�Z`�� +�c�16���\0j�� +�#ڭ�aM��zo0|?@uDЧj�*[�>*/x}P��~�|�ݣ|�ݥ���B�Y��0��< }����c%� �\*�fS1��wM\���H ��t�����dr��t��q��ƽ7j�Cd �n��]��7�{�G}^kN�ti�D/5�D/4D�j=�|���f���~Rc�5���u�ԙ�q�ID�Q��⊈ȾCHrsH ������}��;� + +#x�Z�ʴ�i��Z�Աu��Z�>s�x�9�|���|�����񐊵n�.<��o�{��`��Z�$�����kT���"��:-�~*?�"Xu�9���"Z�{J��S��ķ���䱓�3_��:�'/:.�_;}N���5Y�M�AJ�"KA� ��5�� ��*#p��L6�#-�pͶ��z7Ӧ����JWn]Rc��&����S٥�"��;�H��+,%p jH��VJ�be)�Q��a^b�(,D� y)��|�Z)q�n��3כ �X�)��a z�mV�����o��R�G,K���)k��ȫ�vٕɎ��|��3�LV&�V�%��XU?���@�Uw��(1ſ!1Ő�(Z��e�W0Wi� �x��6}=�A{�a��.'���M�6�eKȞ�&�!�>�6�!�$�.ݙ[+tO���fU��U�FW�#���ȑ�W���y���{R��"������wy��p��ьÝ����s�8��>�Z�ﵡ�7�"��f��i-hgMoK�KiIuHl��7I�z�7�Q�����Ci +n� +�\�+�k�{'�B>����p��6�?�7���{qe�v��C�d]@?�ߓv>� ��e�Лb��w��8Gv廝��xw�{S;�|)W���[�E?r�/~�V迒g9�jfjk`�����s����@=a�SN3�w1_�3�"ܑН���]�QM^i����@A����H ,!! �  a�Ȣ��� ���Ѷ�N����jkkGfܵ"�hE .���q����j�����3��/s������{�{�����sfW/�=�4�rl�4��:���&e����U�ԉU'b����r(�P�V_���}�P#>�N����W���8�,���9�u� ��>��K��~i]�ԅ�܋/����a坟Ýy�D�U�D�^�R�j�<�h��h�.�����2��A��>��� ��NOD���{Z�\���������oO#��"�V7�Њw���X�N)iQ���OͿjr˹j�ʺZ���\�25/�$7��'6}&�o� �7}״G�m:�i��=i�c���� l���:�;�wP^�����Ս�� Ϳ㌊�|Q�MD���[�}���f�pN��ۊ<�zǷ�1tmk|cm_�bl��Զݜ��Ǹ����v������� ?�6�OvwP�;�����;��y��e���*�pA�Ld��R�ԩ�3vΰO�Ju���v�u�O��*v�t/v��^��^�ٳ�K޳�[�s�.�=͐�^cHz���a��k�=U��>���Ghùw�K[�w�@9�(�+J�c�Ծ"�_L��+)qZ;�@U=h��̦E�;ȇ�#�J�$ë����p��K���i�� +נ�Z���V7�n7�ˁ����p;���8��]~QB����i�8� c>H7�'��""zBJ*'T����"}k��C�]dR�!�E�BXd/��4��8p�ܑ�~p֑ ͎,x���x�5�q�u�oC(�'u"4c������� )��d $L�������.9t�?$�\0Q� �‚�̷�C��|n� ����Pݠ�}�f�>������g�#�Ѕ�f!8w + +W�(�|�!����g��5�q��� ̤+�$�a.9�N� ��)��B�r�=�H$$(�H��-�@����TP�i��w�g��p�Zw�l���!�_t��1 �����b �v{��� c��b���h01�d��U!$Ą�� ��Va�8*Ĥ�@=� �>re�(>��/�}K�� �����_����2AR�]�`O��!�t��Z +�WR`�H��R~���E$�b�P +�ev0CK��q'��@�7���'��� �- ����r\�>&��@~ �a������أ��+�{X>���߀8�r��ɀ7(q�VH� �pIj*$&���9f̙���!v�h���7��z+�bMD�b�Gd��*�FU'9oT��ת+��-Π��ӧ��<�����S���@������?��IH䓐��0�)����IO��0�M���_�=�_�3�[�|��5��略�3�����h���5gx/4�x�57x�k��}����10�=�c ���֟�.)~� H���En�Z{�4:�M�L5y�$�҇�V��'�c�0l�{���nj���]�^�A�n}��SwQ�DMЮ$�M�|����[:��A��8n����@��,Ҙ���HB>�#/�~|��qĒ�2�U��<}���̷;u �3�+��ޣ���&��O�p/�Bh3���Px��t�p_t=ᙨ��*�р�K_�걺I��&�� ����(�NBQ(e�(�:\�� Ź77ǽ#g�={ �U[�Z�m��7S��H�!�zʿE-�����!�ƚ�+����ƛ���9��j�i�&"N}} ��{o�7s�Y���� ���Rʳ�j����)�s�\�ΞM�o�BVkN�ŲZД���!c��R�֐��a̻��̇$V�q�SmD����cY�i@~�<��4��V��J' �s<�0,b�K��%!dW����"����f��Ź���b��R~]�ʀs�> ���*���S��INf패��';�Q��̨�<�Ѡ<�qOy0�j�jo&��`��@9�= ����y�>�s,�A�eԽ"�x�BB�Z�uh)M�ְ�B�XRȶ�[ȯ)\.<9���q]�QM�i��$�((H�*��"��@V,���f�5@ !�LK��@�����(������h5x�9���2�����NGǶs���ȇ߹�~z�}���<�gS*}.1UGf�5L%w]H҇�%MF�Æo����_{��{�bw2��N�f�t)h�c��Qho�;�;�<��5�7���h~�8�f��q����|^���B����ÓR�q��$M4��2��K�c��w3.Gt2�";Im�oI-�#uL$�9�@��@�a�}/}� �(��r���9�#�'v�<�lYes�$�a�����L� N��X��k�]�;�]ЛYܕ�ڑ����ХM���ɍi�)� J�r= !է#��w"6C�l��R��7%xxQ��� +<<�r��U���`�E)�z���Li�� �,�a>�c�����)��̓��*�u9�6������Ϝ �e^�*3W���uZM�?��Y�P��2��r}��m���ob �Zfk�V�Pa�~�RM��|%Qz|Ǹ$~��(ŵO���%�n��� +%ZnU��SOP�����j�8��=G�`ߡ��_ҥ��h�ܟ)�<���f�A�%���z�)�U��#�%ܫ��e�f���eE䶉���ò3���.�� ��Ҽ�MB��Z P�+���ڰ�¦9��$�P%�+�2�-���%���&��Dq����l��Z��`ߗ��+� k��s�9l��3��k2�"Z�*?�﯊���"yo��u@+a{6� }jKK��K���bA*h��u�E�!j ����iTo5�������&�#YP�>�e�~L`C�&���ZSXQ��r�5\k���޸qM���>ʮ���SkM�me�����CJ)׻���_V& *W�"5QX�N��<� �@��>B��s�oh\!B-"y3$���0�T`��½z��5�:<̶�ɖø��P��F�m[É�ZU�G�J�>EM��ʪ|o���HY�8�T*�Wy�-$����W6Ec�-�s�F����F�*��"o�d����R�J,48X��`��f:�`�� ��-ؼ��b��t̡��B�p�ק{����+y~š�@~�,���6<_�ɮ�dUL�2d �t��t��[Z��?�tBɐ!䭐\�oJ���ީ��r�1p�� �{@����0�u������ָ]r]�Ky뀨1dzX]��k�sT��u +BV�����&�*�)L�U*Cq��P|Ce���¬Aȿ!m�p�����Lp�~W��y� �z{���ô1���){��˻O9�w&�)�H�WԖu���㕧��4K3��!i��0��3"Y3JJTϑ��+� r|�������ȭ^������:�OuW��)�� ���{�hs�hF}p���|�f+<�X�?����p��e`�����{���~����䎆���v™���+�m�3bl뿈�-��b��}F��qջ,v\D�G�����i�������Z@՜#H��1���\�%w�c���홗��.�:3.f�$�p����㦥�NN�z�j������5y˟>��?}�?��O�q$�6�nfDgpG p =�I=��@+��B;��D7��x�xK>ؼ�0��4+��6�g�������|�`��r��Ł��fڵ�C�k3��eO��=IW_zFο���C�#f�w���v��~��Q��i���r� +o�s�+� k� ���c��L�V�-������&۞�˲?f`;Dx;� e���jg�A�'�з�h�v 7|�f��k�g/] ���z ٿկ{x�`���)�,@� ��[�ߙ@�C 8������`���6���4���f1ƳG��m4c�5�ȵ�4��W+���jv���8�N� Z]����� �����_;{ �z�� � ��LpA8"�4`��`��`�"���p��P, �RFC` +��l�¥�zb'���&j�A�'�^R +��4Tx�P�������Q �H�G�</c�h��m6F��&�Vj��r� +��l�&�����e� +��#n�#D���� +e��S��NC��CC�@:*"�=S���,��k�P��%;LQR�B��lt�$j������s_%nsF���ΐ��ـ�޻�9��sG^�x<���RH�?1YL�)ބ������/A}u����W���W�赍��El��k���UGɷԛ��Θ�]2�����k�/�6�9h���72��!�K����XߙB51UHC�'�O���c�qJ:���2ST�e�o��G���?}��?(�s���!E oPq�7�h�W4����^�#^��5�π� Z>W��So�-�Tj}'��润����� M��u�y�V�M���g���/hF��5��D�Ӡ�DdEa0��$L!g�*�S�i=�j���0���D�G3t��9�G.�ߌ���z�F������Zd-t��m��%m�Ӆ�Z��!?9���rN�����Gؠq;�EQ=QG�N�Z �(��M4L�f���Ι��I��Jz{z����X�[3�ح ټkqyV�cW�\�Yg���CS�ǟ"�8��(s9~P�~��Tx��>좸6��xx����!IM8JE���o`iǒ7g�`Y��ûl;x�� +��ʩ�g��[at5#�}!Ugє�Pp6i���� ����6������-�)�>$����VG7yTE_�UF?�U����cP�=�L�xI� ��ds�0<��Z@{�-�ΑR�.�¸�j���8�]�ECF��.-��D� +ǣ�_:N� �N�&�!�Ƚ2~��"�RVw�s܏^��Z�qO�%�����(ߓ��o�k"�!�dc@�1��3��E��4�w��кXD]��c�[lظ �]��lq|�,�ú��ՙ��3 +\+�ֹ�������M.�}7�מ���EI�R�N��+��g��^��3?*�I�1ބ�S8Ä́!9&��1��<&�_b7�r��2W�i��1_ì͍d�I�U��Tfg����T6k��^�QI�ɷ�<��^�3��{{j�϶�:�-�畅�w�_�u+7���nJG��騘��=�C�<�����R}���ZVr�y��^)��.�jpdI�*/�W�y�`���v��s���-q-�[ �5g�d��B�V�.��Y��MY��2O(�g6���yK�.��om��Z�>a"��^.�#�N�z�K�\�� g�8@����U+���b�e��V%y:��E�w��n_�B�u���.Ϩ��<���PD� �H)#LQA�,�"��t��ІFpF� �RD�� *�1X�Qp]��f�%'n�f��=G�}���s�����=�W�R���*�x��-^��nAIܐ�84�wQ�SQQ�;aQP�_B6���1x��C��T��T0^����,p�̕�_��-]��Q�ךnܔm^��`U��fW���H+v)O���m���R�����I����ޒ�)�ܤ�޹�oE��D��B�LH$ oA���26.�98�]���pf�n�t�.��*[;��h�Q]�&��8+e�6��lDz�BY��[�Q�+Ho�u�S�E��g|2R����>��H{-�H#B��K�&�E20�\�ߖ�p���Q� )�qX��t)�*�+�4��W�֕�V�"�ҭ �&ۖ�g:J�� $�\I�N^vN�WFv� -�h[�i��� ��Q^�R���"�K��0�T꺭�bQ���#����U�+�������,��-})�.�$�)" +&��{��d1pq�5����k7�٨��&+46r�5 �j����:�^q�:���(���X�̝)���,�dE�K�9wkE5/���s��nA���p���h��}�OQ�QQF�_�,���Õ2ڃJ�����w��f�m4����Յ�l�ț�5�{V��5�d7D����b�R�d��+�>�6�)���uSu墈�&ކ�.�u�C���q~h���Н��)� +S��x��gz�7�.^�܃Z����Zi��>5��Pt:2e^i�RuI�*����K�n��m�7�rKs���=���M2� �J���nHC�{p� O�p�C�p�C������:���=zW?�� +���-4�� ]@e�*�{磤ϖ)�sg��.V��Y97�[��pp��֮(���f��)�����:�v!�;����ikw����۪����n��{�����B����.^R���=��l�RMPz��A]H-�u̕Ir��bVύ>�u4Bc��uG�LB�d�.X��P��W�v��ﰢ��qy�7N�}7�{�;���s��& �����9:�t����}��C@��H�ĶQc$�:2������%���@��`�u#�BF6����_s*�p�p�q�p���5~'[-��Lj�L.�����7�h�2h�����1=D�[!b܍Y?.b��/���Q������ߪ�r#��ic�ؤ���#��7&�s���,1��7��]Կ��+�_6d��ǁ���\�D�U#���c�$�&3�+Y+&�l�������U}'�|�2爦�4SJM��&-��m��)��:�S��]{�ý�qw����x+�}����P2 +d�.�W��)6n�c�mm,�m +�����i���b1�91� ��q��B��G|�KV@���E�1��aɂ:�3j��Q!9N�����,vP>�'S�ߨ�־����X�������ԤN]�O}&�gI}���D]\��wa�% ��R�)i�~=>BO�͂8�2�ٙ!.g.C�X�~�خe�6�J��l��Q�*���\�iTS��@H.!�y`b� �Fd�A@A� 4 aJ�"cD'(�� +�(�
P���ϱ���+�������߱�}`������:{�u������I ,c��`�#ց]�����{I�|O�d�E��?Xc�����{�< +8b¯�3�7*��5��3�5�.ClU4�-��B 8۰::p�a��Qpڱ�X'v�1��e|� 2F9�#��a[ �lA{�̷Sɥ�,�s��0\;�� +"_ �h�@� |9 f�рW��2:p�b5 ��a|��'&�G�q� b�{��̽D|�^'F��a��7B��Mh���X��t'�=��o�) ��<<�yb*���œ p�h¬$8*�� ���u���&�#���@����~'8�="he N2��7�n��{��s�sr��79�zJ´'$�c}$�M���6��3 +��oq���y�-�� ���p�1q�ևo�����3�go�7j�q��|�\�|�T��©Ig��΀S��9�3���~�V��3�^�i����;���N0�� ~���.�܍,��+���w�{>u��[c�}��[��k�� ��������k���*t�Ϋf=�b��t���S|l�ù����dߟ{��#�׻-�~C��;��P�,�I�F/� P��ݓ�-� �;j1�3"���:��wjY����<㶠U�Ǘ�3k]Ra�Xmu8���`�~��V���g������ xk�;`bƮ@��j���ƹ7���GhP�������XCt3���b�R/I��F?���m���o ���)M��̚C�-��o�ڷ��fop�m}P�]]��;�Nrk�~�����-��*x��5x[�w�@�;���M�4V�;A ݓ�Lu%١ I���2Z{| �* �=�~st�Q�t������U]x��ΰ�mw�U�o �ͭ +i�m i�o��)���C�C?��€�1 fNKh�(h?/�2*�I��[�tԝ�F6�\DiKu�lI�#�e�Y���=��FuR�im��bGt�U�d5g� v��*gTD���#�"� �G�'�F�"K#��k"?J������A0M�@�iB�Sp�Uh��t�����dX��L�Ғ>_�Y��ؗ�ڝ�W�(5ܞ�dZ�nQ�cU!-�[j�!���.z��5�{�%-d��p��_�jI��:��P�w1 ���d_���h���wW�еL*���D�:臕f��J>�Y)�h���ץ��(���Sc +�e&Ir�2��j}��S_l_W�-����� T�C�|�)�3I�]���'��:&�ͺ(�f��^�zL�d�/�.<�s���?��=�|���� Ƹ��Ľ�3bf0F�Q�PI��.���])��)��B[(%]�ە��n�v��Dm��v�T[�UJ���:�꼴����5��|����{�y��L�2��,�9��l#(�J�@��r�=��,�u�!�SM�ӣ�W��/I[`������I� R�bW�8�[�]9'y���j��s�ɭ�IO\g& �D'g���|������I������PQ�� ��<'*;o$�.g�n�� A҆0�e��f�YsD���Y�g.��e����n 7'];�XBV��J/��)�y+��n�d��)��˼h������Yh=w�2٬ )vQ�,y�v��i�%�)Y��aY���YW�C���o�a�d�b���τd����`����Π��6��Af�Ҋ�`u� ��؋M,��h����S�b�E �n���U/�*H��,X%��%�.ls>���ab�Aǐ�SN�����7=p ��w +�%�!9�kųx��)-v����bE8{���`u��,���= +*�̃�/��Ŗ�Ŕ� f�L7��=[�+�"|W�h�W+�Bw�K'������� ,:�������}�mD��s���s���^R��(��shR��X\)���wPC�T�ffU�*'�EL;mV1�$�b�ل��-�����m�W�C�_^!S~\�[~ uI}�����������q-v� P��߻`G)@N9@ΡK��հSk +�km �N3�<��:fjm0orm������ڹ��5�5K��֤��Uk�|��YxW�����W�E���NѨ���Q�?�Jw0�%��w�rf@Rɼ�e�%ǘג3L���y)��<�v2O������C�ݗ��?�ET6@\$��+^�Z�FR�ُ"ʉ4q�A����Df@��y�e2��\��+d^r�� ��}��g�rG�^����N�����G����v�{��[�v9��MN��� ��_W�ֈ�(Y��k�t@�#q?4�w�it�����B�jӫLc�(��#e>�P���@��w_��wOq�ץ��u*N�:���ڕ�yw���[��6�~���_U�%1��/�;�{�x��b �؅�>�����K=� �������c���.�Ul�&�׮����V�sǭX�[��-u��Mu�^����u�Y~��%�U����4����u��y�q��x"��*ʡ��v��lC5ިx������xŃ��Js`Vm\�cl��T���f3iw�N��l�׶�ݴM��n��c�����3���w��<��>����]ل��m���������q���N +`�T�Ri����y�Fx�s�.�q|��r��۵����y����yo��띭}�w8�>�9�|nr�ol������ʖҵ-ˤe�=�UΧ䋜o)������`������"�&�#��3��<#���“���QZ2��\���b$���D������+ m�k ݾK�v��x�r�~�Kq���f(���/�]���p6��Q���4���3�` (;� e��� /r��*<�EŸy�û�q�[�L�jfa9��� +W�})����j&-�Z��)=�����g�GN% <�4I�K:4�t!x&i5�X�Ð�䧡G��H��\ȑ5)X�KX�7`\w�r���>x�> ���]��.�����K�<� ��^�9e>gx:��,����f�ٌ��� �M�`����tW�D�L�+��p��`����_����+����ǐ�5����|���U���"wxP� w�`EĄ+�͸EQ"�\!��dA�ל��8#P��� ��܆���V�k��=!㼽a�y�4g�T�h֩ȑ��tG�]��� �;z6�&�� +,}�sQ�D���%��I���V%~pYJ��F�ii~N�u?V,��'����Z������Bs�S` �9�����}yt{�\T_�b��޼�1z��Dw�5Q]���_Z��|#x�~s�Kn)�$�U9 �48U��*��婄��\�C�"⁒R��X�?"����ZB� ����=��zO�ᨮ�Fg�yfG�*˒�V{�3f{�O��BlM�z� 4�e��ε�F�O�� �>pZ�`J��U�D/�y:�Ľr y��̿_� �#� ���C{�-4k�-�CF����(��^Խfjpp���Q0f|7\���^��a3d{wU���ҕ��i�M դ� ��0ь�]���}Q���N�bW���T�.ŪU����V�^�+�1�\��"��h������:��еg=Փ�����p���>��j���� +�-�b�� �oЫ��*CH����׵Gh��(M����<�Rifc���� +�;��JͿ�J �ZS���/}���t�ZE3��rϠ�7���.��g&��) ��7����x�9��n�z67�M�E�:������� +��ԅijZ#ʫ��e�!�B�U�����c%���g��{�� +cɪ0�zO��2���F�Z��������`�mg��}��-��Ԛ��В�cl. �$��,�Ҥ V7ֆ�54��뭑���hI�f��[d\�)2�D>A�c�j1������:���Q�Lt���wxBOg tZ�f݈k���Vߙ�^�������b��]�j�P��!�SXIsG���N/l���7O3��y��|�-0?a L�YB�6b��>@�p��-3�(��.�����7��R��F�����vs�նD��7ó������2?YWy�Īw6�vXhŽ������]��ٖ� �e�ɳј�J�g��g]�ȳfP�Q�%����L���^`�}�a`a��Q ��PD�0�÷Q �)��Fal�7��Ls:����q&�3s�ޜ��0�e \[���%��%���I8��ù� s>��p�ٴ���i��� +�]ʞQK� @� �?���I�oU���W�p����㠻6�DC{=�7f��f:47�Bs��P�� u�~�ڪ`�v��?��� lo>m�nV�����G�A� '��&���:�n��1�ߒBӡ��C U���(�|����� YO"$=3!�Q�2�� @�ׄBz��=H����f���X�0��I��F��)��_��u@wP�lP ( PC2��h��M��? ��tB�"����A +������kS�R�s�Ӛ�Es�@�a�=�2`�8����Ȩl�3�q}��JC��Hb >$�L$)�^��>�8������qZt^�wK��-��u����D��'3��Ÿ2�q����'��v�A���Bp�aRN�H^ɛ�B~ C����X��H��P��C���n��n��DO���Z��u T� �5�2�^H����F���"�$��W�셺�=W�3u���Я��G�nj6{�ΆF.f�#W�'���~#{�����;��֫�e=�֥?�:��C��ןd������Nvå_��…VW.�D.�r�a����h+i��� ���8������Jc�=�a} X�a�2�b���ak7lcwݿfwܳ�m�ЗH=_2p5Y��Ir4'jqb�j�Q�<�UL�*�%�'�'9��@f��Ȧ0n�� n�2?�ۼ�/T{cv���dj�b��3c��{b��1�t������aG,w��l���x0��O�~��g�4�J�C��SG����(���& �ii��)s��S߷�;e�<'y�2k�JUf�Z����Cu�5}�q��K�o�\����Z������H!� @‘�+�����9��T]ī��u�{�����t������m׵���ٱ�?>3o��7��>���x�D�xG��#���G��퍼��y���1�3�K~{Է�o�f��Æ�_���$��T����T.n���T�wR7�\�v�4�3�g7���p$I�4���2��w�7y �Y<���=����Aߎ��~m1��[b~(h��-h��Hh��\���`����%l�i<��?"ﻝA��tW�ΰ)�8��3�A�q�^�a��QY��pZ�Ӏ4ۥW�s�N)��L��jK��$��4%��Y���gu 煵��D�ğ������� �����|�1����S�P�k�_�y��d�`Z��T[0��VFr2z�eN� +�K�<׭E��hJ3y5�YxS}k�]|�tDP%�VH�Ef�u�I�c�Q��ؘ�o�1�}�������c%���殺��9��Us0��c��lƐfӧ�ve�ٷ���͙.�J�[}F�G]z��%��W����Pt���!A�|BT*�˗$����S�^�X�`E�а��t��P�7)�r>0O����c� �m@o�6�S�m�9`ߨIv��V8ת�\����+U�r��g̬�-�l�/V�ʣ�B�Y�N�����xB�K��dń���3��_� ܣگ逋���"`�~Ǹ�CB��GGAӢ�ñ�G���%8XrӜ+����wcN�g���3d��e7� �}�|�aQ���$G}%@�~H���J�Q�bB���'R����y�"e���s�8B�a�+z�|tٰ֠�i����E�U�9�H��.%:��!_�Y�W�˫���m�ks{��H�=%Qi/dj� �)�Բb��-�����in�({�H�WF�G��'������5ԗ25e;8��a\sI�}iq����p)2��t�|���b +���~VA� �`T��;!V�.J亻r�'�?$ +K߱������!��u=�"�!��{�Ks�H�_[p��"�$�bP[�*���(� b �ݜB�~���xmu�Sv��%�2�MYY�^a���������S̃�$�0��(���8��q��KQ��[Q��&���'�]��%3������Z�Z:WtCY�?�֠Ⱥ��Ywr��pnvC�}V}���^�8�v��w�֕z&�V�k�}�j��15�,�(�-a��W¨�/�U� V]������u���T��z�>+�C4��-�(l�A~�*h�7#�};�j�d�Eqm��im2Gi��9�%�5����\�y�����볿�_x�,?��:_�/�a���a ��ճ���`��>G�Sʹ -�]��=m�]]@^7�^/d���ٿ��A���0�����Xnb��>�/�!�W��[��cv �����幷������%ޮ��B:��B:������㦉f�z~���t�.tV�.���=�Q7���![���@$�oG�x(3͉O�F���"Ʋ�������9��u�5��ct�m��i�m#��#?r>����o<�Y��,� �Q���}�h�Pv e��c@¤b��=%F��:�ފ��]� gBgb�=3)��� �Ι����m�U�?�nqxkz�q�� �7�/��ޜ��S��'X��c��@ +v����>ʵ��� sH:D�&�u��9_�[��s�c>oχ`�|�mq��2o�T���h3q6٬܍�~��I����v�l����?ᮝ��n�9�~��W���c�����2 N�g��9��ឋ@�e.�,x p��� ��iq6.a��]x�j�_�Ǻ%�,e��%V/Y�UK��ʥ#L��yFr�6#Y���,��/<爯��1E�#T{'���t�����rcIIC�m׀�7�5�9`�w���� +�ﮃ�����^��ł_��9�}P�V� ���)x=�χ���_�u����1>F�H}o��M����+@���� lzx�> ���չ�����l�e� D��((`�W%��� 1`A,H��@Dņ�(�< ��C�-�O1D!�ODQDĂ����g�0���;�=�;{���9���F �9���P�Y��0�s C �Y�ҿ#�DH�N��b:D� �X +AC��Fr�<�(g3�J��,Z��=�X�=�OZ��8���� `] h��%�+"�6�!�j��&;��@�:5�ͣ�1�n�@h�m��� +}k7��j����GK(��]�4��8Zw }��0�`W�.��e@~5��Gn���+��j�M �� ���:���k�Rs��G��?�:����=�@ON}�Do��G��=�b{����}��`��]$7��b���u)��b�ѽ5t?+�������f� 5���(F?���C��?b�>`�h�Uŗ`R�wŮ`0��o�4�H�%$��"�H>)�k� ��x�Cx�jt���h���(m����0k0���Q�����L��ɼ�L�Dc����O�WI%K�r��W��߀�|��Ex���N����������y��n���@߅�B�V�����5��ջ<��RM�)O��H�D�ɿ#3�Z> ]�x)[��,<����:t�6ᑬ��t7�J+�&�B��Z�7pC���]h2ehT�sE������9塡|(��T������7��T��j +:U3�P���Ÿ��@��7�Q�M��Ven)w�r��{q]yM��WՌ�C�k�p^øZsƝ{��=fK�m�`����f��9/��c�<��B��w����m"nh��6 M�ehԮ��Z\�n�%�6\Ԗ�^�,���4j��p��W�Ew� �����ϰ~f`}�`v�`�*�j� �|���vC���u!�����^���+��9��[�Z��貸����i�z�;���U۔q�m���ٜ�z_�۶�l_*m�`_&�ۇ +>��)���Q�Dy P��+K����z?'\��z�?��#q�n����U���듸c��>�;����s�C� ��V�}��ҮB���ܾUXf�LX��D%L��3l�w���`φ��1H�6G�[���g�\q��ǜ�q�y,w�y"��y_���s��W8-�q��;-�v\#,s��:�J�v�v:;�9�:w�lqf���L����m|�N:�h{u� �A��!�8�b��nq�m*��� +����[��u_���e�p�K��ؐ**2,m7�֛l1l5)0�.�7TJ6�� W��\:dk\^�V�2Y�g�`��(v���F�#9�.� % �}#�c�w����JFs��c����S�[�ŋ6�-��X ��f��%Y�Z��=_�ڽX�����U�9 �� ���֥����t�'�+m�����Z#PM���88�>�(��c��E���V�~�O8�qT� o�DѺ���k�6���+Y�"��ʐ-�ʑg{�fzmS,��m���ae��ye���/�/���L�:��}�?>4sЬD}>͟��P�o���� ;�`k�@�xry�����`A�1Z����ѓ�٣�L2�����e�i�t�,E���T�-��R�B���g��}[��~������=���h��(�1:��ӑ����� ���(����X2�� ���d� 3lj2�|/N�&I �I��?W��b�и�l�q�r�1_5׸S3�X��e�����j���f��<.�i�S��G�Cp" +80(�ٯ��[�u^����ȉ�̘AȈ��Ң}��Q������XqR���9�Ӥ���'��S� �E��� ]����|j��)�ǻMk"�-&�1s��T�?p�jPEq����췍��Ҽ3N��Z,��ҿqBj�;�(v�<.@0wl�pvL�8!f����)���xy\�����ԨL��ȵ�" ��uyGEu�q�wgfd`����.誈�i*e�60� U�RUZb�2�X�YK�(n�Q@M\)GO�-�h��k��n�Q����9��9��9s��{��}������b�<�31�=uO\u]�D��1�D�[~:s[<ס�='ˍ�y������kP�0e �P�0I(��H��Ҝ�y2s��&3.N���#56Ci��uXS�h��vN�ޠ�G���Gp��>�36�o��_k�E Q����Y�|��7��jd�Y�c�?4�b���I�Q�4�I�\�t�l�-�4��� 6)�1��D�")!�ΐ�c��/T��+�b�����۵ �\���z��/�N���Fŋ�~�>��\�3��T`'ٔ��uy�%&G,5�E^�rR�!+e��a򗤚����a6I�Ѷ�E +����$�}L�R�¤r'��Vaܦ 7�w 3wY`�����%��Rf5�Q���|'��&`_��ԥ���;�I 2�ۭ���^�8cGbt�8��Nş��i �kܭz ��a�5_b�[7 ��W`=.�Z� +���׆��]��4T[�]Mo�:����`+���@�.�� +L� ��p? ��f' i�A̓0�� 8� ׃S���� +�{�t�{Ȁ>-f�n)Eϖ:��4@�r��o�9t�����X�r0��y ��T���O�&`�R���3`�Q��19��*hZ]�nu�s�p2Nm���� U{0��C{2�O�Ay� +v��P�7A��%����P��J^u��qW��}@w&cN��7s�G���80��u +p>-�����*��ka{�l����(H/xAr��A$�up�up�}�DwP��A;���6yD�t���3��=��S��-��i�w8��O.�ձ���]���#���Z�r_��`��HD��)PY^�K�:_��K��F����n� ��)k��p��9�}�5���O�= �G��;�� �������pKŦ@ �؋��+p� ���By:���x�y<�K����I�d�;�B�$g��c�M|� ����W���� ��"sO��^��-�/r����#�m�P�AaNk���ɳ!��1� �/Y$��^�������b�]LzWs7������0"��D�KBI I&Y���� Ux�5x��x�-��� �{�?|���3��DM?��} :[�K��WO2�1� �F.~EG+��#�ɗ�K��� q�_���p�o�-~#n����T]��:�˪^��n�b����� +8K�!N��>�C��������<O}'��i�Ǡd���[���[�k���;���ϯ����E�f\� ��w���N�rg��ũ!�p�/��3����94L`���"�"}*/�����@%�S�������pk���6\�KÍ�8†�N�Q���p:� +�jp2`9N�ű��� ����y��y�9��t>`:G}�v���m��(/��cH?��5��'��Ip?P�;���2z4.����c��: '�i8���ڍ���VW0��.�bf�z�W��t�[���=h/���� +��� ��n{�h˸_E�� ���zy����ɓ�Tb5��� �O��7�?�O����EOH�hq`�t� �Dg���)`�Cʘ�!��]����Zv{�*vkp�hs�Ѧ�ŭ!��CΉׇ�7O�Z�4�gI�{��Y��*w�}? �A�/�z�Pg&��2�S��:�Qh M��P3�}���:5��<���@S�n�T�6h�Z4u�u�q��UҠ�%Y���VkNq+5W��S�H�O�QZ*H�yY��ITꩤމ&�8��biޡ'�H���}�1 +�"'b{d86Gj�i`6D�3-vv]��m /� �%^^%^�DR��[��- �&� �+[v\^�'_�H� �{B�WG�7�&��3ҿ|�� �)�-F{�l��M��16ͱ�h�Ib�Ƥ2���l}�C�<�@�,�L\5G�$jW3�N�pZ��z�fyմ�yQG}*�.*�D=P̎�NQ-�x���yO |JO�i�:D'�m���xZ�ѬS�Q7�u��O�g� ��x �$>[T�u�j���Z��*���W+��F^���kS��RΌ�U�i��gh�U�j�P�� ��y�j9n��/L��]�n���s�!I���!X�2�)!�K CmJ,S���,HNe�'e��%9ĕ��ىeܬ�Jiyb��L�R^�[�(��T�����Ļ���|~����$A�&� \��9 ��4{���I�F�� Ǫ�Xn�Z㻨1�b�1��2�������h�![\npI��%\��BZ�_ +�/���7+�)ەN}��?����&���zAI(^s?�dN�~7�_m���S���J��<��ñ �T�MAeZ$Sa�2s +[�jfKS����\q����7�K]�*�Ӵ�'�Ԥ�1n���}�,�)�F?��?����2 J/�W��<�h��H�]���S۳��5i�禋P������1�3߃'# e1LIF"[�nd �3D���Ӓ/ɵ�Is,sevK�O��AaM��g�u��-�K�\'�Q� �n��4A��۴�������؁&�W��)��6s��`V�ۘ��ҬPeE1�Y ��f`�l�Ö-��\�l[)g�ΑeZ��[�(Ҭ�xs�U����d���d��ʔ�3��)�B�����u����̙KP\K��|�gv��9~(u�D�c< +r5p�F2y-�p��v�Y�尉�9y���bΒS!3�,���F{��`���ۏ�R엉�*��'^�-(_a�r�袙�h!��kS.s(��N9�]Q��;y�I�q�#����Il��Ħ�3Ein�8�U(1�}� +$p�Gn�?��c�Uk���(�b,% �����J,���v���-I..���� Eu������݊��#ʘ�O��ʘ����A��'�GHo���t�E�,���9g0�������@X<�a�h`�D���2O +��1�I�H�q���K%q�\L�Ri���.�(�+��لaf���aQA��׺<�T�5ڨE��A� ���EE�qA&.TD0j]S4�Vm�X�Zc4DM��'�>��3��}�9���ݓT�84ɬ�O�OZ�qI�P�/y��_,*��ʷ�8��o{P���z�N�����-gߑ���n�����������1�>c�� �ӧ#�% i�J��-����,�K�RĦ�w�I�p�^��4;D������!:�g����k�{�R��e܋$�$ӻ0�� +Lg�6)C���8cl�7FgaTV?�����x ��������B\�,Il�|�ଥҨ�ղ�Ye�Y�������&rM��"<�'"*�W�B[��+X�IYIoR��٢M^��s=�����\w���D\�C��5�`�0D�"�8�3�ƹB�q�fL��7�J��HC�vKC�viH�#iȆe!���Ԧ�.e�.��I +�^� ̦{��~F`8[֘B99c@�"�u�(AxI$ %��_2�J�F_�T��f!شzS��۴N�e*Kv +��PrQ�? +_H +���\ la ��d�5i�!݉tO������R r+Z��JW���ޕ��eE�9��X�� 0���e�,s�ò�������b��� ��3К�B[�m�(xuQ�!�b�#I��Y��}XLa[8� ��l�����5N���� /���x�F��6�#�n�7�L����Ŗ�-�l�ڶ*� �joAe}u͏D�t#�#s�*�g���1��6��J����ҿ�< pnPB��U�N��P6�����t����>2�� �����kgB��C�����fQ��ttR@�Z�| 0�1��O'0��6 z?�� � ��'��Q@�86�!=��Õx-~� �0h兠��V>��x�ڸ��\[ 9��/��G��0�+��"�<��5`�#��H�a ����8�����i��A�u#��y�㼖➼ ��Ŝ����G;/"WX��_�B_-'{��9�ȍN2��I�{��F�(�;�޾���^�S��@y�\���|N� ���u'^�5�Mw6'݁�t�$�jV��;� ����. �=�{\��\�� ��r����y�� �=��f�� +0^-�z���~I8m|E�&��w�͜��>�����ɤ���Dt�ح;D���M"�P2�$�ydI�O��K�� �����ex�JVғ�;؀��DW!-�tU�U�񭸆�2Gq��?�����"G�@ο����\�!����/�"��o™�8�9��i�ͦ�=z�Г�Q3pk�Mrpq��UF���jF�g��ъS��m�$3�‘O"�%�C�pb.đh8����!x ����ܒN�uY"����o���$[� �T����Y�:����S�f����*/G�|�6�Eр&E �:���=؝~@�JD���d� j�|�<\5x���]�7�\u�K�18�� Ψ��)�<���G�z��i8�^�&͇8�و#�"֔��َF����8�|\ڱ��ln/`uQ�.b��>���ؐ<޷=��||���E�>8�6���p�c<�yL�a�ٰ{� ��P� =�q@���� ا�{�&ؼ*`���n�:T{7a��ET�܁ŧ���P�Ey"�r��]���Y�t.�:ଗ+Z|p�G�{���(��M�^�D��ޅ��=��/F�2v����lT��b{@,e� �By�a��P�;+�~#��� �A�PD +�@ d�!�XjY�?e�=���)P�� ��ƞ>Q�gv�ǡJ?������� +���`�>e� �T�N�X�I(ћ��`�Pl67H�CNI6�ܒC�HrCEIίx̲\fimc�?���p��}a������2��l�E�a$��&�4lL�Y(6�C��OB�a��o�/���}���\��)A55�J ��.�{�]8����.�.�]n r[�ۊ(���%��*X���ԱmSӦi3�δ�v�!m�Ӵ�t2M3M��il�/2f���9�����ߞ>f&m��J�`O��fO�-�'�_��Ʌ��ɍ��ˍ�� ��"�ܱ���j�}6p/�{��Vp��\��q��z��܊5)��h�F��+" ӚjLj��IMs"����fÙ!v43�gNsC��ܠ�"�\�4w�Y�S�e}���~@D���PC����ܦ���+��;t/���m"�h��Uc*7'sM�έdF�NfX�a���젶� i{�~�0ק=��hg�n�K�.�UEg����_ �� �y����y�����B��rp���e�C��m��nN�S�gcD�ǐނA}�ۘ~������#�ۥ�悺�\�n�oӝQ��� ~�+B�Y_٤�+�Ш�>B����I�N1�@��QD���,��6�0aL@ش æ�4g"d�G�ٌ��t�*����t�UVG��5�U~B��$��Zʜ5���!��M^Z�{����&��Mp��ݵ6W&dw*�&����]�����g�]���� ]� +�+"�\�F�5��uWep��2��Ci��Ji�� +���z�E{Rp���qb����S#�u���Eu�S��nC�w�}j����w�ςb_c�٘B��5��Y���3��x�wZ��. ��� +��וy�w�������y�_s�j�J`��&F��O�y]���7�Gi�f�-�P�O�՟�� +f�"��1j���=��d���\��?�_T䴼��n��"��[���n~��i�~�-��J#0GL��Q;���;Z��P�����Ž�0wn�)���j��2@�eE~W9������t��Y�V��2�s܁�wyu�6��5�������W�Gyu�7H��������JxZ)st�~P@1�л����oA^�nhRqp@��P>�Cfd�J� U!#�:�¤�z���q65�<�o`�M�>q�M���M���K�r)=k�Ju.�Ӟ�F�� �D�5�-��ʞ[�� +d��!st#2ƶ������c8ia=R�|+,a_؉�p���H�0�ç�]� ���M&)|�I��I�7�4e��ָLZ��q��h������c�q�=dL��O ej=�N'��$$O�`���fb�I�"���q��H+�FB���3�sH�\��3oF���H��2���8O1p���#�Mύ!Z�-�v�8�7 dRLL=�e��\,��'`��f<���� )H\8���شh���lX���|s��/�#~q�xq�o n�=<9�)�� ���C�h_$��u������h +П�fIH^��6]��p)�� D"�\ށ�����X�"vŌu+�X�E�JʕA���|��-p�~I|��gė�P�G�@��p�S�%gi�9����i�%ҿL�/��וP����1M���}�S��QQB_C�RJ�SN�����h������HER !�|�dB�2�9>��eȲZfǚ��5�5�0��ż�mw�\]����������繟�њ@ҚC���eS�eS�E؈�x��x��u�`E� D�994|Cݬ`����@c�\ �0^_����o� ��!��(`���$' ���N�Rp�>�ٜ6�9m��V��<Z��[9ɭ �u;���yr����)�����ɘ��+ƫf����0j�RӢ P6�����76� +�}�����@��R;��Nl��_���lL:X;��:8� ���u'��F7yۀ��܋��ou��Q�`��= �PS��y����� +�*_��6���X�A��E����l�����<�������s��Dw�' ��L7�;���0�x��0�ZSלV�/R��"���ȭ�N�'w97?��=�G3�s��Ǽ��BOٌ<�����݋*�%�_꺑���aуBF�qd�$�$o�����+�%��9V���)6� *�5����� Gp-�'.����o����� ��Y]>� C��+"�/�����N�y�Y�G(��2ꬢ�:�l�Χ���q�����&��9��[�<`_�G���z��)s�� 1'�#�`u����Q/�Z)�ʤN�`u��SJ���Y���1��k����s�4r����.��f�������~/Ȣ!��ӝ�7���:W�G�P3�ٌ�V"u�C����.�b�,���l�N%�3_�gp��q�oZ躙Y<��8I�� +� �᧾d�����J�Q�ϟ��0��Ԋ�hI�>��K�\�P����\͜���E��140M\�ts :���k4�2J�C斒��e.��F��`�� �J.�$�A�"gѦ��V�84�%�^:��e�^.���R�/�N�Z�*4؉z�z��u u��a��w�c�3v�E����=� 2����,wwȍ>��6��^�X�㴱;�M��I(M"pX�2 ʏqP��ze6>W�N����bO�r����۱�t?��6�3�/QmvU揱���-�xN����,+? bIa��J.��l?=��*q�|��]?o���쵘�ݖѨ�����)�n���y�f����Q�%*�W`�U56Y����Q1� �^G���Xm����n�zxj�3�%�G�yg�{G�����Fhh�:�!�m3;m}Pc�j��Qe��v��l��Mv��`7v9Xg�k�a�}9V�oE�{�X�^�nA��+�'C� %��bY(z�Կ���=�}�bi���}z�5� 56�t�3�8zc��?*ð�1�ӱ��#�9��J�YXR�<,u*B�S�Pۓ� C�������%��(��C�g( +<'b�g$���L�CR��i��mE��/R����.����� a�����ǜ|�+��W��㬰@=�ծ���L�?2ԡHWO�,�T��c��N��iB�:[H�+����~���vH��ZE��N����һ\b�͡\�l{�����Jza���|�7���[ +�Θ���_�!90I�����B|��B\`��/�.�> \/E�(�TL :�� ��<&�J�A�ig�����V�2�9��Rz)d>rIv�!��cv� RC��⎙!c1#� !a� ��ؐHĄ� +ѡIBTh�0=4W� -�������mSL +�'-���kza�����R��Y�A#[�]d�����K��3���f�� �H�0�$h\��F�F�hM0�4ᘮ��i��Bdx�0%|�09_#M���2�������73��(��Bj�+�7&��� +"��0#2L*�8������y�2�T�2E���$�\�Ct�2_ۮ��f����F��m�o^R����=���|��y�ߔ-���}�����ԋ�RR���-�)>�Ϝ"3��*��{�$��ef�Eim4%��wW^z��Q�M� � ʶ&�f�P��ndX�V�L#��1�Z���[W����,�2�Z�2���cI��>�&����6j!�<@<�Ms��L�)�.gf��2�˞�U9Y���,[�2m#e�%)ݖ����d;���Ӎ��bSR�ה���<&{�ytv�%!�>�ۖ��h��!Y>�q4�M�`,e,x�������� 9���*#������f�T{�R�c�lO�8�MI��E�,������%��e���F��+�����am�ڭk��u!��u� +����j[5Vm8���պʭVU��_�Z-�m�ߺC�[[7䷦A-V��s�y�\�۾HJ��1eRl�4�^kЯB��n��fs ��n����Ԣ:D~�aj^)K�`���e��ổ�f+]M"�ˁ�샓4(���-��wZ^����;�i��r) �㞓���nwF��[����Z�i&sMk.:��⽏B8��ji�j�pk�xj��u-���H�N~s���p��Rb]���05g9�#��э܆����A�V +xE�{M\0p���vƎ�4�G�h��� �1.�:�:6zI�ù:bQG,��� ����r/���ֱ�>����[#���>�A��VG%��h����8ٜ��h[�m��ӝi�h��ml҉GccPϡ_ON�It=���.���������9_��9�%�t�z��uR ������g�l��f1�3�] &;Jw�>�%}��iB�PWf2�P�WI�U��̫8r��f`�Db���4�05�nt;�xZj�~��y�l� ����ҧp>�H��K�o�[�ȝ�k�r�f�>�7vߐ���@a5쇃L�� ��� �B,$B&��'f�����ѿ�H��i5�\��B��u��z}�M�����=�ż���tC��:�~����5V����)�@C(���M�44sћ�� ��4棱XׯuS�Dg-:Xs���E]�>����c}��X�+]`�F>�/j�h � ������ �M@'_\h��(Ac�{)�ezO��<��z�߬���M��7tT��~ k���a����G)��3͉s�v��0��X\ 穋���cg��h<�����<��S��ot��8DN���*�~�������D��F�4�c���Q�l�/�[~��n(1�����0�dt��Ł�SXy:n�]�W��%�,W-5ZCNv�]zI;�b��f��V� U[�����f�>��=��l�K5��9cnE��鄩�����z�j�>����^�TPnB�Hȅ�@B.�@!B�- !"�BAQDT��R�u�κ��εg���z��������vv��n�ݥ]������9o���|��=��y���2|k���1��;n�m���m���W׆p%f.Ō�b�^������p��e�^w�������qb��p��GX�}��qQ,M��B��!���R�}���[�;�q+67�D��ĕ8.n0���np�̆v����r|'�p"~����b�!MX‘��8�p�����1��S�l�ӛ�+���,�e���j�w���ѽW6����\ڔ�s�xi����XJ���$+���܂�d'wc.��#��2��-��޺��[�b_�7�7� �I}���O0��v�G1�QݟP{WH{���1jm����� �}=���]8���c,Px�u�b���'�k�����&����j~GI���F�(�}��L�s�1�.�è( Qv� 0 .E��!q�bz���]�Bg���Nt��W2���)�Z�����XK�M於C~ʚ%���X�$���|@5敏��)p���S�=e�勔�Ǡd#�$�Jr�#�K*C@Z���Ԃv��enx�:�) �-��f�$s��S�k���4���8?&"�fE�9�O�O5_��{Hc�q2Kc�^�2F9�)_�<Ay��)(�ѡ�]Q�VE9��*�(Mp+�Фt��l��� �;��|��Us�^��l��������cQ���QfU=��|�ƌsd�L��3NY�)G��Q�F@�:��,x��p��hR��RW��€� + ��WzPW� [��jƙEs��jN1��Ǩ}�|H�@��1j�O�'Pݛz�49D&�N�7@9z�_�Ц��G� ��t��|4j ��JQ�U�������*;,:7�:?L�>fԏ�� ��/1��*Go�6Gg�!�=G���r�O��4�\�Q|�̒�մoѽ =?ei�Ѭ�_�> �T�x� +`5��\�@m��j#�5u��iBu�c:�NVe�fZ�q�1^�T�r*L�#N��K��T֬`o�+&��&����u��h�<͔���zSy�(�C�C�� x�I�e��_3��L��V�e�(��%�d�tS�V�@uʹ��[h�UIѶ +��X��6��# �D(��Я�v�B� ���/��� �?0���2���x�m��������Y�/����sd���?q���5������i��ݧg����&#?�E^���`!�! rB*d� ��l�nFf���2�SH/!-|���H }��������z�+NR�i2Bz���'�6���@m� ���W�7���Dd��;����<�GDH�Ȑ�DJĄ��$��#i��G�b��"6F��\�yTd��"\� \�T.j:Z�S:*���� �� �+\���\REG'�r�IsL��:���Fs���q�<z:���p��{�����-{�\���-��2��=��3����L�Váh�G�5֢]2�P�ŀY�O~+y8�u��< +�e* �{a�� +#�Z�~/c�`��˹h���fɱ�L�52�}�'2|#Ü���LyV-J�! ��w�db����R�,)r��'�?W�X�Xb''��-&�%PKG�[̲������ZZF��%Y6� 5��'��R�vv̒+4Ļ�x�B���M�J̐��&�l.@���藢���c��l+eS�0��w�/q�ƪx��h�U4�j��:��q�j����>灼����i06��@��0�{��]1���K%���5�e�dX+��aXo/m` ��ƣ�P�;61��2��������@��:X�v��p ��{���KO"ޣ�br�ϯ.��˥�*��4���q�~�d��%dԳճ|�$�$;�G��؍�=��g~Iރs{�Ec�����pnk*>'͓���|�]%5��!���qw4��V ��B�B%}l�N:��P�Bp�$aI����vg9��s��~�D�D�$�<Ɂ'��� =�����Q����%_BfjD�d{=����YpN�'�)|FLN��3��,19�%]`a���B.�(}IN�P�Wʤ�8x��d�8�D�u�:�1>�J�;�돟�Ч�[o�� ��p���p ���p��������&����t;�1(�����{@}>��n��p/���p_���b�?��'v�5Q�5M�+[�4[�R�j��c��r}Ǯ{Gﱷ��EsS{�����^� ��=��9�כ�� `.�A�F����hC+�q�����r��C�H_i!e�W�k����2[�E�B� �;���ɳ�t���Uv�Z���+�~�~v�uG�M���D�]쟀F3��A#�b�Î�Z̙�m e���|��??�[�#(F��XI� ���5��h�H��KS?����(4�H��И��9h��b4q�R<_�Z��ق���5b�.��@dP��+^�?��jF��ؤ���sb�guC� �|��h4���)ڏ$/{��;vk.�r�r�k���m���O�qR-Yۤk#�ވ� ��?�;@��_e��.hza}�D����� Bc�>��ر��lÎ�ر;ꔏ�<�-�zU�����v5��ZV��J*���T����)W� ��x�����+�>hv@��I��y _b���h4���ICg�V)�B�^��f�U�l���l��F-n~T���Tj{O����Ď���\�봷�h�����h{��N���C�-���U'���5v�k�}?U�V���0īܐ�e�-5L�bC��f��a�J�h��*�w��\��*v:�"��*p~�9.ϔ�bU��n�ܜoG����E��چ�{�[���E���h�s�V�Dh��������_��wTb���-pM�<�I*v��"��j�[���Vj��F�toP��G�6]T��}e�~֟���h���D�(9�I�Q&�1�S�9Dq�pŚ�jdt/ ��a�44z��t���c�-M���h`�yн\�g�̣�:�0��+*"��EP�E�a�eXT7�( +.ǚb���&Z���q_c���5֥�1�x��X�Ҩ�Z�M��D�? ����\�{����������0��t�^���>|߂���3��s��1�TG9y�%��41�W�1~���P�ŌV�1V��$ٍ6es�[���2��͔-�WJ3-W��A��MJ��`�?f���r��1� 6� �k`T��7�8���b�Eqg���O9�����+����h���`U�9K��q�&�(%a�,���p���F�I�JH�c0'�+� � �?�:cx#�%S�3�=�|K!1�'tTN��쉽���/[�P�%��5)J)Iq�$[�����d�-��`�.s�\ŧ<+SJ��M���2�Z�����bS�����I���� ��Q�g[�)#�Si)��Z�d�Q�5D���JH5ʜ���4�Li��K+R�m���9��-Qtz�ƦoԘ��Т��K�j��0������;1U�e �� +�����v~�ۘ7m]���Č~2g V|F��2��-c�Y1YVEg�56�@c�e��h�K�����oPx�v�e� +��G�� +�r+^e��ti)̇�� ��߶LUvyWMP�*����սj4ʳr��US�9��9����~��nբ�f@ �p���WK�X�N/`^���� ���@���8���)����a3/�f���fl^˹-��~��**�uv��4�{����W��n�u�ٕ-thF�t2�K���` ���P��y;��N�������n��{7��M.v7��7�\�ĵ7TN��(W�Rj�����g�p�G�˽_���&h'��?�m�M��^��!��A9�18�P~�!�0q����G����BA���l��p.��|�������7ݾ\��G����x����`K:�9:A��$'����1 +�G f�:GM��h�I�� ���ކ�* ���]��{��.���C�vy��H�8�ZZg�8 �U���|J}��'�|�/������F�����k�~��E�o#v{n�;tk��`�3����?M—Nñ��=��]��|�m-�-��M<� ��W8�/��t?���úB��9sI�����m|��y=�C��魇 +Џ�F��{��o�k��:��K�����k��O�B��<���u:�����=K��[Dp\���џD���l�AOЕ��p�@���F�=+�1�ɤ�I *�!q|@#���q�8��մNj�����B)�����o���d�JO�X��WGt��a���(��V2:�h䳣�:FG��q�K]k!�������*�Wm��Wx�vjgv���B��������m1<�{�/�H.ΐ����}�"�1�++�Y�O䱜L��Y�v�N��A�Túu�LM��&�آM��G2ӤO����<����J���p�W0`6�`�`6`���� +$��&!Is�M�4I�&k�f]zd=Uu������ӎv�6�դ�Q�ҺN�:mk�U�v޷d�������z�����{>�I}�R��/���xW�%^ս���ŋ�7��Zʥc�:�������\��G����&�dQ��qX���<�pz����}��^��ݐ���s:�����D��v)^�V�Y =�HӨ5�K�H:ҩ� ���.��f�ƨ4&�$��^���KcE������i�;�:��p\'zL�}L��5i���Tx{Y<��򔞯+�='�$�eK�D�Y���5ί��� g�85��0w����k8�vǢ�}'G����uW9��I�X��c~ξ[�c_��,o��������S�����)z�(�]Qx��!�˷�'&�s�y�[Ʃ ՜����-������� p8n�CqS�7ρ�E���l8��yn7<�R�����_ga���4~�c�+�Th)����_���43 1��7r|S+�"-4:8��bB� ~�&��;a���YL�fW�N��#�(ۓ�2�t���יI��t�L��Ƕ�O�J�|�kz���JA.�=��yJ-�爼J6p 9��\v��XJ�b1���R�YH��#-���si#̦M2�>�t�S� g�b"�㙏�5�;�e�����2��|�+ +�O����� =.V�%?{�ewV,�Y ,de�#���l3������3��a*��pN7�9��nek�4�y ���g(���(�F�s���P�;���."7)��R��.��JŎ�].�%�Y���ˏg� �m�� K�(�d���X��ѢV��� �2X4Lq���턶�GIP��ݦ��2=K��e�6�ҿ���7�Q׾H����_��Ny�����5�K�/Ib�$�SC�rM6�MN�J�����)�&X:@w�8]e���o����s�[��<����7�C�_�k��ҝ�6��G����Yy�ҾLh_Fͱ �� ���3��k6�T�mq�ei�oi��⧣"D{�(���U�h�:D��,�xlO�}�fۯ�_��\DVyF�W�f��/����k\�2,����'X�L�5�����v� ��I��M���[��a��S4�,�d��� ��+48�/Q�xK�E��Dd�'�{�VwQi�>� f�<��a��Q�S��@M�5���x���K��+q�4;\49�p�v�X;HC�$�u;p:�S�ѩ�6�n�5z�q��mI�ޚNuk>�VֶJ��T����z�x���#��f(�-Q�[�仗��G��~C���(���7���_�eJ�������"(��Y�R���Z���� X;�Tv�Pљ�����N3e�Ք��1�[(���80EQ`��#.����x����� �O~�S +��U.��.HgI�*�1�'����k�*�j;����ʃ��(��`KO>�=&�z�(쭥������z�� M��Iv� Y��� =DF�ۤ�~&~OF�'d�D�wK렴Ĕ�DP�K�I�N���A����?���� �L!w(���"���d U�9�@�p��A҆GI�#yd�GΈ�$ ?K���Ż$ }����*wJkY�����E�H�M%Zc�U�V����Q�[cȘ0�6�H�D:)�y$O��y����Z'�$��bcx�M��ćOb_O7��x��G�?#~<Š���i1"�ѡ5�U��I�J�Q٘�U��!}z I��$�m�8��Ms���`�/6���8�e�|/������������H��u��^d��D�~@���c�L��<�0�"�"2� +*� ��5�"(Ȧ((�� (8* +�+��˩₩1n�&�D�Qc��%�i�[5�Ǧ�MjԨI�4��4�>�99=�Ǚ�g������}����T�:+�+�Hϖs���'�'- ŏ;�q?>Ə��q�)�S�&�ժt�����"�_�u�~�u���y����z��YWz��+��TXG�O�~>�/�~������طb-v7R�(�=z�B>C,N��)V|���^�������)�P+[�]G���9DF�x��!���Ng�u�%y��ab Qh�@#����`��5��2yi�>ZU��Ə��q@���V��f*�%��cD���u��X;��;������M,�$ǩ�W���5Ġ1 +�㱟��LV���<�H����f�؅;�I+�����o�[����m${��� +_�v��'� l�S�#���8�ia���t�����N�r +�3��l4�?6ᇍ�l�>UG$��o�V��*V���[��r�����c�գ��_�K�s��4��g [{/�^���g��� A' +��h�Ec)hd����c��)E� +�����ZV���,""[�.�v���._i��s�wr�#� �kG�>>wp���e���l��w�U�S�Vw �J�hY�G��%Vu.�ZꚢZ�L-q��"�|Y܊T�V�j���Z������֤y�-*s?�R�wT��c�xJ1��l�D�%�G(1,V a����Aي /и�r�F,�؈��l���CuR#�~���=�;iAo m� +��1� +��ǽl�����09�C�"�J�� �����(�EӸ�ъ���Q)5U��kTt�FF[4b��0d��Ǽ�a1��|���`��!v��S\7�y�a&�po +K#.����M ����̣�>�0�dQv�MvD�}�}G�EepcĠ`Ԉ\�Ƹ���5q��i�Fk��U�ظ/MjzbNs��5M�S��Tk7��IO��sf`f�{�{�����K9�Y�eI�PfR��II�HJWzr�Ғ���R%SJ���MJM]��j%7)��MG�`��������A���,W�}��́z��@��y>�9���J�T�q�����d2��ј�T�I)&��� +`��ҧ)1ݮ��E��X��gޭX��`>�x�7�e8نV7�m\��3��0*��������ǔ��.S��R3�(�;[�9%�ʩVd�LE�(}t ����j�K�4l)w)���W��e� 7�v2�l� {Emg��6�k|�m~sn����0�(��z���8��E BװH�~Rr_&�,��K8�p.�+��*.]���tq�������í�A�aa=�� �G����w1�]_�5 ͩPF�s([�\�!k�\�>�Z��i�Jɩm�*si-�䱎<�S� Q�� zt!��a�GO��>j��b��`;��6���{[ �V�f�6S�D�E���V��Fr{��� ��6xh���$��2����.�c}���c�����c����}���ǹ�}7TG�KH1��Ia�1�y�5�빑�o�z v�^x���2 +���� 3�#jr�K�� y�3�6� Y+0��;���g6�~��K8��N[� ���u�?��E�\vih2@o��!ނ��18��I��59͌�#� � </�W/R�K ե �e_&��*F;�Dj��ǒ�7���������pj���Y`��\�� �U� +���\eN>aF�ї�2����gl� �M���V�żu��ؠ�u� <���=�w��'-�]U���'��m���u���}�����r �uvx�a���}�k���}�Ӹ�_�C<�ω��� <��74}t�WE�/JD3�|t*Ш�-6�������K��A�N�w�}��e�E|�y\�Y"��qyW(����2�9�?9<�{�=�;��B���Dz�QD�J�^G�t�<ΐ�)��)y���|�X��5�<�\�i�0w�|��G'�X4��HG# �|4J���=�ͫ �O����[;i�$Nb'�'�sqbױsq��iR���M���6��Z�:��um�U�]K+T(L\�Mh� B�6��&�B Ć m0ډ3?�?~:�w�}~�{���������c�c/���V�0��]�b� -�|Q��_�75���������O �op�}��������$��1�s�4WG + :�kѡ\����i5ϫ��~��j%?�L��� F�X0���i�*��\ъv�i���f�/hGɋ�*��ɒ�5Q�&����>d� +���e�E�����i׸?�-Ye,���-5j�Ԫ��J-����ЬyC�� =�i�j�׌!�Ɣ��iM�5a<��Nj�Į1]ר鞒�ה0����F,Yڬ^F���z����Ч��}�c~��,lZ�s��Lf���1;5mnД�E����am��i�2�1˘F-�Jn\���U c>�nzRq�U Z�j��u��~���?��>�.�/8�l���>X�z{�f,3�qږ�)�Q)�&����i��U�֦�-��������,�x���w��n�m~Lъ��k����s��xUa�� +Wާ���y��E��i�t�-��<�3�M2�s3���6{��f ��5dw*n�נݧG��=�9b�V��r\��Ym��(T����O�����5w�U�:k�oÇ�g�Z�I�����"�r=I�8ce^Fː�H���_mU��P�Y�^g��8[��R�&���Au׎*X;���Eu�T�����o��͉[�=�������?�kh=��R���io�ޡ�yd,}��TckD�ָ��Tߖ�ۿG.Lj���j7T�2|[��/i�W��?�ճ�@s��u�~NB��/ ]�m�|��5��j ���RC�%w{�j��c@���霑�sE՝GT���*�^���eٻހ_p�7����ά�濏��Y�jN�~�#?�����y�J��� +ZU����V�n����T�TeOL���CS�-is��CO�,| �$[�[��&[�=��>Vy��54�И�V�A:��R��#Շ�}…rn1�*bQe�\�H��nU�����Ce�٢C�FS�]�C�;'K�̱{�M�b?�9�WY����7�3h��zϣ3�N A�ۄ%n�໣RU_�*�KT>`RـU�A�6 �j�`#�e ��)>s2����/�]��_SI�Ǵ��0��:��tf�|�0�^ B�-��'F��)ՃR��u�P��A�E�D�6$�dL�eH��K�ɘJ� 'w�(�[���*H^T^�r��*7�C�%~(�cFg���J� D H�~��h����O�b�l3��ɘ*QIʤ��&��*Lժ ը�T@�a��تuL.����EL�%�*P�l��܎������3��% C��e{ˇv���LJ�m���ϳ��?�ݿ�}�"� ��JH��%�:bv̠���RѰ$�H����@����p����hĈ��`ּ�>�5&ym xy��X{�g(b����5�� s/�w���)�1WΣ���0JW�AJ�c6��ԔG1��� �#�u�ơK�?C"<˚�eße.��o-�q�3<�{>M�z�mx_Sh�B?��ʹ��� |���5�[By��=g��®��r�'����oϳ.�0�g��K��2{�9����� �2{�2r����{������� �8�|oa�<�!�j�� ]�q�����8zlk =�?4��W�Ә�녘r � ����D��������6B���4-�q���EUs�wJ2�1�sg������t�@5y�q�_!1&@���p 7�" � �V�}Z�V[;�S�n�U�u��^�Z����Yٺ^�9�����g�tk��s�Z�5�a��w��/���������>�ׄn�Zr�1��xv�����fK�0�4&{C����Y����i>���>椏��� �~��q��>�J��%?��A۹B�>��z�Ƹ%�9����j��]����c�F���2ur��9�A��Ca?/�~곟B;��i��8�'U��9@��m�c����A�g��|�FW�(ćW�$� ^�~�E�a{3ظ�!'���}�q��=/�X�Rl� $�I�p�.G�&��&�� �ҝ���j�K�t�>�o�K�����O�l�H��1�������ӝ��S{���7$��ۘ~S����� �����M�̫2ґZ�v�>�����Ϫ@�V�O�S;�tF=ğI����� |�����ݞ�pOѩ���y��e� \���0]׹ ���i"�'k����L>�R��X���f�)������'Z��:���%t,�e�v+�-�H�|';��!����.'v5���L�qTa'�&3�i�B/��mt9.�h�XI�dn9��L��?��E����v(�� ,����r��5�^q�O�Cr1��/$v9�u���&�q'�����-��[|c!.��yds.3:� +��O�n1���.��̓�ي�� +��U2�E|���$���E�/�"|,��||���\�q7��˺������L�OgT��T2�Ce��O�����8[�S6��[���.��R^��/i8:4��D# �<4��(G�J3�1�y�J}�P��\M曓����T��p�$�:���������`�v�� [�6�� �jV����^?��!�=8-:q���HC��h��(f���S��wԫ�Mԡ�AS4>�.� Y�����2�a� ݩ�Ѓj +=��!��v�A@{���ql5[�=0f��O�5�3\�6��;ܠIC�tg�U�aɚ�R{X���i��� �Tk�h��7�9|���u�q� 5D,P}�J�En�����<�j�I�\���hn8z�`��fB7�]<��K^:�C�n0j�!F��x�58�l�P�!G���1���X�:c�j��m�����Ue�����Tiڨ +����I��߇�4�k��#�[c#;zy����\�s,k��4G����F�I �8ՙ��5�j�9K�f����U��Q�Uլ���E��3G%1�Tl���,�T{^�/�=��� hZ����W�L����Z�1yހ�:��Ɔ��bT�%Z#-6UZ�Uaq�̒��X����*��Rq�ƍS����Yg+��J��U�m�r��);�%8 ��:�0Z+М�Qt*��Nh�1m���y>G�BTa�T��,�5VŶDٜ*�e���/�Hy��&�)7�U9�]�N�%�}��Ik����2��*#��\�g�s��ó�֣���T�=���� ��W�|$^h)U��b{� +�F���ʳ��'+מ���le'��I.�;�FY)��L�T�c�����|P���r:��#�x>�3��z��h�L�9��eHc�_#yV���R��!�: �q��q�)ˑ�L�S�,��yJO-QZZ�R��L�#}�R\ ��z@I�Ge��Ǖ��6|��W<h5� ћ��<�X�uP�u9~���/^�N��� �I.W��\6��R��pɑ����"%gV*)�A���Jt�(�=O��U�y�/��G�� ���}U6w@+ј�f��y�PP�����ϼ��L���C����D)�3BI���iJ��(!ۧ��r�rje�mӈ�)�˝�X�}�xQ�w7U�� ��������ؽhN�%i���UPE<��r�{ ����H%��o�-?A�|�F�g*Η�X�__�b +�*��KQ�2.���T� ����^pQ��C@KП��Dڑ�P �P>ȅL���|�}�^��d+ +W\�Q��hŔX]����tȑ�_$�4��(c�,J�*�t=�T�����O��\�K�%7���ME��F4�� � �g��R]�AQ�g��]w�EЪ(* +�-,����� � +B��m�ă�D3i�F���Ui;1&ͤ��Nk�N�c�̴�L56i��֣�c��,�d�?�Y����罾��}��F�L+�����`��WJ�Q��dv|d��ȕ�Q �Jv���\*��C �~�;�+ιO��c�q��X�����^8V±����`>(� ����*i���d�_+�;IF�YI��J�d���T�'[��y*�u)ڋ����'/ыp�| <�<�_h���&����q;(�@1τ;�~$J� ~d����ʼnJ��**�@0��� �:3��"$�� �*�� ��!�y���U��Rx�P J��l�L_��qÿ~L��l�u1JXbPt|�R.�Fz#ì�C�H� �� ��N��j�ų#a��K�gpK-��/p� +PH�9ĜE̓}�O?���/��Q�_�µ�EgKO �F+�k+:w%�K�����F.�(\/�Q��u`;ϰ-�D����M��T\~�vPB�s�y&1O �_?��f4`��9��V�AZM.��?�P��px�s�{�E�z���3����r [d������!m��\@̳p}j��Ϋ)��$C��7�X�l�a�X���?X�6N`���LM6s�6�����U|R�M�y����Sp�w�+�TQ�"͡|���ի^3uK a·A?� �XWY<���e0��":�����1�%7���� p�;q|'��q�������L~x�Թ�|���Ӊ9c5�=���m�p> +�����q���/�O�=��r�, �w��}�q�K�C�M~���'��q~g���<�>�,��O� ڙ��zb/��k��u?#|a�g�D:a/�Caq0&�X���k����u�7F��4�(�8�!��8��G��䠿���&M��������� s�A�� ";`4"�hu��&x����`x?NsfO��8�)�������w �/�:�r���΄;��M�6���H��hD�9p���ɈH#��88r�p�u��\���,b���%�% +~��O +y��.����!��M��w�A��Q���j�@�|�ν�:���+�OQ8��|�����H���❧I~E?"�sp����h��B�p;�C�-�>�U�n�3o��>�$}����|�Q�X5���=�:�7j ��~�{�����=Hj���=�k? +�Ux���3z]W�]R�t�+p�k>�\P\f�Fi�3��[G�P'�^��uz�|���:��z�:~���C�E��0-��{/��J'i� : ���A�� ���ƸE���+Z�d$�����,����%ض㷋�\D�����K��è���!�A���6����]T�y�xs�cu��9�/���pޏ#��N�����[f|�a +Gb��]�m;V]��a;��l/�n�v��S����<��7v����#��dr �E�A�+|2�����;�1�7bۊ�t�f���.�v#ʎ��^�����DZ��=B]��F� �yB�z����}d�����%��,��ã%2v������b�\lQ*�'a{:�sυ�.#�U���{���~=�7Q�������By����5d��������f'�ީ��~�.�=��$8#��`; ۓ�=�b��eد�~��� ?:�C�ZE���Ko����� +�rz��S�L��9����q,���Ǭ�`#�v�����pF�H�o�~:��b&'2�B".�� +�8�p��@w���tұk�����uԣ�j�� �.�����3�H��x��U32�_ Vq ��G�-*3V�ÑG&��ȃc�e�T��<�x����k1Q�舅��K�y�t7��͉w3 ����ùsW;#��k�#��w3�p�5&Ū1>Y 1�G�T5I��i +De�=G����(�\��jyc�����m�+�U5q�r� �?�����'�����L8����4��^���z�����J���KXk�'�/S��IF-6X�3��k�,�!K.�l-H�WMb�����H�Qu�O��zU&����.U�UfR�q�JL/��tBE��p |�'��6��\�p�-�������^~w[��6�2�UcJ�Ӕ�j�T�M3Te��|S�*��*7W���U��V�㖫h�jͳ����U����k}Es�o*��!���=��pm�`�cm�zk���.|q⛃��SbUeMR�Ţ +�M�I*�NS�5[�ֹ*���Z����S�;�Iy�W)7u�rR��٩O+���f���L�9p��{HC����� +���U |��w�*�_��Ԗ��T��RST�:A��575Ksl�ʳ*�V�D��Eʞ�T���5#}��2�.�5-cD��55�,��! ¿���4`��$�|��e��}��o�Jx  b I���5AI*����;��œ��V�YK�f�n��V�b��UQ���y�U���ۺ�uն�]ﶹ��]����n��9� d���'y����^������z|���*|�̍W�%Ye�ty-Y*���R O�G��r��jU��(��Ek� +&-V��_v��l�4�~PV���g�~�<�mYm���j8! :�h0 L�ܫ�J�)��JA�� ��(�ͤB[�6p���U��J����kRA�����s�R��~Y�;��|Vf�)e;�ו��%��?�� +�zX��]���p ��U�[(�p9&��HQ�#]vG�lN��N(V^�O��S�k�r\m2�{��^�,�&ezv��yF����=�V���2��h���oh*���ց��SJ���|�w���I��cTn�I�"�r��e.r+��\Yŵ�, �TҪ������)ݻQi�o��'��}�ܔ�� ���R��Sp� ���@)>”�߬�8Ki�̥��*�Pf�Y��I�(/Tz�T) �j�hQjE'�U�o@ɾA%����;�Ċs2T\����*>W?�a;���R�ԃ�|ǤJ� pϊ|�THپx�&')�ʨ��Li�ԪP��*����J�nRbuD��ŚX�Fw�lU|�^�U�� կ�+|�D�U���ݬ�m�o ���W +<��w��L�F��j�V�����J��e�۔�wi��L������@�أ+�,�X�#�,�~o?�c�-�b���f���6WBQ9(.��ÝW -��RZ N)S 24���`�⢇X��$H�)Z�Bh�B6�� �)B��&ȖD$4�>������TP *1Q +<|.��HF3ńٴF4P(N�i�O�;�J�N3�X3��.kᡖ&��lAĵ�)��0�(��4�����1������{���$f[��3����K���7�E���,^�m��f��v��)��#�#��ψ�v�l���/� d��x��:��4�z0^o���Q&R1��&�J ȵ �����N��y�=/���亭�M�ԃ�����>��������!�g����}�6blS��|�s>i�m��d�7yp.�]�6��E,`��c 5Y������Q�>����9�f�q/�r9br9�c/[��y�fg�0��%�� ��.m��m������,����o�:�H��C���Y�k�7��f-�������Pl,�`�'�&'ߡO�Q�!zt�~��"�'(�~����sbϫ��5��*�]�Msv��,!�{_�3��hl�<&Bh-�TlDŽ�0 ň2���=r?F����(�8 +����a:t�Pu�V���r�4�%��-���|��4.�F�&�1B�Jg蓳�q��\�����E?O��Ar�3��!pF�p����v�R�#<�+�;�<�a�u:��Q��x\��(�.�A]�6��������}f���J��#�+�{��^��8���i����=s�yS~}������=*�:�+��G �/�P]Wiԟ�%.��~J�~B�.�i\:���op����s0�^/�c��_������>Q\f� +�4�G��5t̻j��L�?~�ʹ��y -�J�C��xЙOE������������h�4�7�jvP�}��hũ�߄�3�,j�i��0��)�(�'� +���L5���{�� #u�̼M��`��pEW����h���T�՟W<~�`;۹�v0�Ŵi%��m�x}� %��rǘ��� as9��j�j=��7�{L`e ��R�5�:�%.�Z;�����}��Q`�O#6���Z�m/���u؞��{�݌�VlE�ݥ����� �Te�� ��е/��i��Vқ���b�X��������1��\�G.��t욱k.l{�]��Z��쇰�V+�#�]L�b�� +Y��:��1~6����ktv �5bׄE �g����?���R�X� a�2)s��n���M?ӳ��ٮ:e��05&9���(�F�����d�}�{���\,�XH.�&=�F�ڍ��c~t��!셱ۦv��,�n�/f��:��z43Ua��K����H}$A��+oX&�fp���:9/:��jQ6��LC8J�dR��r���u�a���ĉc;Ǘ�N�8N��vlDZs�:M�$m״ ��K֭���b��BJ���A�V�S����V�1D��m0�؀�A h*h�6&.ZQ��PG�'�e=:������������3H�ì�1V�*f��젗��� �c%����X�z>���A4�lsG�X 㰔gKH �����;�;Ѩ$�:u�4���2�t���o>�.&� zg=;�6��%ʯ�c�³�x/�U�|��8fw����cn������i��L�"��.��|�5ը�\�nsL]�:�Yuv��0����-W�x�Z��(m٣f�A�,ǔ��V�r �����v���M�{�R�a��G^�{���jSW�����K��VZ�liD�ҸZJ�J[;�l�WʺPɲ1%��(n۬�m����j�S���"�� +ۧ���:��\G8N +6 +C��C7�]'��c�aV��DY�]-v���J��~%�uJأj��w�)��UԱ@ �1E��(llV��G!�~��*h<��G +W�^�k���[�K�Bz��NUy���9-�粼���u��7� �;�\�MZL�3���v@�gi�%���r1O��5�m +� ջ+rW��]��'�O��W�T]�HU�+��ީJ�.U��q}�����\�Kry���r{oj'�荓��@.�pm�4�$x#�F�E���[��ת�ס�ץj�WU� D�J�[զ��~UT��㟐ۿA���� |EF�pJ偋r����P��Otk�#�Z�!��kR��]��'D���~��vy�*��婩��&.W0#g�G�څ2j��<4)Gh��/�ò��RY�����cm����݆]�h�44O#��"���Ye�P�P�\u9��r�Wɨ�Uy}��4t��'[d��"kd�lUidJ%�#�DN� *��\��d ��Կ�EسA�,$!�=���P ��ˀ91B�4B�6Lֺ�"��og4��t@ mM@��m���ݍ>���T�𚱮��ib�8d��6�cL���l�l&������q�c|-0'�3/��<~w�4\�|tz�����F��aɪ{Y�נ6t-#���Hb���3ı�8V�j�XC�c�1�d�O��T�� +�3�o�c�e}~��z�����.hE7�5L��\�=5�-C�h,�I5$s��o%{sI���F�Mı�8�17v0&;X����T������V����f�������H3׆A�!s���+��+�z ))"�ö[�/:@�n�dw�t/�� ı��v?��~ޗ��}�S��) +�k�yR�{���꣯��s�"!�����R�t{^sk^�n�h +Ƃz��8K!L�t?I�!���q�8f�e�ep��#Tx�p�l���C����N.a0�U��X���R��|��������e��>oH���]�)a�0K$������S��gX'�0ٟ����q��%=y�2����ղ�1@ۏ�k#��VR�+�{ ��@^��y3�xޔ��T'��Y{.o�?$� ��%�K��E&���<{ŋ��s�g�W� ��ml�}y��`�}ò{ސ͚���:Lm�`VKs��%O�,�~����c��c���l:W�� �{ś4썓d��ŧp����O�/y��C�/s� �/d�"oG�G��,���~��~ͤy�I�K��L�W��W��^/��}�_%Կ�,jg���'��ހ� �Uf���yw?�6sZ)� +��:���2q�����Ӻ�{�Esx���q���~���&̳�g��cۼ�8��m�~��v|��;�׉�8i���M��鑶뵵��)�F�=��C��ݠ�$@��c��L ��ILHC�C􏩈C�����$P��P����}�~���{����<$���%<����t~�n�+k�|>��� �ݜ�7�3 0�(_f�ѯ�=���M�gP^ <��?��QR�$�gH�GH��X����x�< r�/0��{ >O�߰y ކ����!���$�=�~7�V��!Rd ��c�s�e �e:�#h�$���>��+x�y��K��+D�gt���������*s��B?�Lm* ���у�_��u���]S�2�5t��������,���v��#Wȑ��q?>�2�S�{R�#��a����Cd�C����/6��k���*< �3�������ϋJ�\;�-�[Cw��6Н@w�Y4�:0 G���t�7��)T 2��d� �V�9�����-hm[���=�c��0g���!��X��=��G�G��� ��x��l'[�p�<��Sx�<���:Gϟ�#~���)�|��{�6��o '��h��Vt�aE�.��U��F �&�1KT���0{�l9O�.��:�H��������:7�Ŏ������v9V� �]7��&D�n�,����n��_G�q��ɐ9�ߏG�5�,N� 2i�x��1��1v�1v�q|X��c3g9򎳥-s]�y���l����.���G;Q���gYl��Q��z t'��]��C��óYI��Ƞ��o�p �ͳU=���sp��Q���ZyֲQ�M:,��������6rc�e�4ԁ�6�ب�7��6f��~f��HՈj�x��2{����?���]��>��3�=�Ѳ�Єq��Q���ϰǦ!�[[��-&v�؉c'��v�ة`�;����f�L$��G�S�\V��Y<�:�ށ���(�Na� ����|�ay�ji�ȓ*ʝ�ʕ�3ݔ=�$[愬��e�pf(H��i�����cc{S���P�2(�:x��$��!��(��*�n�?�/�UK�/w6$gGL�������*���)r� �F%O���9�s*� r��g���}-ck��l���@%�!��4���� +A�hߌ�M-]N9K-�u��ma���*$MG+],lj�j���@���i�CeP���P�o�)�C��Н�$P�n��N�S���!��6J�@e�����4U6�]?M��S'hu>��[��w�4qu��:�@�z��J�����ʱ��{�-�hAz���<�2�Lr�r®Y�~���ΚE�~��A�!�a�h�66���@�A<�0ǀfq�&m�&А ��ឦ ]�` ta/��)�q�� �ĮQ��a�E{HY�a��Na�V��6 ��3]��Q�g6{����9���d7�l�����[� Pb F +*��e(P*�S�S +J��/Pʥj-2� ʴ:�ڱj� 3���H�m-������ɞ�t���;��o������el?V��~��Y�pYKb�r�5� c̉ջ��c,N����Y{����&Μ��&�38���]�p~�ᣴX���,�k�:g�HL6��}?�ѯ�'��� �v ?��m�I[�����-�����~x;g�r�!�q68�w�sΕΒm�QQ]·�˨#r�s[ � 7����c?}��&{�������v���dV����ĻH�����"��8���s��IKi�&x�A;�.G��d�#��#�h�^�e~��WN0?H���H�3�(�qe3~V�p��N��E�j'�[��ٜ;�nG��<�$�����H9��X< �WU��~�H<^�W^ef\�.� �eu�qD�I�N��ۿ�����^p�᳹��ϏU�6�K�<`�,�D$��+�5�>����>�ɿJ��Kb�&�>�f-� | +��������������Ol��������.>�I�Q��Aa�M���2z�� ���2z���Q�{u��΢k~��8���� p ޿������z]uq-����l�$.��%����~�u��9G�e�m�~~|?�D�~�bz�":����'����~BiUh� +^V�Xe��]��SNڟ&�h�q4�8Z�j%v�؝�lj�~��>�^���n��.�N�C)��u���}�v��!�~D�_�v���<���mv�\p�ǝ��;�v�d`�IЈ�"v;�;�eZu&v��;�#��bl/�"V��c(��p<� 4�z"����%�kЙcp�_/;mu�i�G���:ў�؊ �@�EN�A�{�;�ӱ;��a�rX��e��Q��Û����� ����r��W��+b� ���f����8�S� a��@䩾"�;�=�}���ll�>B�~ ���*Y�o���a���T�1�v���|*8�=���ط�{L�cz�\��c�Ql�z+�۱ݍ�>l`o6 �;������s�:��>G��NU QuCt��~��1l�E��о��kپ� Tc� ��~���o�~���;@V�d��jY�dg:Y���G��-��e:������5c_ ���;�~�σaWuM�C,��lr2�ژ��T2��c������^��y;u£��)TE ��G7Y���.���wm�k�Uh9W����J4f�<��i�S&���Tr2�ژJ���G��h���v�M�nY��m'�� ��dvQn��Kt\�iUd��~E&q 6qݏr�-e�/`53�� z�nz��W�n��A�A�I8�p4�Q�^'����t���UR �Tx��'�y&@#5��Th�G<�����BV�a֟Y� ���:�l��<*�jU�TtG�ꊂ� +���]9x +�L�f�]e�\s�u���u�2�U`�Үt��y��$�;�B5�ur%X|� ���E�Ί}��ṗs&�o/�E�̻,H�K}ܥx�#+�iժDb񠂉�j�����O˓�˝lSM�G�;lq�f�����܆i��� �I|H��bx�S�GdQh- ϻ|I�y"Q�X�+3�SD~�� +&�� y2�4Xr5�� 9�g�Ϣ)���K{��ca�q+�X³��Y�φ�$�/�"\C��edj(�f�s��I>�'ݲ�=�&=�#�U0�?�;���ӼMvū_nF�5#\�O&~���mX�fl�ؒ��! |�|e6���;A+h�9�/)>�O�&�d\2�5 +����r73D �V�:HJW ������xm�ǶA��lc�oC��%K��"�K+>�|��pN�+=`hi�y׀)����ޅ��~�F5}fa��X5 �Z��Z�"� +nUƱ�3h�:����Z+ne��J;�=��HYB6BIH�@���P� !Ѻ/��N�T;ն�K2��x:�ɇ�0p�=!����������?}f��^��L�R�p�φ��`@Vr����@�G�� ��A�w"0<����A!��\�ŜԪ�X<71 1 �'#�h�G�����w_��C0" �� 5m ṫ�`� �",B�",B�P�G�b��P �!�BpS/� ���t���3�Ϟ���ߧ"�$������/��0����` %�����:�B�r�Xa`F6;X�Ap��ٕ�Vb�\���r>�i:��_PK������� �-��:�G��/�Ґ�9�c+.q|�h"�|�X� ~5.�5��uб�Fl� 0�a|x=��u����04��.z�E4)�����x ��C�$����Hl-� y��ױ;'�jn� i�\ W8tl�-бk���؎�nA� �pNlEMla�Y�6�{ר`� +��Y�;���y8���0���_�w97�=�Ec�g�@Ҁ��=� �б����Q�R$Ή �{P�1��j������`�� �B�΃�Vݕ� �Y�k`Õ������(,7U +U�+�'F|`��� + ^�EMB����@n/����+i�Q���'B/ p�aT�/D�;��C!��X��B�"�0�c�r�>�Q�8�8/l0݊���M��?�xy~n�0���7|��c�ǎ�0q��)S�M����s��^�(d��^^�2l�/W�Y�n��_�z��W�l۾���ܵ{��"�ވ��־�o|���#G����?�����>���3L6��ğ=w>1)�B����Y"�D�-��U�5�ڂ¢�Ci�����TS��ź�Ʀf����f�pvv]��|���nܼu����}�ŗ_���o���������~�O�����D%�}�y1�<\�'�_ �g��K��"0X�8�d$ D���0Q��P���p)#`�@�L��6-��F�8�n��#����m��O��@zH(=&����c̾�dݽ��z�~���x� �F���������Eyy ��= � %����� �G� ����X�'$`(�,�K?W-=C� ��o"[ ;��=Q�o�;p0�ȱ����4�Ï?�����!Idr� �-�bX�w��AWM�1 �� �0 +��z��޻��}�_>x�������o=z��;x��ɓ�O��k�M�����uDT_�_��ba~Cٖs�J��:C�R��� ���Z �G#������e&\Wf���HK��i h�0�a@À� 4��� w�|��k��f�dKe����Uh�_ݯAų�s��94H�A��Se �*�g�)�A��x�Ӏ� ���n�_To�O��*HSo�Tb.�W]���ޠ�Z��A �Р�%4(��ײ3n����膆��>�n��E���$YL�!�`*�_mԝ�/Qs��Р� 4�y�"�y��SIf�uaƹ���gc,�i��0�,5���pCu�~S9Ѡriȇ��۝+�]��xW�Y��"��Z:��Ӹd�M�3�^��Dv �9��7�V0��N6CC4��N��۝#�����>1tdBG*�������@C��'�ie$5��h��ͥ�o�t��Р���Ur�S!�\ʖrz$N�:Ҡ#{��脆�ƒn#���Hi� Кʷ��kJ�� +�A�˱)s�Ny6�K"cwgI�=��q:E�+����6� ������Zg +�U�o-/�4C�TР�a;�rV�(�Օ�Б�u9'�_�4��q��b���f��՚� *ʶ��̅ڸ�|5ǢT�۳,�8��Ȅ���#Eƾt^�鎗�{<��6�X��jwУ-VZ��zQQY�kF}QL�Vנ����ϋ�I��h4��X��$�&�}4���9߻����w�?���c�W�{YE˫���}�?���Q � +˱lp���WDL�|r���V\�`Ɖ���мV��mӰi�4l6 ��m��{�Pdž��g0|ǐ��0��a���V]ց�灡F!ʺ[Kn۹�l�{�`�����?�)`�o��h@��l��ǧ�"���sf\޼�-R�tɌ)��N��m-���n��ë�=�� +�5��e�'#1=0h�tH���h�#E��A����g"�F ��V�h�•��I�b�m�0;;�6 ���������7`�2>���A :�S���vI���QĢU�]1��W B�% O�Xo����L[��n`� �`�Q/c×���hޫF'�J��cs�_��+�!��DtU3(��˗�����vj�������Yy�`xN+1™�-x��[�VJ�f�� ��Aƻ���C)�,�ȗ��fjkۭTk���ë����K���/c�k$f����L���G�z�(6l��j�;^i<�)7�m�}U���ɰ�w>&�t�%4��a��S�&�Hs�ĉe!�e;�l����[�԰�0ݸ/Wi<�k�Q��� %ߤC�����X�� o�����ƮO�W�}�/���>{�cI_ᜲk�s��,�p!�m�,�g9�@�O�v.�Rg�u6A��$Ⱥ[�5���X�=�ښ�Wǖͯ�s���l��w�rl$&��"���;$��&,�aq�����J'�=ʲ�[_vw�MæaӰi��7��X�?�ښ��c˖�9�_�� 0t��JddD�'�%x:,&rA>'����>\0�EE�h`��Nӽ���GW�����pk�z����^`x���� ���+W���c"R,��B���q&<$�Lc�i7�_uA�[=k��V�}����;��Ǘ�/ �����b$�fǢ*� ˱\P������W@�i.w�Ef��x΁H�m�j�i�HW���#-��]��`�0�(̩� �I��HL��`�� H��w��EĴ�ϙqrxsvB�@��E���͌����:yn��8~ ^���I3���m��fځ�6MmҔK� IJ� q�C�wI֣�y�G��ﻭ�Ѿo�bK�l˖%[^ �p(t�4u�U}\�?�ɩ��k����3������������X�b�?<1�{B1 )�����ʠ)��u +�e;���5+��j�K״4Œ��^�S5�x{z��~q_=�a8��� �ie�/��Ŵ�xX��j(�Q@Ө����ʨ�V���f� =[rS�PԤtuE�h�x{~��� {����/���ͩ0��/�����!=��k��[�8�P�&��ڪY��� ��V $7�yM�RU�LMo��gn`�#��#4�n�%u��b��D�@��tP���f*haTI���Ț^ʸ����,��o���e>OU�q� x� -�"���8����g��3h.����P�ԗ����M��Ь] U,*��WPW�2�M��~K(���d+\����+x{���ڍ^o_=�N�i�o���Yz!�p�g�'�ئ�b� +Z�(�e�^�ik{�����d�E�DU�ۆ�a�}�B���{_k_����ӜB3�sޔ�J(6�y +��%��<$i�CPM�����Acqd�<���k[cݍ����G�� ���ۤYѧ���ۗ�� 9�J����6�"Y?�1ᣱ&=���3.�t�ET��]�J0L �)<������u�p����} �'����/% ��hT'�bj&�����H�Cg�0g��d�sX]���sF�aFG2M����P�`3�n�c8޿ ?)�J����._J���ȱ�N��p�/��\ڔ�I�Ai�9�_�S����b$k�d���l��Sݳax3���`<�_V��夗]i�5_J��ov�+��À��� 5R!��ڃBҦn�u\�#�.��@33lp�1�%Y��K�ִ������_�[�l�6�$��4� ��_1�}Eo}������O(��E�"9_72����NƘ�ɞ��x%+,��C�T堶 �#��y�{hX��`{�a�4'�ĝ�7�PeK(�"��*$��}�x�-B +N�h�J&.��F�%9�*J`mA �G*����Z����]���i�;�8�EU͡��k�t@ �{d��K��م�) �9k��~�a��ə����(�k B�~���gx�l؂�k�N(�?��d'�i�i/�i +Ŵ�xX ��jx�W�:ep��C�1u3��D�r~Ϝ�K6-�('�,�eS��$̻챡�l�o~lP�����u�՝���xXO��u�`�.8��YN��J�db�=�5�P:��)'��4c�]��|kˆ���E�����+��؋�1SK��"mnf��:�p�~0H�A�\^�0�K ����Ì<�h%�����\�|l|����5���Z���س52���C�Rj��=wIM̶i���5M6��(Ƌ(�Ԍ� I�Ҕ�-�&h��8�VI�l��G�,M�����%;%�_<����3��mɟ�!���J��-�΅�&nc��~/l�E�#����aj��!Prj�� �d� 0+j�o����U��7�*Öo��6����|��$�?6��:��x�_����󔺫����K`�L|b�����>*Q��J ���82Eg�`�*)=P���3�؏6r��[h�/�w`�}����o�羣�=\[����u�᣻���nj:|����Ͷ�o�Zp7ȗ|Im��K��u��:�m�lB%a�5�0��as5�ޱ���wDGI��^�{I��vx�\�/��$ٝ�����h �c�D�,IFI�d��B#mZ4�7�"��T�Ձ>m��3��V?1�Y�iޯ�-:B������}�K�y�/�e�N(���^, +�ю�d�,A#$9Z6��m�toJ�Zmio�=��a�����qS5�ݾ�|O�����ӂS�a�c�O��0��.v8���h�x�'#TQ*L�I�H�L��ʆ�t� ޜ��Yޖ~�0˪�a� +��аm�=�ć��“�!A�)# x�B�1B 3��QFg2�R!@� R��`�, ��}�o�w�Yr�6[�iì+�a�u�c�7�1��'���R� ��9#l��D�������}�q�N��ܱ��qZ�ӝN�U�z�uu�k�@�zW���EAAP ��I�\�Bx $�����F�$@Bȅ��pAEV�Ժ9�;�m�-ʶ���������?���������������*9�M��8b�ɢv�:j�h"(VV��@��ߠ���T�e���i��4EJt���Lp����avw�k}n���䅜4~�����1+�=n�*�(NU�� +<L���;s���YIN���iBx�6��� +�_�s�Z���fF�G�������ܰ��Z)H�B':�!�T�Ur��_JD���o�t$ ���H�\$�\���V����Q��"F�a�]|V��aG� ^�j2��#(Q6�"*r�*&!i"�$]0�� k� ��A�]0ݺ�4!>�DZ�р��/�rz[I��V��-��9�~��`q�L4�5�z]E�����CmdULD�D�](Հ���������OICV�t�^�D�A$"�C� V[��+�{�$��SL:��Q �1h�G��� 5M|CF�^k�ʇZ��x3UA��P��i/ � ����n҄di=�ۊ�~i��+�z�d��%�C6�@��>k\��O�X�["�d���>�Еq]i��B�6gx;iذ��% � +gd9� �$*�MM��//uxU�����a�����k�f���R�2�ȕ\o`����*�X�(�� �0,OƤA���q�����.�<�1*;� �O[�T�������{�j8lQƒ� �.3&�B��a��:A�8�/�� W=��h�S �g��4IC�΢���/�}ڐ:��=k�J�]�*��� *8�l�]Kh���-nH�6�j���� &_c�i�S 3Ҁi�r`xaؚ�D�y�]��Mݧ 1M�&��o +Zr-��s.��j�)�kjT�A�Ad�GO�۸7`�p�HG��ܤ��M$Հ�!�o�?f�*w��m��2~\?h��2b۩z�2�ln��ʯK� �@1����'��TY�Y�0F��G)2��U���h�Ӳ4`^���2�nK֬f{�}�V�m�&�p�ҁ�-Zw���Zܥ5U�Uz(Ԧ��MjJ��� m�3G�r�A� ��A��%�h���4�� `Z� ����Э�lV��y�1>����g���<��X.t+L5�2hA)�-�h������D{��b��8V#�aU�h���%i��2������4�!�_]�+�.��x����k��q��n��-1c|�Fȏ�` +�ju�~X G(ZF����ixX� Z�E�u���i���2`y/7e��Z{�~dU���b�k�"UW�Y��s��e]-���5� ?�H 0 � M�((#DDYa<� c��0E����P�ۯ���e���z`]��Q`����%y���$4�)l��� ���V�n�b���:3��6�z&�O3��#��dd� ��� ` �cs_�Ǣ���|)p�^��g՟oM,��w�9�ԛ$Ib� �i�{����e�:'�ɳ��+��e���;`/����L����l���Ś�{1f�/�w.���{ɒ���}�x}c��뻬�2 +dw���6����M���f_�����=8=�M4��~ |�y؟��~u���G�? ���ӷm��H���oz������ޯ'�|%:��W�S����� 8�#�^�87Ѐ����`�S��ӏT��]�=�r�{L&��u���~C*�gN�{�i��%8� ��dp�?�3 ����x���� �\�ahe�eh� ��jO�y��`~���R�M�OU!�KrU��h��>���D�u���38lj�,J0��pz���T��~��ޡ{�&`jm���յ��k�˦�t˸��("�R�(H�ɼX�&�Q�oAq��q��˓�2�,�a�h6E�e��X=7e�Nަ ;63e0�u��O����ɧ4]��jn���H�"Q��RĀv�ߌ帶l���a,/�1 �G�#���Œa���ܔ��>ehi�3~�1k<ʞ1tȧ���i�PQ�'5�D^�LRM�l�)��l8�q(˛G�|���� ��0#x���eX�+)�z� ���9�Ys{�xJ1�?o�����'u�d^�H�2�k������q2,9ʄ�q�0�0�|���h����ahe�>o�옵fϘ�+&�;j��pQNj��$���� +%���h�>�鵐i���f�qf����b�5\��É���ߊy�s�&`�`���1k�{�ڦ�4�vT��ᢁ/���A�ɩ�YL�"2B��5��=�+ v�:̂*;\�q`r�!�=�\=� ���y�������c��ʚq�OZO:���ᢉ/��)�,�du��P�bM9�7�Fz\W��j��z{Be7&�H�΋�� �(����� ���un��̬��u�yP>�8�Z?�]�'�[E(f��jY1)QU��oh"��^�jN^�l�^$o�Gs�4o�-��Ҁ�28��>u�9�Ƚ�yh�l�u�^s��K�O�3�;(j��zIyD.� �A�s���\��5KT1��E�����7��w�>u�>����3���m�u *��].�������NQ!iWcZ�DX��� ޲=7�B��^Ut�pQ+.hD����2�-��h�M�;[���l��'�Ap�d:�d��;,{O�H���g�����p�j�]<�5��jT:�h�Cj���J +]QI�%�d�@����� [����[ߎ�A;.}�߆w���[|�pRB�\�G;���A���-��٤�����}S��KU��T*K�0)�!D=�eR�oh`�2x�o�.���cxk���{�w��t#;]�ds��=c�?�bv> k6�`B��:��E�M��{M��DZ�"V�E� +��Ӽ�g�w�o������2���o�M�{� �ir�e��Ӈ�Ţ#�3P�S + ��}���f�j��;8�wy��m��>3tE`��uÅzA�Q���ln�w��G6{�x�����ϫkE�7���]�H��H ~��������5�_8��ɯs��뜀g���q�+��>~���?�>].L�m����`�=a���cܜ>"�ˑ~R�J�ai�VUXaS��/���%(\bxa��@� @�Յ ��e �nH����\�tz����K?��Y)�ƶX �f�#fHv�uq����Ҩ�Fą^DJ� +��a]��XH:�$�?y.��d�_Y«�����Ѷ<�����/����"|g����v��tȣ����L�eU���'���돉s����F;��3����� �����@^~ �\R��|Q{i��K��|� �;��yw��p�Q��~��z�D74�� �(/����� vj �H�R���twB;ڕ0�^L�G;��t=���@��A���rɊəū��K��~�5����l;��ζ�Й����twfe��vu�V@D@9��\"�IH"$! ���" I�r��Tģ��]ԭ.�㮀���:}^�E_|�^<�<�~�$���g���oX7�XMs���S�R�8JI�j��'��C����=� r��[�k1^� �}bc�O����7����_my~{`aa�G�O�?d��8V��9Г×��;��-%Pȷr���|%��jMk� V��"H+&Im�Ty�x��d��,c���T��� +1*S���]����S��wB?6o�?�����>Oo~~���������Z�J^]�r��rj�����[���E�ۛb��.�A�\��Ԓw��ͽ���� xY�b�N����8�ww`�{-C����p�lI�nF�'�L�Ǭ�/F>�-/��,zT�B�^��������O>{��.�����V�~1���v��tnYH�I׽{Bc{C�������: >g�ώP���:}�$%_z��^���U�S~n�ˢ��e����Ϫ�������q%�k�ҔIe�?R˒�6^L|�,Ox�ri'� � ���ޥ^y/��� >9�}�Ǿ��+���2�2AnB:@$����dP����������Ɉ�ğ?�Ǐ۠d�~u9;�3'��ܝd}/Ds;d~��>�O`��?T��.�@�WY���4�v,dG$���xPt2\���11 ЧO|� @<(�1>0�n�N\x??��G����� �)��e�U��Mu����ƥ�6�-�k8�b#S͢���v�횮�馐��J�~�Ү�����*��`w��o�2�`�i(�`���!�8)��:���W���@�K�����D�|�Ъ���j���)��{���g�3�Wzǫ��qd�q �1����>��,�� ��A�����y�-�"�8��Yh��f�NS���%�o�_%B�)�X7�o�Ƕ���;L������ye��T;-���� ��D�A  ��� ��� �p�[�Z�T�� ͷ�4�zS>Kk�L7tD�a� 3��f��Y�`�l��^{��j���{���~8 &x@�� ���?= +�R7 +��E�Une�2�^dQD�L�r���9I����[M#D�%@P؆�~?V����N�����8 ��o�� @�A$o �@���� (�pM�@��/6,qkً�x�դ�f�u㍼�*d �%v����k\C�n������\��ӂ�9�X��g�h� �?�)lń(9 +��R7D��k�P�Pq������Kf9T�$�Y?���. ���c�(w �5�A��3��x�ی��{�6�gsv��`�� ;���l���lH�k�lԪ��a *�,�ђY.I3�����8�a���O��r���7���91f�k�p�oui�6�����ٶ�0 ��( KJ�lK-Xo;_�*�%/�K8 P��*��c�K3\iaY��<� r��|^|ǐk2�L�=�>_������U�SI�;�İ� 6�mN��H OH�T$�+�U=Td���웒r�l+Z3! ��6?��9�(�zI�!7�3`�z�ѯ��P�^e��-'ڜ2�������a@d�#��LҖ*1��:�H�F�מӼ(/�J�� �pEH��y,���p��W��t��:����;��7 ��^)���m.����3ȷ '����=�Zs&�6��qg +�6�q[�ͷ��O���G$$�_�py���"��!hgT���6�! !�E f_+��Rl.���[�b��u��ũ�@���36��.��}"~�'��>�]W�6���S�L� +�� 1�f񌒢�Su<*�q�O���h�fuqi6g����A�m8�%h?�w�=��Oe�4Ĕ=1�a��$P����[���k�匭�sH_g7)h�v!oF�VϷ0�&9��6��g���t���du��l�`�5(� _�YT8PG]�����s߉�5{4�;�~e�l��H&{a�L0�Ejm����<,P���2�|��s����sz��l� �e�1�-�� +��?N��٭�<�������T3���T��TN���ؔ�f�WZi[�y噡r�x �((�x����J�� ��!x$�)���ef5��5M����>�s�����׏o�P�ʝ~���w8 J��W1�4G��u'��C����0��VЮ#�ԫ�%JFWV]��R�-fE�`����%l�a*�2 +���& 7�Ym((C U�5X�B��~�dgr[7h��~�� }���hč87w*A?������:�Lڞ�6�4�^or]����������҆�Xѝ&j�L/RiY��vCA���)T��u6�Ae}�� +����{4�8=��?p�k���������b�P��Vg(3���]��BGi��K��{h��nzicg�X�e�TC��P�� T!١} ���փN��t[�>59w���#;�vމ)��/)+F �$ev+����Ӥ(󻒔�.�R��PtSj]���Τ +eGr�Jc(�D 5f&P}�j-~�&s�w�l���&���n.Y�h���)�Y�Qt���в��E~���Nkb�r[iWr��a;���=��VCjRic.���Tڄj��P E ��&P�)4����6_������.��K{OkV�W<>D��:�Ew����a��>r�:����lH�d(���qm���6�r[uKT[�|ks+Au��t�pP�.�0��Vh�a�����f'�� ,��լ��R�:!]:� �se���p�1"�@L)�F���K�%t��ەYݑ�@�� �29���!��kZ���b���.���zۖ���7.nޭY�����[��"B��>�ߝ�1��c�E��G���C �z)�?�"�W���Wc{5:� ��D����UՄ��/ +j�DA�?��i�W��7lZ��7�ʷ��;����[�����%���NJ�d&�Dr�'IY���\�hR�6�0r�-��ʺ6�W��C���`}UI���$P�,1�oDAÖ/V:���e��ņ-�����`�,���o�Y/ݱ)�|���! 1�i���Tܽش��D���ι�t^�73h��0!���-��/������]6(֣��5�~c#턉��ӗ�R05�n�l�:����C�Ly�!� �a�1Q�_��sO�q!�)��%5�#�����03�g!����0�̃�T�����2��^6��:ע4C_��XW �L�����: �ip�=<��U_��A�ޝ��[T���X��+j��Jr��K&����x��?�<�pj��xrY��� +��F�֠�uF5��1�x�n]!���L03c��y8Z���,�v�cAp��B���^�G���ubϜ��>��'>�������s��Ca����@Ci4kP z#T�=���sa�Tؽ��;�`�����f�Vg�� �� �;`��x�N�@vv���G!�� R\!�p�����J�C���Py���8��Otغ.̾���߄���?�m?.�N�����8���B���p�Dt��=�~��8+[�Z�!H������[C�k#`�X ���0�- -� �"<�A +|G�F��1���<�SJ^�R�0�!Y��@*��'Ve�.������a������ +f»3�����a����C����6b�@ ��F L��r��p`E�eR�+)�1�h�����"�0�Alq�<���T�;K��?C�L�ES��T�Z8q]41(�� �n o�o�>dl2.b�"� ��>c �@g�aЫ\B��X�K&=�ה��%?}�*���_��Ŗ�͐��i�ŢIb�h�X<��"��� �JF���A����0(�&~>� ����C ���e ���C�f��pc�/ش��LV�bJ�-?k.A�7_"���NDˊǣ�%c�ƒ1���;���;���A�Ͳ^bYgT������2Cb�!�,OK�=� y�Ы���7�����D�vZ�C&�3O���&L%H�q�1�����|4JYq��Zy��-�����>i'�:�O�J�|�C�> 1d#�LĐ����3�ѫ���or���ٔ���T��Ûc��M'M$��c����ؚ�r]�0IU=u�f��#��� �Ȯ���Z�T�!�΢�<�0��ZO��sj�Ӟq�ku�Qj-����"eA���` �@XB$d%!@VI ��%$lj@A��A� V��G��;ߙ�uz��ݼ��٦$�DbR��f���w�9Wi��Q^c�UT�-U3�f5URm�J*��0P 5p�̇ƝK@���ޱ ��C�?� +�� ;61|��������3$�-�!��x�UF1�x��&����(��b��JfX,�t����f(�F�ނ�Og5p}��o1(����f������������|Sv/�%��V}�)�$;͚�F�.Meם��u�EmvC�'�h��QCݢYа�sh]��,��^�trx�77n������9�7Lw�@���,�Ddu,�B���� ��%�k�{��=���e�ե:�u�S�.u�ܥʐt*�����ڿB۷��/�����7&V,tOm��x�}������ o*�<�^DA�xbyލ��0��>P,8�Okĸ��D�T��6��.�HO:{��9F�#OV{x�A��W~�%�=���3ϭ/?u��l����m�Wۂ%/���=J�=:�U|?�H���d�eP2<���EL���p�Y?���h����1���} �־Fo��/>дp��y�7g�3w�{j�<���U���m���v���?�6�T��Xq*6;��ϸ�AJ��S�+�$����<��u�� #j��6r���`D 3���,o�p�H������O�m��\��ekİ~'�� ������g���g�=�`O?H'���O޽P{�\3A+���E��%,�a\^~l\�f/�Zvll�k �������sip�����9*X�U,_Æ�۩�#���߇Ec�DǧM�'%�HNIx���+�\̣����$l�/�ptl���%��17�~K^�} 1d�N<d8⇃ȀX� �<&(G��dl��1�?�Ƞʨ���1���3?��������3v���jjqB�n8�J��:j`�G'`�21|�� ;7�`�&�o��P�h�1�G a}C )ȁe���dD#O�/����6������ �P{]�䈪�F� �(��䠀�K���c�.#��Kq��gK���hpu��?ŀ׊@ؿ�tAC��}��"��c_zA�W;���(v@��ہ��;�\�B��Pn� �� :�w�#��-����y��a��~�� ���C'��z6� UC���_����� +� B �9�t� ��;���{�p�?�*���N��N���&� n� +n�������lw�� p��?�8_�QC��< +Lq�;FV�k�)�+�>e�RƜ%Y8ω��g�z�4�Q0�kMa?M���4�7�q���1콌!�}� �X�u;1pC:b`���!7Ey��!%x���„�Li�������RK�33o�T-�"֋�2���$��+�Il�l2�_�;$���'�I��$�ʻ���厐������7�Fz�, ���\� GN�-M��"Eǚ���T�`�R%~B��L&6�.dN�(&p�G��~H9�8���8�l' +�����]��m��E �P7Ȍ�E2��&G�rp��I/�9��iγ�"�Sz�x2�*}L��|DjP�'^81Nh�~��ʾ���}�8��K�� ��i���i�1��U v��p�9��l�� �Z$���N0g�y��4�x2�L6A�T�'�f=$7�< ��Kl�#���&���s�)��' �/S՗���@�� ��A� +N��*��1h��b ���d��|� Q&�O%x�ΗL��(Ɠ+��jU�) �Q��S���4w�75}�M{Ҁ��6��D�6%h�'h ĈA�D�A�� p�����m|(�"F-����l��Tže '�Z�8�8k�aV��m�F������wI��I7 +�i����~���~���~}�F�Y;A�2�� ��Π�q����@���P���B �^���W��f�ΔT!��� sF������.��Jsѯ���z��Jr����И�k8��W\��+�e^_4� 1b� �,o���B��!� �APw�}A"���N�Uq�SJ�xBrR9���a�C���۴s%�Ime]���+�n���n�Yf����SV��)��)��� ��!c�H�ɽ_��o��C���P%��� �I/� ֔J z�P*�5�ani��Ԛ�����>Z��*��|��a9���8�fkz����.7q{�ʹ=���O@�d�A�� (F���0��a�DY0���H ��R'u��J���P��� + ;�-�ִ�WS���Xm�zN����f���+���2~��D�]nt��1���k%��~f�o�2� �0~P�y]�܊�?����K�� +��Չ��LM�eQ���k�j�\��r�U�[k�תK�mV����H�aы�LzqW�b�1�C��O@��s0��� +�&�����߷ua�s�Q�O���ԑ���Le����-Zy��Uq���R+��� +�Yg�ԕ�[j�2Zk��kU��6�N�Q��t���.�bA&b�#�Vg���L{�B���P��z�7����C���F7��}���V3Gv�H�wV�e���U�+�mŲ�.�5���[�4�m���y�6k���R-�4���UN����#�rH��������|j�x>�A2� 9�1P��R����o�<�݂x�.��NW��@��Ʋ�5΅�ʃ���vz!0$l�Ŝ�� �KH��H"N��_Ԥy=�H�z�g���04�A�y����,����Ey���٬,��G} ����"}�b�g}��OX��e��e�K�'!v�D _�0Y��ǩo�"ȋ��ą����s�^����kJ86׍z��99���`���t2~@2ȓC�ByvK�߿靐E�?)�ԯ��&X�׺��5�\��L^sv:����F"����e��d?� ƿK �\⇻�)�t{]u�e�5�y�n4nq2�u�e����I�� 1�@�&d� ��t�G��e��ɍR����R�؞Z`n�v��b��, �S!O��"������� +���Hu�� r��K�}*e:.װ�~��v�x�c��O�ѥ���$Z"��o��i�eLMo��ʲ�@[� F{�^ ؙ�Μ������.�z�D{�@����,����D۵r��Z���� ?�����8�r�D��݁A� b������fL6�lL�0V;f��`�K���dp3%� d 7��� l+G�q@�#[8ko �G-��x +�,�=�j]�� �b�O��r��T�!H�4�d��T2���-�p�Sb��j������'�t��C>���Z���M��ISs�?���Ç k +��L���DF�r��$j�@�#H�$���C��!ױAU&46Aw�'�(���vG�U��Nkp��+����o5S�B��!J�b��D}��Ӄ���P��*��C�D�}��qI�E�3� a�Q����*�q�G�t7Z��#`&gV[��VpV0wE����Jz@٦ �}�}/D�І������.�ݐ��r%�`U 0���j(�6 +�pUa/S ��1f�-����u�%o�/&��|E�@j�� �R�|�i���A��� +~����9�_�y��"� �-c���>CzϐBT0�Bh2@E��jp�B� �e�(;`�uz�P/�R� �e�@�����SWI-A+�v�w����>�o��/��e�<{�g��@|˚�]b=�{ǖ�� lMi2�4k��p/��7�0��D�'���^�'�� �Rʚ���B���ka~�mg}#��|%��#�3a&�����ϰ&�5���==-�:+Z�QԣuTD+�ʅ�u�Bf!�� �H�,�'$!�Ҡ("e��(U(�L�x@e��(λO}�����s�7�i� �/l��>B�G/`���X�/Ш[��� D��Մ.3�#6'�=�0�]� ���3ĉ�jқ�:��k�����c�i�!�i�{J���FӚ0#N�I@Z� +��݀�������������xr �9{�"=q���H�{\v�[laSBzYF��� +�Hz�1��|��`�D>e�1�̦����X� 5�Q5P7y7����@��?H� ����@O< ���qzܻ�,�\>�5�F}�)����b��_d��� ��< �y�`ۣ�pna�p�E?���t�ݦ,p�8�����9 ٹ��i�$��,~�'�<�=E���3��c�h/qǘc�Ӭ�*�h䥄g�x�=�?1�x��~�M\��!�_�;�_�[������� 8> �yȷ/�5� �Yt ��A�c�|bI�o���#�e\���=�;�0�� c�Ñ͢G���V\_�͘>�؇�:�Cɹ�>q%�y?�h�]����� ����z�jPo�4L � A f�~� �'�J�8=���le����C�5�Q ��Q�I��^�M|or=��񁬊�@v�ܛ|�ܛ�,`�:j��p���!u�l�,���Ap#��@�䐏bv�/����f<���#�|�`l�� �\��Qރ�R܎�V^��N9O�J��t��Q��'i= +�G�,`Ow&���� i�נ�8 ��`ڹ��} 3� ѻ�k���J&��DD�0� �G���M�I�T:� �wc;�������rj���ޑnct�3:S �])��l�G �en G�� ��`�2�w,�� o�o~g���1�����Ag[��$�K����i�Py�R���T��'5kk���CW�l�Ƿi�Y����jl|��(9U��ѱr�����fr�% 5���0�3����o�'�:��M�,��s&��[W8�n�R�)UK�]^6�a��֖ ����6�X~%dg�El��|AWIg)�E�� +� ��b�� �K�1��F|q B̳(�V=���1�m�xC��Y����0��;�̂�c��&���ε�k�����\�,�����č��� �`�rlLj��x��cW���ʴ|�Yu��6��NQ��aK:|a�6.����ݮ�X:ҝb�M�f��*�7�C��IC�<\:�������W{}��w�/<�ص����SS�~Ս�����u���q��uDP�QT�(��b��I�l$$,D�*0�:ŒZ;N�Z��:n��ǵZP*���2�)�UdK����9}m^|^�������K.�7V����z��a�Z�������j�BK5}��F_�\c<�\������m�zG��i�af�ӛ����0�ܻ=��|��j|4�쳨�Ǟ$M�W?l{�������I]voqf��"k���[ե��m+��U�n����zZ�h|��:�^E�h[��m[�?����Q��IT��"�b�ŋx���F���R.��p\��T��*�m?���;��1�t�e!W�r�Ή��D��y�jx,k#�]�!ԳQ>ňX���&�gk ���*�Y>c�Ȏc���d�%rQ���)�#5Ңq��+�Qh�G��3bw�F-!?�&�H#!�����Ej��Z�Q�q_��qY����_��iR���H� #��ܰ8΋Ŋ�h�������M�\� ��sp1n�q���9fG���!�~%d͠3Y /�RLt�F�kӡ�\Ob� ��IC�o2�� ��: Ʃ���:K��ayU���4c&�Ϝ���Bp,4?�� �#G�2�_%d�B����R�+>a������.|�� s�����xF��=�qs@�� ݄Y0�)։AX���ISQ��-~�b��Oqp�?��;��"s�;�T�R4HH6�•%���t�0 �`�Hp\�"b4�G���v�n��M��-�1��3Vw_,���Q�1_������@?� �`g��]!�gC����zzt�Ph +á.��r=3��'C�M*${y�C����B�EXtY �m ��R�w2���6�M�V�/z/钼�vH�?��i�3 �lhS�`�¨DFf(�Ь\�_�ܜ�v���CrH�1D�%�3O�� �;r,j��ߥ��h@a��Evy���7�;�S���0� �A1���lz�,��� +��8��H��A�6 �M�PnK�|���bH�-�� �z9DW�UB𘂠�z'�~٨�]�Bf���oU�� �A� %�@ǰ���l�r��2p`^cI<��B���W(w��8 ��V�)%$u�WT5�!zJ _�6��+�_(lt�rH� e��&�f�|U7h��2}�`t����06 +c�P��2A J���$7�?OC�j!L�0lSA�G��~Du��AYgV\7��?��Q��tR��6�?�I�:�?���K��� 9���4d0 �\`�Q�r�$T�OC�l6Vh��%o e���Lp��q��__�ӫ��ڣ���I7�?������k���~�"�-�ց�j�W�u��Dd� !���I� 2 h�����QP�(T�hI � ǭ{{���̋��yy~��y����$�A��'b*�3��7Em��J��O%\�OŚx4C���� � b'iݑ/����f� F}�KF-�%�:v2�2v�f�A�i:Oǡs=�_H��`��0��Z�:�*�J?���,�m:����� 20%�� ��q�qC����hm�ݨ6foT?�'j�݆��4�9u� NU��<��*��А^� _b`4���0�6YA���P��2�����4���]f��2�e\w|D� x�����~j&��T�x�X���p%�=�6�s���@4�j� �r�ѐǓ +)� [�`b�c�1�` i�,�p�<��f;/���_����� +|��A;�s���T�!5஘���I 7X���- eI�$-�>�CX?�\Ij(c����O3 �4#7�6��N�0 �������Zd�{�߽\���m�l�׷��m#š�C�����.9 �!ƶ��˜LV���]�Q[�j���6,�Ke�DŽ� =�<Àd0�� �x�9h��@Z�jK���f�{�p��?�����p�j������w˓�S?�+�<ڕ�ߡ�c�S�X�8�Z-P�K�j~!�B��l��0{R2Y:��=,V�G��r��=/�mDP\s`z��[k ��sB�f���jv,��t^<{��� ��j]��7�w�Z�u�@�E מ��V�ET�$����x�b%R��ν)S ���$�"�B��˸D�5ŕ�hڷx��HG��z�,߾ோ;�^5�Y�ovY��cS�%�]7+Î�j�~�jrXU�P�P��l�,S�.)��Du2qrg�H�\&餢�a�H8�,� DO�7"�@����@��*�,��X�S�����i��y���}�-�z.��h� um����ǟѨ�1y�H�J%e+�f�%� b~j���ږʑ�!K�餈tX�HF�y�1_d�� �9��i�9%F��Wa`�F��������N֏o��������U��6�>\w1ҧ�"6T���U�"O�e��!�<3�2%Q�*�f<�%��Ii#b�|TȖ� 8)GjD́dtm���-����,_������tm���k�Ń�]_t_w]������|�`e�DAmLpf�V�"���tn��K��R��%q��)�y�I㲇%dՈ�znLHK��� +B���@ +�6�X����֬��6�c�7W�G��0}wv�]�:�����֋��5-a�9��A�ZR���N�V�� +�T��#��$�J�đ%�"\�hrL������ǟ7��J#�rn<�����[���%/sڥ�Y�-x�g ~��5��=��?�X���t,���S~g���Z����x�B��/sI$�4IŎ�� gj/�C����5z����*4 ��F.!g�CȚ0 ���-���E�m�-x�l�ۀ��l@�З�}p��Ɓ}�U��7��ܭ�>�"��Ϳ{��IŒ�81�k�5��R�ji`����M��K��� vX��QdbF�0 �� �v��<���[�_o�7l@���陣U��eE��m�z�]~?h��n��/�$�%8����v��C�2��]�$���ow/���4��WԀ�W��K���կh!�A�b�;,å`�� +t�Y��k�2�4��c����G��f��M��c��ݬ?�Q�� �}#ف!�����'Gz6⼆�p��q^�o �7�}�����:���Y0y!��`���X��NK��g j�,e�UL��9or^!�p]/?��4��$B���Q.X=�㴞�0&���+��A�m���;���2�]�>����0�����Gz�bL��;Z hk� �,A�}kPd���k-��[me�{V�g]�1f=��Ϝt������{j�x�&��{���9����:����j��o�|�}�{��׉ϾGt���~�;���߁��p���F:0����Y��c�>:̓|�ޖ��y9�ӡ����7F�y:�-p.����]gQM�y�? q� +.,* �l!!!{ I �7�k�KGw�KU��#-�X+:�u��A=z�L[��8��� +B|潚��|�w�]=������hi�l�*5{�.]0���wp3�G��N RqU���"֘[�>a�s�bOn���"��)����{��>�G�6bڸ��-G�x}�H�Y��|HC4Є�aX(AQ���<��f`u|�$$c_R"����mJn�Ƣ/-H�'�<�> ���a���@TN������q� ���G�����q��2͓�$���ߡ(��2�)*%�`�8�z�� d��E!�; q��L�.}6D��3�e|��4�|����Es262'aq�h��/Ȣh���f3 �2���*��� (\���GA�i,�; <�As +��R�u� ��t�:3���A��Ld>�� 1�y��� +��J �'�� J�C�ʀ�ÄF� ��KTaP�-��!��D��XK��/l��d���AV'ɺ��.�g� Ivg�|���[x�bd=�xM��4d'ѡ`1�IgB'��^�9��p��GC�I<�ے!ٟ +��t�Nf@x&�v.�Y�wg!�>Y�������/��y���B� ����t�&xC�Ȁ.� ��&E���� �[��D(��@����/8�n�Bܖ�>��B�E<�����C���!�ρ�� ُ��Qx�� /(#hP�y#o1&�����BPPCU�ꓠ�4 ʝ�� =�G��BH�#�3�������� KG����R�9�� �&'}HN�J1&Q��O�n�=�[}K�Aݝ ��<Ϡ#4��>��(:�qLT�}��å +A�1���(�I�y �-|�v��{8�TgP^R�W���h�ʟk�4O��w��y�����w�:�?�.�)��4�½a#*�}P�2��3�L�}*��Q�������hA�d��$�?�ҵj���}��������j��z�o������W ��˦QӅ�Q�9�g0��"7���x�&�����Xś�U�@|��e渱jGʰs)w�t��u�V�+�ne������E�c8��8��ᑾ�x_����~������aK�y�r�p��f.l���=��tГ|�{]Ċ:�&N�'��ؐ=�ա#��1�+m�W�U��]����G�F���&�K��_� +n�[n��Z���d(�0��[mmEC�S�C�-���_���z�l/�y�A���o�"����ؔ�-�Y#���z�Y��[����|���%��+���p�2\+9T�cqK�?�gK:-��;,�J/Y_8�Z4�h� 8N�J����),9��y���L~#�d+ȷ�.��ͱLlK�2�ȟ9�( ���v�����mp�o��]_�J�SM��k{A�s_�%�Q�{k�7%�γ�����������fG��pY����eM��>��'( ���d�ȾWOz4̣a[4;Y��p��؛=��n������[�m� .ѕ�+�+��ۗn)��z��t�AG����d�9׉�+��e�U�|Y�y�+׾ʾ�ݮ~�.����'0��FfQC��5��&2�����%��?�1��A�d���袻�[�~���mC�������?�h9�|{ɉ���Ǫ�]�]mK�:j�\����]���E����tm_�W��l�y8�yƟ�8����H%C�E�S��f_˖���88��9v!�5d�l!�Ҵ���eFi���K4�L��������������^���XY�A�@�����3A���������Z��6]M����D�j+���.;���f�w��9�&G�7�%��ƞgTF�.�8�M�<�m^�?�7���O�g�g9��9v:>$��, +�%t��IIl�b�樒���I^�֥N��{��:���+�v��x�o��f�:4� �kR��e i�"anH^lYXVt/#��\Ԉ 5�=/%z*"9z&,9j649j>$)j�%�=�֓0�{��"_���B�4{Y��S�.u�E�p���@���� +�k%���Y�5_qO�f���Kf|����P�w�� �.�F +�&�B�W��Lx��YN\�;.v�% +�#<���{�+���U���ͤ���Hߴ�z�rL���N����M~�jK��� +�O�D�dg%2�22YI�„)�x����䇑�� ~d�7*a:<:~�7ǎ.�D��DaD�r����xY~nS�ћj�ᮽ�&ʷ�m�Z��_��s��2����P��"�wZ~ܙ������� ����*�d 8�ᇧOq#Rg�y)�~�[����&����� �`����A� O��_B��'=����q/n&��y�d,@؆%`mY����`�Y���n`u���g=�w���4�{�@���7|I:�H��5 �?BH�I �t`{R��"�n>�|��bf�/s/m!��?�삐OV"x���F`�'���!�,ɹ� �0z}��OX ҂A�g,�7��{Ɇ_g"D.�ǃ +�Q�v��Gl���Y�MtBt�"�s��+]��*W�5�Fh+ !���:��i__�#�;?=�G�+b������� ��`>���7���ҁO=��3�@$�fA����b��"�h%�[W�WG���mtp:���f�}6aי��� D� �@+��5z��q$X?�r'j"D���u�"֕ +����S g8@> J�d��HJ[Q�+��<���:�� D�3q,����]b��k��,d�;2�{���!���8?D�s3�듀���U�HXA��P��AK� +}�,�N�&-�*��unH2� ��_�x+l�ƴ�Ew���Æ�؃Q7��Q�9/�9}���p�ŀw3W�q>�&��!��?��{���ԯ��Z{d�>@V�#֊A�rAr��UU�=,7�J�$6�^�Z�^%�s^�[��%���*�7�!�q�+�C��;Q� 8/���DN&A�-��d_Ɠ|Ň����-֑{��@w. …�lٲ�t�[����R[����"�WQ�T�;�����KRg��I�O�����{�[��7�c��!� �q�e�#�C1�$WLh�b-��� +#�G��4�g� ��_4��egy?Y���H_κ���s[�+▲%��������kҞ�+�o.J{�I�E�eW@ܩ����j$���>đ|)�֑�����6�UT��N-g��7G8���/yZ�\�ИN��n}���%�7�,ܫ��Q����=��V�!�Jy2������7ң��v�[����V-��@�g�_B��idg�'=���������6�M%sz_e��_-� ~6K]n�t^7 +r�� ���9戞�����;�O���?O9$���w&�8�|[ٮ�]ٖ2�h�[�ͩ㲦Է�ƴwI �����dg��Q@zlZh�R��jw��Z��OkCf>����VE��u��v�$�ٳ!�}*�$�\KlWv��#�Ir8}��`Z�j�Mk귚��}���#ꆵ���VE}Ƹ|{�[)!yD�m��H�@6o�<l&}��� ԭ��m��ݣF��yN��$,�P��}U���.��+*�w����W��d�S6g�4e��6d\Kٙ٫��N��Q�d���s����qYU�DH$�[G� d�Υ�‘2V���r�G6O�]m�5�n6�;^�.���{vW��6g�?�h䷙6 +[ ++���e�y�U; �jks?�լ����}���0�RiN�0��-�1�V�U��0.{$�m�J� �l޲�T͡ �p�<߽�����V��ԫ{���5�8���xt�hWf�lY��Wf6�nI�Y\#�-lTW�O�0v���Zn|�Z^0�3 i��M�qTU�?�(˷��y�����{)�L|2���8��k��݃�(7x�_h �{�Y�����G�Ռ������F6Z +����Ě�*ye�N�fSkʦ��Ԓ�4S���b�:S��T4�1��L�� � � �a&�.&��������{�S�͠|�>�r�ǔ�m��ݭ�%��"���J�};�����u����ʍb��Bf�\�.1�M),�,ո�LZ^ُĀ>Ӑ�X:�)(U�ƔLV���&�Bٜ�3(CU��沧�i�F�uh:�'ʿ��۝j�[W[Ģ��x��=rzSS +�nW&��./fk�I�i�ViqU��X٬5X��9�S�Y��׺�-C�u���yTe�4�\�Ѫ��u�����MBXEA���aIX�E@0�qW�z��Z�D� +R�EAPAܵEܗ#n=3�v +c�NUԞ�,�g�g��|���~z��y�}?�ѐ�f���͂1=�ŧo�A���4ӵV+����ok2?�mW{$QRYk�+;��.�b����}���˶���S����"{qI�����yy%�����w��,��>{I�@��m�˶��\6��E�~����у*!ݮ3���Ft�mu�M原T�յh'l���y}�Oq���Oj�# ��Ǭ;�&a��)�*>K_X�?+w�᜜}m������d�}�=�@V^�`�O�2�w � Y���٧D����N���6�� u�1�ֳ.��3�&������s�Ւ"/j�T6慮;�T��nu��Ûf���=��,=������sӪo2/� U���YeCs�w��F�Rև�D��"�_I�Uǧ M�����%S��,��\RU\�,=㰽C�Q�>�wݩy�'G,iY5-�yc\vSѬ�c{�SkR�N�o� / ��Æ�/?R�>�*F���GRGC���o#zTFt���b=�����t�G_]ҡk�T�%�^ 1��M�m�D����d+/d�/>�08����g6��;���>�'^�:1��U��>���>��f6#9�(�����T��Ѱ�臝Dw]������۽j/qTyÈ��M��{�\�]���ۑ�ފ�_q3�m��,��k |��V��S�\�1�s�6��zڌ���1�יӣ� v�y�Ŵ#>�3�����D�]�!�h`�?���Utr�뮈���Ӗ����O}�����[�8�:���>��������˼����&<ت�}�;h�����V����F��By�Cx�]DFvAu:�yD���gD7���#jnf���ʯ���Ӗ�"��kNkzż��r�� ��=Z���kCO�]JO�xV������cz>�F��ȵ=U��͊�t2�T��8��w(C��@u7�5�2��ω.��4>��/��N�����͈V����/y�/e���TF�Wfɯf�Ox�dחa3�/�N׷�!�o�c���.���܂��M |{F����D��7��$�/!����5Z�!���Dul+Xvv�'��_�=7���-)�_�3�{p��~���j�Z��x�����Y4C��� +�UC�l��w��~�����d�5��IJ�A�lbY?�h��GX�a��D��|K��#Q�;#J��Î7n:��Z(���3 +B�H�c?d��`����l.A��T���VK\��_��0l��_�Lj*�P�5˿C��)�<�?�g�D(��5E@�SÝ ���j�Q)f�1K� +����X.���"[���$��X��� +Ϙ� LG�b3Pr�h�-�O�rz���ż#�Q(L(���?&�|X2��$��B�9A�9@��A˷A,� +I|Kd��c��kf�.0E���Bc����<����M����|=����H��U��`J�'W���›'� �� +R�x�,���Q��[9B6����'�2��q�c ��=/���J�Gp � P'D@�~�&P,6��:Kȋ��Yfσ�����e +�����[�1<~b�8�c����!e���NÊ��f5(�8��auhBPG /�*����h"['�{�dxW���=�� ocg_t�����N��:C���3pf���/F�a?�������/��C8�#"P��0!Bg��I5CH�xXAU8�v�/��_�� ��=�߳�P|��]6"�3/ܠxnj0�|��r +��;��A2BY !�"�8����@"�n��d3D�L@��I�l�E�v{�uDP�3�\�jv��� �KS������_�! X� +��@H ��+5<��B6��9��X��C�'��� +��+ab2,1m� �k� r�ỜV�К���K�i�����N�'Խ�#�מC��~ <WC�V����7>�E��pVCԿ�.��4���Y�EjE���( �"A��%��� ��#@��#r� A(�"H�M׫�X��VG+VW��Z�]�gߝ�/��g������|g���]�ך��$���i ��V�c�jD�0��!D� +hzG�[���C�q n�@=������_�\���r}A�s}F}��� +ns���[x� +ϫA�y9��*Φ9�|���f��9D�Y@��D�B(���K��������D��*�׌F�!�.��mz<���vl��i�'�k�?~�1K��w���Zl�D�i&x�b�6S �����a� [nb<���$^�@`1��—� ��x!Js�C���)W�?2a�4;N�a�1v���k +�ZC狰o��R �#���� ��~�H�{/px*ٽ�_� +LJ�j�ٰb׻��ͷ�=o�:�~��y_#��!�|�\�q���w�|�� ��$|Ã�Q>P�@��)�w����u�s�W`���Qn2����#5h�����y��R��/��ף5n3Q�-߇�/�5��u�M �� +�N ��:!�x\�$hB��6&�P(��APo8���.S��3�)mO��EH��d�����`�\�i�X��f6�iK��'E���d� R��t�v�阽�'��;'����� :>|$l*���������@�zg���!�U 4S�� ��V,� �=v�����S^j�R� +\�g �[���ͨ�.�Ǭ=�"w9���9)�xOHK���U|%i� �t� D0���^�y�(�ewE�&:b�h� �F 0$@��@�)��=�Į%�Ω�s�?A� ��şS~+[ov�l��Lq���ɥgr"�2�.G�R�IZ�YEࡄ�c|;�+��#v�l���6Knsc�$�S�A +�j)0��@7��b�-Ǯ���ȳC����c��S���S�f��z�3%쥓a�㹱.#��->�J �;�,�3���*o&e=d}�0�6�ߐp]P���W%n� 8�r �r`�d�0���q�����-�=�-@���Ѝ}����M��>�*g./�.�q���<��J�άjkF�Q��Q����I>��L�'꒮�O���+I�X�"�) �]��E��7�!�=*��n�F��g�f����O���NT�F*������=ERώ���\�>��fP陕�}z;�D�/�*'D�ˡ��9a~�5i��(��akR�e +�-D�}/� +=˷D�u��z�|�o�.5-Bg�7�߿�f�6x�@ w�qo��]�GSI��:m�u~�<��Y�S�Ѫ[xU�0'k,T�u!T��H�R}�����R�lu:�@�B��L tOKA7*,Е�y8>�n�G߶a6޲�z�1hQoge�!̩�R�^[.��*K�ח�k�U�M/+�(L� U�~���P���^��^Z6��j`���0�p�X�W����w�T��� �h�u:y�Mt�5��2��-���&bEK�h}]m�[UM�6]e�_Q�*P�+��K+���njQ�@�ɵgCe��"y�;��B�����;9S w!���!tC���}fh����@nj ���Ք��UO�����g���uUMbW]C�Vm��7ϐ���N�Աu����/� ���D��{�X�[~|p��L�[V�)���D��B���w��N���c=fh�� ��r��Ͳ���������]�5��gm[�Gn˞�Y���ʆܠ��RzB�����N��Q��H�~T��� +Ș +�Ht@Ė��Z��Y���pـp�{���C |i�/CC.�_����-���+��aN���n�݉[S���;���mŴݭՌ��V"��0G��)js23����^;B|�3$t�oL>,u��'{�R�F�j�+E��^O?��dr�7�� N0����7]X!�@*Bw�]�A�d Bc� ������_ݤ��t��{�+<�sA��!�(�s�X亄#qΒѤ�Q�a�N��:�8�?�&l +��C ����D�aI��)Te�Z=z�Sm�:��g\j��j�=��.���Z7w����:V2ֱ. ��VD� ��ױ� ·߹���?��>����k��/���7�����ZT_ks�7�6�m����Dna-r�[�;~����c�x|���D_|J��������>�KˎEћ�ԂEG->����v��8T)������N�в@]��n|�;)������T{s�%��35�q0Ͷ����m@���yW�����5�;��d�d���&��Gy�S�-<D���6z��vc�_֍Yc�o,���d�Yb��j�m��t"\�����8\ۅHM��k�������D�� ������Ds;��^ ��,����4����㹼~o�cd��� 8=� Tx��V{���� .�\�;vh�H5�mL¯����.��Cw����C׏���ma3�>����^g�sX~����G��[B���Q(e>����*� � ��M��C��ra�x�a���yFc�� xGa�w$xKp�'������ l`3�v�o�g�&_$*�B��M���# |Ʉ@�CBZ(( *.�\,�\ �x��H���`� �X&c��� �ࠇW�!���fpU3�+�l�?����D�"��\" �Hų:� �I�x +C =�q�?���/�8T�� ��籎簝'�c�??g5��|����M����˾E��r�b�(xS�(b +D��ZD��hĒT� �/�j!8���K�"f5S��dZ�m�$=m2] +{� +��-��HE�bfy"z���} ];ҏ|!��i�ү� ��9ꏨ��bD�2w�a1�x��d�]�� ��Ԡ���kyXz��LVG�'zB9� q ���h(�� �F���|�?��b��2 ?ɜg��fn3�~_�r� +B,��#dX�,�T��<�I���i� �b@o�����i^;oTo�"q� ���P#F¶(wB�+�&�x0��U�&s/ �]�ND�P��}�9�0� <�T<�5<,��6�]�0N�a�h$�.�n�?� ��� h>�zG����P��A}����1�a�4{��W#���"�f2���ς�友����#;��� @v���Ȩ�A�K�H�?�0��q}�5�H����pvE��,��U���O�� ɯ)��cI +�n �e@t� 1W͈�<�Y0*Y���-�CS��ph(���� {�r��!{�Y����<�q������6G�O���g��Y�I-Gd��n[�����/�<��a��˂���;�g3&�YHe�ϖrȗpp2.VO)��R��lO���s�h�pV���WC�K�rޑ���G�b���f��蟳�b��_�{��=�S���W���dV��H<�U���6���@ud������� e��D�*%��d*�=�'� �U�x�x^h_�I�c���pM�����+��c/���]�k��hoR��'��/%v��R��?T�١i�C{$��h�B�gX�8���$����^LUp�6�0�,��yߜ��멚xm����F^,]}��*�\�{ʳ�?J�1�Ҵʀ﫧���4O�m�bEۄ?+[+�M:V���Hi��P�v}��>���d��j3�q]3�r�57�`��g�0o/�iK9����<����r]�QMgy�%D� +*2��2XP�H��TA�D �@(��J���ޔ��A�B�6��=�������sf��κ�޽������������{��b�� O��MbCx-�'���I?&s�>���XߎM�9#�s�d��kQ���5���n�B���N y\8�� �� �<��;� �?Q�B�+ y��#��p�!������u�N��x���ʶ�� [Ÿ�] �X&w���g�������<%ݫ��:0�/<8S�6|����n�:9@틼H뉸A�x�h�|K�D~��F!ZS4����.y} + +���|&�������t3�I� ��l}�#�fr+�Ȧ��0k�4�f,9�nD$s�&� J�{�j<�b���1=�V���7�j�=`��~f����Y�G�j>�U�wQ1������k �����n����$o<.������x:���rVȖQ�F�"���v�I��v$�5� +Js���t0k�울 Ne�NE�OU�{�J�X��( Z��0D] +�(���ަ�i���0��E&p���J�ה�F�ߍ�yǷ ʣl�2v�2��&%ݵI� �ť�3ɵ��D K%�)^�U +�� +�/� +E�s +��!�B�h`���/ � {o. +���c��2���{WT�K��E�V}���9�{[�I ����rU���:]M/�6� %}���_��7[��͖��7[�|�Ē�C��_�dD[ :����U����7��JH�u�!ܪ��5���*�5�L����Ne莖˜=j�С&�K�<�\�YH)ʨ�+d ��n���Qnz� ���1����!Y*b�RSv�1���0��x����{�J�.7�[�$��5���; ��ל���vU���<� u�����ST�b���t��<%7GEϒ׳dY����a�$�8�̯~�Lđd"�41�2D����� +��Xp�;O�눠kX�M�a�щԭ����q-�5ǷUWF�R���W�%T��V�ze��R�kYE;')O�'̝��{���/!�s[����Y��)(��J����"���j& p���k��0hk�Z���1�i8f�� ��� �.�Z�U��*+�{H˔Ԥ�j�����<�����|���/_�|b +.1��]���$�[�=��gp�{W#v�V���vYB{�>bc'ٸ���Q�9jU��#���'�!�@j��YR��.:S�%���񫚙'+|�*'8�8�|"*;R���%��S"�h5�[�K����L��q�����f`34�&��w3T�1L�z���-�#�6�-�.Y��(l���5+ȼ&�WdC#-������ n�� +V�a�#Fp��V#ZX�+*_ͿE{�Wp� ��`����`����#6��ფ�!��l��y�� +�@�����N����{S��s\»J�C:՞A�=���q��;���m��Aԣ͈zL�(Au�y�{�oq�`w0������@-vв�u������q��1����Q ��-q��/x�l#GN� ��*v:��s9��>�Վ��i�q�\r��@� �o/"s;ٿ}5�2�G��p�s�g���N� k�dӻ �iWR��X0�o3�9�j�U���m�W�;'2w�(��������t��ێLݒc��} 9�. �ra��� ��� ut 4���|�$@�MH�3��v�;b�=IQ�>�as����7��[�M��Φ[sf +��fjv�g:����`K��ږ:�d�u����Ȏ���1��{\E�+�W�w��A'�@?@ίXΟH� �m��!��f[���B��ਞ��_l쫏^��'�1�)i���}�g��6K������y+w��Vn������|�8x�8�]�M�����h��_ο����-��3�'����p����C�"�Hv���Y(��9���y�ѡ�Y&�/J�9�hZ��r����u3�W/�����~���,�=A��}�ny���;P�� ��g�D.~��gЗL�{�(�m��#��� ��a��!:� 5px�7�?��ՙ���Sa�20�� ��f`F��P��"JQ,X"q%��Uc jt�E��=��.Y{�u���ƵG"%( +��!�����;�O��}�}�'�~�$�~���0Ofh����#��v^��R��+��u��BW e{;� ��F��;�m����_ x�(�6Q�}�اD����֍"�j)�]�5GPps�`|�(|H�?��-"���"��)bϏ߈5X/v�~�nH�>6J�-�߳�*� .�C4��'����D�����D��8?��( + +�� А:��H>0Z�ArCO�Y� +y�JL�X R`��Ev�%�����,�M4�����/q�-�T�{�c���DA�D �38Ӆ<�Ajt"�����@4�э$H%��ΊB+g�l��jٛ������?�-�Q +�=�����9ߧ�ȓkpg.\�3���D�\� �$�7��1# g1,�e�|�/A�b|���}�~��̂"F���M�414�b�C=A�l[�*�p�ªdp�Ͼg?Ƞ�"���cM mdp�k7���a߁!\@�Y@���][ELA�,�o1: ���T�4V.�f)��A���CS��As���=��5�V;x�O�LO(��?��o +,�*�l!$F��bf��/��o��Il� �ErhW��v�n�����gGОc7�3����G�:([tph�‘W���!�s-FQ��^�w�M�'b�3�͓ x�� 2��a�o�2�_��MJv(X��#0�bWax��bhpl6�wh2��w#� P1��F�� ��o� ���/ ���^����"�u��Ce���#|�=�s0/r�i�#L�l�S��ʹ�t����s��_�&�}��� �w�/�p�3��������� ���!*�s}t�$�K�z��x�g�[w1�˗!v�]kt��C���:�szk[���m��m��k��W�j�k���zV]g�I��V������ �[������M��t��:���\BO���$ 5J��b�L���+oJ,��I�CC�)�/��V�vY��"a��y�:�g [ܟ��v��a�i� ?z�Mx����}->�㡽�.�Cw&��]�mqm{w'�♯����E��^d��֬QSzɫ�ly]j��y�h�'��P=�9]}�G����K4w�V{�J��u#qg���|�&�x��B�S���F�ӉПHD�1�v( ��C��jx�m�#�TFtf��NL�P�ɮ��+����( �}߆}f���DTDDY�aVePY�M�*�X�&F����M0.5�9�Ѵ1i�h���Ks����������޼[ą3r �{����� ��ʏ2h��nڒ�۪1Sb_��ǯ���*Ҫ=�R�D�n���a_Y�9�����s����MF���""�,�MB��0R�߯i��P���Q�t &�V�X�) �������w���j+�\ټw�I�l�徼T�ʜl~Yv��<��s��Q��q�;Gr�/+}�_�~�?#��_��� ��I�Q(MC��0 +`~'��4�T�?P�L)�<��j0Rm�|Vw�ﲶ�ns�z�����5�;-� �mK +2��d��<�gnn�(3��[�=蛚u�?%k�?9�_r��>)�(N�BQj& +S�(Xla���ᮔ�^����;���4�>#�80Pk=u�L{��Ӽ/xE}�Z��h�Bg./�c��$�1�8�%���#�p�0��U�$��M���K�]�O�=��O>�d(N�GQb. +w�`1�J��D}���P:��}'i�h`A�=�h�cZU��4���u�� �kbMeՉV9�i�Ҋ~���-��F�X��_r�'N>�+��+D����8�E; +Q����B��`��4ԃs5ԃz�{����vH�[���C��je-�ZEM�+�c���-$u)�)�Y����$�Tz�U7 �U�xm������]��;��xs�6��pk +bJ�s����S� 5��P�H3@/����*��Ʌ�.3��re�v�.+���k_��ٶ�0��Ӥ�{,w�d��h�9�(w���辩�K�pB���r_�����:l�E����X�� z.��,^.�����V�ô6�T������~G���K5��=���Z)G��v����M�w�[n�̳�>\��Q缮��kD��{x���������v;��a�=��"�z�NϤB� 4�MC��� �r�f�h� �a]���';m$��gx�F�����[�b��F��l�6_7 ����o����7䴺���)�����A�U�輺���ɡ�QA5h8A����z�v��V�,��Ns!e��L83 ��������G����x*Ng�����L�бB㐱�U�m�� +���kp��o��o���ȱ�>^����A��wP~�1�?O�H��1Ł�i=�����3L�L{��յ3��OǨ��ޥ�zZ���t�n�T����!��AC����ӷy���F�sh"�D3���\p-�Ds8I�?D�������M���y`�%6�U"�� l�BgE� b���� e�J�2��L^��U++��fMOe?���Y-�k7��g�]����e�w��+���b��G)���F����)����O+a�5�X�s\�3� �)�ς@x+�܊f�֟��b�t�����R�k(��j/���˔? �'��OD�T�� up~� ������ ����`�$l�F����򙔱xV�2���e������ы�,��?�xO��{�*��Pu�A�o����_t��?��_��#��?�����%��7j`��X~������|0�^��@0��WA��Nx絔��A�h�ie�ޞ`�og�?���hΓ�����|9�g|H�t��7B�|����{`���'� � zh�%h�p�4�40�pp�X%�B0H��1B��o ��F��ʗR��Q>�=��� ��X=�Q��[�L���Ʌ�Cy+)��hE�ˉH #[�!�`����|E~\BA�Y��p�����S�8R��B�7��(�ˉ +r�o� ��}bL� �x�`B/Hb��͇C�<��h�Ơ�3���̕A#�z� j��A�M,�H`�Z&)&5��t�>2L��$����U�)}~D^�� ����K�K��0h�Ƞ ��]�̝ACo�� �l`��r�I�$���!�� 2A��%r�|I�N���e�J�����vv :�2hO������Z1�[�•�X���B�\RJj٨�B: �Bw����,��\'���u}GEugq�SF�A�"3��u +D�PAd�2��30� ���"�,��BK�5�ZWc��M�=�hbY�-��b'���s���u߻����}9(z�y'���V���&�q_� ������N�q%]e�v�^Hi���h�d�e-r8hQ�A�:���'��h��E���"���[|�}mq��B���L���b�?�ǖ( z�Ũ�����-�,����rw���( e�}���o��w��?$kxo%�7���W�������C���gҋ�_�w�?�=�߷{'�+E�;��oKQ�ܒ��(�[�'e8s21�E�3�f�N�Px�pz]�8o���W.Z� ���?����Y�̬� �Y������ 0��/��2���]�7\� +�g����'\e�� +�/�����p�@w��$@/#@oZ�P/��^���z���~>+���]�}�A&����ݙ�;����U�'E���b���;��w�>��3�_�q�������)�0�J�Ƨ(:�@��3��8]��z~@��I�w�}҆��<4�{�����~ެ>��;��ܛs����\�Z&��U�ٳ��g��7'���d�Y�>��=��x�����5�qχ&G<ޚ~�f����#z}�b��!����\ �C �a� �Zd�C���_��E y���N68�=qh~��y&sL���?�ݢ?`�xO�n�>�A�]�g�w�d�-�MwN��6]���V�@�A�`�Wal����-���pM9�G2p:ҋ},b>H�.��p ,ݨ?$���E��v/�6߹��r{�Z���6�A��[��K:��K7]������`��'�Q���k�Ա�O��/&���f~�e��%<��疈�JGT�؃q�����=ѱ�����{#4�=����]��7���nm���tۯ��6�lM�%YK�#٪�w͡hO��P���c��8�O�7c���q>�_'��d�$8�,��d�_��۝�P�=>Ұ;.AԵ$�lSl�EGt�����m�M�ֈ6�e��Y�˩1��sC�9�z��:��N�(#5hW�ұ0���e���7�gRYp"� �S'�g6�7c{g�7�'u�pKJ��Fu��=1Ŭ-![ܪ�Y�ĕ�6/Yn�"�UV�ѩ6�����̥2�+yy�]���7Li :�Ƣ�8н}I ڍ���0�۔���)o�S��1�ņ�,؛m ;s䬞l/^g�\��P�u�1���$�U)��&u�MCR��.�־:a�cE|�s���e�j�kQ�)W�j��v�ţ3q$2� +���Íx�Ae �����Z!��3��|gVg�lnG��^[΢ ���D�Y f i�t�MuZ��<�ʾ$�ɱH��ѩ���I���I'ܴI7�r�/�Z52ĉȴI�0.x82���L�cT�e�}� +�AO�)t�X���6���ei���<�q}n�YuN��"[c]�)�g��d48楯erҺ䚴O�2Ӿ�����[F� yF2�)3 3SQFFa텑�� +p:�z@��Q��V́�t�ڱ�J���q��� � +U�bM˖&Y�gZ���m��ڜzGMv+���,O��vK����|��ʟ��P�j�=�����V��ٵu���ZaI�BC]U�(�Re�S�*�,˶I+-��K��5;�w01E���]#�.���Bd�S�c +PFF� �9P���g?���\N���ay��4;�ʛfq��+� � �F�����uj���,�Ě��q��Ҙ�FYd��NʊmLXŠKh�����LX9:�����R�����X�U��[<^H����}�ݍ����kW ���J�8� +�(8��������g�����6NZ�`�jN��m���z���N���?f`��afn�MP��EES�����k�ٺ��n�]6�e��y���Z(�*�X� +��)J��Y��Y����ػ�ہΞ���;0��}����'�MZ�B��׋�ǽ�2��-�c��$�)nJ�jG���%��W�?ō�'��=�v��pU��B`�������J��56<�ցYki3�d�^S`����gꪉ~E+��߷bz� + �|NX��c�.��ts�ȥձK��,i�)X,1�$f�=bao�y-~��������K�U�^�����)5cFi(ޔ��mJצ���JG��x�i����qoM�nx$p̆��;�� .X�$lhIix^IUDnIcD�ܵ��Z"sVId��ގ�5���^���u+�7�r�~v�'�l3`Jy�*�qE��X���[Q�����sl�$���S}Fn�a��)k�ֹ9[����V�̭�����3ʮ؇�-��%$}������0�=�5P�����-g�ť����ʁi\�&TwW�QX�����J�(W��� wݣ�wy�2d�f3]/����ӪK�R\;-�]� ��lI���6h� �)�wH��p�8���_�����\ɞ�:��P��;`�y�V���C��Nd����Q7F�׍���j)�3u�����{&կ�r�o7$1�T�(c��1�f`�6�ɝ��.`2Wûù�f6h���X�t$ �G��<�gS��F�cw�A������UQ�˴��2-��Z-���~�ˣ�Q��;"���ij�r�o`�R���?����PT���Y�@Ƈ��& �c�O�!g�|&�_$#�%��;`?;}�MC��O"���h-���ݰ}� ���`;+��BgD�i#�3~��n`k/b݅ ��F ��I�'��3@�9=.�a�k[,m�03��L�v����^�N���O�й^�6Am?t��uނvU����*�3N5���?�ev�SO ��Hf�l�o|oa�������1:w4�;p��P���A������7�� �����-`�s̟ɹ���2;�ك?e�[��V��`�'`� ��x@�7B�d��Nq�L9ćᇡ��7\�.,P.���W/��{���r����g��̎� X�>̽��o����,v�$'e�h�B| �C��G����{"$(��C�� �i���J0�~O��z��J��cl�r����}j�O�]�[��B� ��9� �<�9���Sb(T�/�yf(ў���:-��T�D�A�����@'��/R'����y�N�[ߛ�3?�;nD$�_��}�š��-&�¸��P9U�^��x��<~4^��.�0���#�;ߟi�%�G��\������� ��)P���a�I���������6R��e١���Ԫ�֏� k�괶��M��M�6Ѯ�����Ab���N} ���:��F���9�Ur����ꧠǕ����iE�`_����P��K�u�f�T�� ��:��k�A��+��i_�� !7��!�q6Tt-����?�� A�$��b@�k�"q$>�����ǫ�P������Z��%���vٱD��X�}�ب]t�i;�֨�ڹ����S���+�D��7Lj��:#�#ݢ{���-����T3$���8��8t%����|t$�ˉ��W�ӵ ��k��i-Η=>w��qڹ\w�Y���s��s�����s�y6%6{6&]�jH���`���T�$>5���@����| �q��4A�y��@�+#Wӝ�t[Z�F⋴��d�ډ���S��5���?���gc�b��)+ )���yL�e�K�g�Mi4Hm5�M��'U�vSU�X*i�I�X��gk�{�����YjveV����c����5� Sհ�|w ��c����e����my���U��W�o��5��+ �o"� �Jb�Z����E�(� ��K�!@��k����@E�(��޸�j��u�nk�n����۱��vv���t����;�ad?����=s��9�s�������߰NJbMH k��) ^ ك{�x � ����s%��' �0!n%��&�,%�^JR�/�5���|Ϲ�R����3���q��S�����։ة����PG�2{4�!�x�W�!�s΀���e$ ��k�g�����|�¾����Ct��+J\V卵WI��*9}V��8���=�0�M�TL$[�ƒۘ�I=!��C�C����Y�=�2�/�.�H�����]r³� זDظ������T��u�Y�c繥�ΕA��t_����f�MM�tf<�T���Dz��#��DmZLU<�lb�u��R�ܞT�K1#�T�֡�)�*�[SkI%��p�^��u�^oOq����<�╻���l/Xв�n38u�ԓ����c8;�{0K�o��e��=�[��s8�Ϛ6,hUO ���D ���z�������4��E8��ᷘ�?d`�A���{.�>v��<��g�T�F�0즎�Ї��yj�^]�w�!�S[�lϩ m�n�6gu�4Caͤ�&s>�*�Ie�#�Y�BCDH�YC��B��>�9��Ή�װ{^.p!g �0e ��b �GP���5&0z +�ޝ�,��}`k~ �I_Z��ȭ�u�s��f털\;')�Y��h?�P��[x���J�$  |���s�×j�ߢ�7 �A ��R�7�� +��`�L��R�ʢܺKe�M +��� ��"]`��Ȭ3V�V�s͆v~Y�QaI���H?+)�/n(��|+)�1"4��#�U��cpу���.�� �{�F�������[���U���QyнŜ��X��[W�]_]j6��B�Jj9%�m|cq��P4*��Ht�+r��ޠ5~#���0��t������`���a�B� 8Y0�O0{���Ͳ��ny��\���V�QS��� +(��2U�XE�j�����/��-唞ה^�d�ޗd�����3MD�1A���J^�W%fA��=X����4��������B��y#45�Z��ѫ� �ޥ��~E��@C]S_kͭi�f����!az�S��z;\Yu�:\Y��HUI�Tf"P� _]Ax�k���C���?4 +`C�z'f�,@���w +;�kW� �j0�\Ž�-���nؾ$�mˉ�uY [�u�M�e��W��/�ة��)Z���x�M���*� ��u���]x��p�N�A�{&q38��;���p;�@�5��7h~�D��@t[�ۛ �N�D�n���^>p�W�� B�Cȃ��z�`���u�P�� �y���2��cc}8�ܻy3��i����t�u�`����� �cOx�������>����>����ޏ�;x}~l�Fຕ@���Cq� �� \��֥)��������b�J��r:�ɣP-g�< �<ܗ��\�;�Jܖ�ᦼU��p��8��^�E�'�� 霽��:�'�8����^vMm �-��,U��)Q��٬���j��i�f���M~/������-߿-4�˩ŸS��۟*p���-lQ�犓�|P�:�Ma(����U��OU��ϰ�f�Rn1MPm6MW��f�7� +l0�Ԭ7m�\k�eYb����׭V��h�� �%���? Z+j�s�������l�g�X��gzj��~���:J[�EJ��,6PnLW� �. �)�l�ڜk��\�]n^b�Լ�f�y�\d��\h�,�7W��9���aS����s�\ Nq�+��H� +e�u��-?�?;���w +W�t��X�1Q��cJ�e�j�tȴ* +��O�Y4K�Th;7h�.?��~vP�}^P�}n�#���~z�Б]N-�:�3.m��K����vʺ{:+�=TFiXC��Eq�YZ�X�, +�Sv�fU6�z���Y_L��.4W�:�~F�rǜ� ��!{����v�z�iB�Џ�dO�����%���⹷����7u�bM7g��j����H��wP,��,��ΏL��떢��u�͌��ls�d�v�q������);|�a\�N�����w�Yo _G=9���7Y��#Y.�{{3~,���K�`E=����^&��W{��^�����Vo��c�vJ�4yR�p� ����}��ب<���Bcfd����m.#"�]�E�tɈzëғ�H�P�)�`e8p���v$p��������(����x���J�����O�2'>R=9�����$���A���_ٍ���Cf� ��=s �c�;��eH��~��kZL�tN�r"}z�p���p�p���c�-��4CJb���e��6�%%p�p�j\�&#���������}�������YI �%���)֘�ꌉ��!;�_3�����T#R�4�b�� J�IOd���e�����7 1P���,,.��V�:,��U��H�A@��*��`-�k1X�b]Q��QD���#U�ѱ���rԊ��:��k+ڙs���@��w�����Ť��,��F/(�GFW�ύ��8;j�SxT��QW�c��(a>_�#� ����}x�k�����+��$�|dm���8��IZ�%BN�(If��4-y�YrR�"!1�ba�\eLB�Ut|�M�,�9���"V��6:���p �kv +��� A�>0^舶�K��g�ų��f��]��� ޹�>-�)9���;�r=$���eѹ~�Ȝ�9�aّʰ����4����$Khz��:�� �w=}�lIV��|���(f�Yb����.sFx� ��<%!e�3˦�˂��K���Q~�-'-�Vy�[M(Yc�^I��W��ؒS����ڎ]*l��H!)6=g�;ؖm^�!�I.�I�����}*$��BP�#�� `�h���K��W�j�lҪP3��y�U �UeXxUY���RzVnQyT�W�W���+��>j����� +a�^��c�{�s��2�|s@�鎭�W����U[`� |7�q8���P3�k�H��̐�� ���Y �I���{�6�+�1n2w5�5w1���l�m��xk�:�VX�X�\s;�}F�Z:K+��* ���<����m�o�Ԫ�Y��G]�׏�[��\?�M�x�,i�+q1�K�6�H��VȆ�jdCL���N���2T+䃶�^7�τ��=�{��tW� +�M�Dofm������]2 kP�O  �3C�����w��ǀ�P�o��sc�6.C�}�$N��K��E���%q��\�[Hv ����l�#�z���,z�a��� �˞�u?0� ���&5�M:�����0h��`�<�c��=F�`Ӓ�rX��B�z�\�U�3X�>"$d3��8�2�;�s�� `�. ��������00�(лв]�:!�e� +mv0o� E�2 +�N����?���!k�����vN�}'��5����) i{M�'܋����H�Dr�A����.�.�����iT�����5/Z�\���/�_\Jy��C�2�h/��`��pB�/�������뭐yO���3�3��O��W���:赦��;���X�_�*��8�kx!v�7\�[c�ی���@77�����,�]N����)��K�Ogͣp4��x0m�ځ���=�jz/��ȏ��I~"�r��~���T<�<<�E�W��y ~ +n:��-Z�U�����C@(�4�nO�y�i���/�qC��.נ(�+����+��7&��F���,(,ȲܖEv�v���rY�˂+  "��.!xC�E��h�&Fmc��6�If:i:MS�M[�vڴ}z���<�_��9��y�>|e >X6�����e��7���pm��ŕO�K���\@��$� d��X�q��u,x�F�V���e��� +��*��U-�]��)�[kk�ݵMp=��{�������aj1d��r��r��r��_w�~k�o�7C��fC �$r"�����C�kK��Gm�o�����Wk�q�Kp/4 n���R�Z�.G��R��Z�pP���9E;}V�C�)��g~֬�(�b�}Bq�}Lq�=���=�WΑH�H���둄�CH���W�� �ׇ�G1�7r�}��G���͛`!:�)3aNi��(-�)��>����)w�f��i�^�Q�g2z�{8�8w}Hca kl�!Mw0��7���ߟ�WЧ>(�U �Qϊ�귙.�=�C�Ӟ�OQ[2 �$��<�%�b޿�{?�@ω��l��sc9�ʅ�49Lføv3�3��� �@fk����זs��5�ތF~OF����-�L�/jO���J[���>���})iN��ؕND�"BW�O��_��z�p}�b�0��L +&tRݱ���p@G���t�>�ի/`wg[�]�6^�g@ێ��֬�@wV?Ӓ��t3�Fݼ�^wK���ZV��w�#��ơ#"$�9�p���7\G߷`�=�` +c���i`�@�J0�C�1��)�Q��0��󊸞<+ߝ[В��r�E 9{�NÈ�a���ޒWޕ� ��m�'2��H1���D�>���O1w�W��9K����(D}�7�� +�A�) ����i�N��3X�&{���m.,�5V�4� +ZE5�=��!��8)������Ae�_�������H�S�GD����瘃[x��q�z���~\�__�z�_�Βh�l�V���iI�]�lvcI>�Yb�9Jl5�N���-�,�+̃�R�aY��LP��Z���I���Xn6i��H������;���� �\��>�b�<���aN��<�]&O�p[#�ٺ�j�jhg�����TW���ր�r����ETZ�)..��-�Bˬ<�r%�h����h!��"A��b��3��:���_C�y���~ ρJ��Xڬ,pۤ�l�4V���:�rT'��UZ��*�m�����r��V-(�5�+w3��$F�,�zRn�.��֟"��+��� �=�g|�}w뿈�s��wj���� mO ��� 8+��n=T;���L���4��.�m�+�9,<��PP� ̫��rj���k�����2]�%���'ȟd�*"ɬ"�L;atv"�ٖx�}wW΋�u���D�Q�9@Z�z�W������ +�rW�����6�t�BW;�����d�����B]���aX��0#ImX��4ܗj��(IqqJaR�(���w�1�}��� ���i�o{ �7,�dP��*�=�P艁|�v*ϓA�x�,}k!;�����Z�������+Ը���if��<���$�1�-�%6Q��nF�w1��s�?�FߋV�q#������:(0v2�۵r����n���խ�2�ut��H�yK�����6q�wu�U]��&ۺ� c��c;�����0��cۈ`��7���γ�q��Gv#M����0�����/��WC�/R|J��A=�N% �D��V�*Xq>';���(}��-�ü��gyQ�ۼ���xQ}��z ?j��X�x�c^��.�=�.�v�v)j��d�Ґ0�@��+w(�R�V,��� Ư���\�2ZBm��6���^V��������{��������N�r�1糨{�{�i'҈ߕ>�j�@k����<ɃȣP]S!> ���k�jX?���7��vy@E}ea��Op�}P,� ���� +(�q]����ՠƂ��ADET,�NPX��h{,G$1�qu]{�X�ۏ��������{�����@�x�g��y��gΑڛ�%_�>�`�Q2l�]f(2C����/�)���멷4�y�����赌A.��| b3��8~�Z��9�P� �rx�ë�;<+"�Q1�ír\�\��p�4é��U�p,�2!9����V�3y����LYǻH�?���R�O VF�*�gS�݀c��j���u#`WD�ak���26�1�Z�CcI�ڲ*K%���\�@]+��!��=��b��ԝC݉�Eݸr��6�����ԯ��_��Ƞ��AV���h�6#G���de��Y�PV:�� ���S�^��� � �jO-�Pwm���.�߃�k=�?����CIl�3�Yw�8ߕ��F6eل\d�i�kbR5љ�&��+"�CV!��V`z�m��DQ7���+�|�; ��R����@.�Wtl��l�]��>� 7� �L�b��|�I�I}g'�&w!��h!�y6���N�(�F{;Q׋���]# �D��u�Or��Lh�v�/��C��?�[7����l��O��� ��1yI#_ҐW���������h��v<x����ռ�mּE����xD����3��=��桍�i<���,���`��!Pq��k�6@���k�A�?� $��#�dYM6�RDJ�vRK�!��u�/��+~��xI��!쨭�Pp�W����;H����32�$�t��䐍du�r� +��.����2i��.�'��W��G����� �ƙ�5���H?2�|B>�N"u��9R�kC��:k��%�2S��Vo���>�~���C����G��7�A8RW���m!� +����Gz�j���XjMf|�tX@�Tjd�������s�"�@#� �~��I� �p�'��4q7F�� \��hK_h�ZG��9&��ۇ��G�x�}L��ԙ�0&���H���e��%�r�M���8O_���ŠS�� ��8�t��Z%�#R����9��ST��hgG�8���A��'5�qU�˲�h�%��|:�����bN+�qJ�'�98�̃UY�ê +4�jpHՀ��&|�����W��2c�j�AxQ�eN�W^/'������7�~��}�6}pV7�lG��X�����3�`?���`��8�n��s�W�u�2�:�A�C=�84a��T9�F��@Y��Bz��7ˈ�����n.yJ\��C��;N;t�Q��w��ð��Թ�G��T{$a����L����敃*�|Tx��{J������Hf�Ki��� +IA3!�!�Z��=��k,��� `�;孁����Pg���}��� l��ʎcPR��(�b�dl H��VJ� ���TX)��Iy�'e��~����L��Y�֐՝�F�R�K�0���3O�v���@ol���=P4[����Gas�8O��gHy!s��!)� !���!9��!�5!��U!��쐣���e�OKC�"#TțY�?���]���8i��G,=�c~��3X��P7l��a(�<�`�G`�q���8AZc�"[eL�eʳ����ƕ�L�FE�q�2ݸS���^�~E��X�(\(�I���< �ԝ�n_>�|r�8n�����U��� �=���+�LXc�F�i��e%-7��e�&�2L��t�\E�)E�jZ�L1�S-�0�FlSϏ8��gj��1=��6 �,�Pe �<��W{��>��s� �:��W|j +{K����ھ>X���X�? +����#����e��&��5E���\�������F3+�P�yd�vf�>����6�#h�E ��(��)Tm(��O|ǧ�J��x�� �b�c����a�@OdFwƒ�0������XiQ�G����d�c����NR̎��L������N���N�γ�]��m�M��V71��.!Fh�����*a`+�"�}�����c�������c��buX2��q�H� ��&̏(͍��͎)K�#���"q�4�!��S�R4��Vh���u�GEy�a��fav .D�&�葨(�((�"���0� ̌�� (��q��h]\Q0.cM�h��4rZ=&�Ic\km�m��&��A����;��8�}������}��yI�ir��jI�j�I�4���j{���'�J�x�U�?3��~��F[�6�a���>�(Ѡ���Ԧ����*C�PnH ��t��$=WV�^P�V��O�W�5���Mߡ���Y�g�M�Y�Hc֋*�^TZRE�S.q�a�Q��ؑl�ZV���u�d��D��9Tf�C�i*�L��i�PlJ����N�]��Y(_�Y��e���ƕj�q�&˸K���ΘqZ��qC���&#CT �ҏ����}m��f`6���9�x%�R�uԘTf��bK0ʬcQb����BA�>d��b��Jx�yh�I%)�{�rs���~0�AZy(R+‘R���9H�LT� �I\E�4��L6��-�U�]ު�^�WY�>�J���"r���,�J������B�����2`y)PK�8�]L�WA߳H^�FB�@̯}�a�瞂��hĺ�0ǝ"ĸ3��n�d��X宖Ns/���n�O�}M>���<���<��<�Z�G,!U�|��w������K�RE���C��Z ��ާA�������!�n��&`������ ҳSy�_�X�)��&z%<��=�<�H�<�a�?H�Di�ˤ�W�d��T�<�p/.��$�H.����L�6��XE��Z��́�hƤ�ј�f"��Db�w�{�׈0�c���B�^a��]�}KY�#���^�Z��h"�DI���*ލ/������=��5X�7�k���7҃�h�y Fm���c�:#Z#�|[,�kK��63��9�-��� C�ló[|����FP�(m"Ɇ>�P{� +� ��~�u����@�����7hYGo�� ڥŠ�$;Fc@G8;#�\<өG����] +��� �����<M� hw=�n�];��G;�65+���P���`0���^�ہ�N`�`�~�� j��Cp(�C����!�EA���e���a�qC��1}��������C"? ���6j�e������6ր����v�1�.���Ao�8��]@8���B{|a#��hB��>��n~p��s�y����n��u��󘈿���+�2�7���ԝ�Xg&Qs45��9�=@{��?0�# pZM�����3�lF{��p�3��,?�gyٟ�!�a�{(p�m>/����д���.�d/`=�f�C���70���ԧ�'����������J���"�H��5��K��\�~���¿ƍ� ��b^?En��D|B]k�4�R�C�I��X�=�� +(z������%�-�B��R�&k�O����m���?rw���޸�p��0�>&��?6�2�j4�h�G���L����A����I�þx�q�1�Gx������P���R*Ǎ�+�G�sM�ԝ��PS��20�l<@��?F-5���A�ո�����޸�5��Z���xWX�wq�+0"<���⢤��MT�8UK�<�y�X>�Ʊ���s� �qW\��� �%����u�W7�hZpYӉQ�\��ň�v ��¸C8?� ΍��3n�&<ĉI���dG��o�N�~�:G��� ��ӊx0n�������11W&%atrF&�0�-�� �����_N���I�~�G��H�) +��^��?�`���ST�!��|�:��lG���0������V�#ӝ84�ߛш3۱�j웹 C�v`p���>�ݳ�10�v��%������%U�'������8V? �_L�Hj�ȹ�{�<�3&�̬)8>'�����$��r&���cp�{T`��: 5cgP'v�ö�~ak��?���|^� �.l +���>�/�څ��Cք|�/����@܎Fcy�G����9�����2�����]�ұcq6�-.���Rlw�/�#� û� �º�]bO�~qu�i�;�����X\�/�=R}F���4�����X��Lk��6c9� �b r&�G/Ė��$�W����|��ٱVW.��j�ձ��*]�إ[/v�I�!�-���;*��ޕ�b�$7��Sj�U�=c������;�3Ҙ?����o��v�$�/��޸ذ, +��X���n}���+�Ra��%��=�W�.���H� ��Ƅ��'��NQ��?Rj�j�Wr�^�\ �E�kp���4r�iӊ 2��)���I�~<�'����y�NGWJVR�n0�͐/�B��Bl4ԉC��6��� �r��U�e8�T.j* w4e�ߓ(N�*;ST��<�����Uڍ�fր�g�����_�&k t���3m6:2B��СŘ�&�r4s��Hp�b��F�66IU�N�¸Q.3�TJ3jJ2��qo�؍5v�ߕ� U~J�*ٟ��D�2j^�'�9�1�M���5�2��X�Ek� 4g�� �Y�9��l��l��+� +s�Xn�HNs�\bZ�8Lەb�~M��O�馏��[��K�դ*�,U&�5S�l�#��5/�G��i763����+�w.֧�< 9S��G�%չ��MEe^�P��/8��bIn���uKŹmran�b�ݪX-�4y�3>�u�˯��������lU�'�� j^,�^��h�71�n��F�Ș�yP��"\ֹ��-B�-΂d�,NJ�`/(� +�bAA�d��Hy�ղ�֯dۆ4f�i�,�5�L��}2��dZU%3_����S�1�1׫�=W̽H;��X�x:O#c�㳪��E�p�FI�B8�1���(r��Б-�6!�Q"�ګ�{�d�w�Y�>ey�&���&�� M��CMZ�MZ����r��4�;��ej�\���A�����+����X�Eq� ��挄���2r˲�S�/d��SY���l���N)ݹINu�VR��5���5I�4���)I%����)R�C���m�|��Gi�J��%�i"���ߋ�k�$�UN��jr�!ۥ�ɕ�,��]]EB��LHu��W���� �]򲪣r|ը纯�U�U��T� +U�+W���g�`�/��*���!m�M��VXE�] �k�#���ݳ��Fz}����IE�DŽd���A��yZ�8�Z1�~�����SI��O�r�Y��S��ZU��!�ϸ�\�R㻤�Ž@�H5�5����� �IFJ�d$�LEb�<�[ð�u ⽉��f`�ׂX.�o��m���B�w���{P ���޻bh�'bh�*�6�FU {��'��Z��a�'�|/�����^@�,��%��#�k&�� jU8"W-EĪd���Ģn+ºK��u�G�|�q����X�YĖ�,�$��&ni����TUk_�p� +"��$�D�ԒPJ����2��Uc�LU����jj�:J��ϕ�:��Gr#y�����<꒕�Ȭ �g��*���]Fh�I#t�M#4�4B3`�i M7-a� �*t�fpY Sa*��gC�~m��w��@�^dQ�bOE��*<7P�s#�)7Fay� +�믐�� +����� +̟���j�_�v�;�\y�)`��j�cmAv�3yf�.�f����N5`={e!�/�b򥈥Rpq�/�R�?�- T@i�ڔ�ʿ4A~��kS>��jm��V�����ҾU^�#�_�W�OjY�Q�x?���Vv&g�����R�\)��"�K�/�ʥ�k����%O��<���X�p���1P�o�m�$5q���Q �c���XF��Tޕe�)� +SM�4PI����Yh��x>]B �I��ϕR�)�51�Jj�I��b�۶2�1 oc����R P ���RC�k(b �Wov�m7�)��� +� Ě��z�rj���E��� �o��TK�;$�]�++�>v�۽ ���c~�ǏZ��Z}-ͥ�b�b��j�W��#0�G����i�%�o���FɺU���h�$��/5?(���G�� ~ŏc���0���$~�b9E����Q�:�����_�|F^}�I�;l 5���wK������a� M�ch�JV��0���E:�\:Ǣt�%�B{� �K��u����L�/��������gds2y��4]�!���T�=A�OI.����?�H+��X���MXPܥ��������q���>g�A*K����c�����zM#�c��/�v?�>�>��~���_�zN�o�:p�t��p0��J���Sjc� � �&C���0��&51I�I1�/�g��ה_���q0ބ10f�X�P+` ��-���6П�P���Ol����s��&\w��V���6=� �0�a&��~��j ���[��Z=��W�^�u_���:Rt�����z�m���e�.������4�+��k�4�xƠ��F +)O��<�/�~v��VW%qm�wڡkڧ�:G�6�|"gֿl�"\��N�:u��[�ז�j�D����+D1�����x4�b��j6�������plVcwv�R����+��4�g��SX> ίu/`�@��hȉ+������f7r��}�!�>�w�7%�,g�ҹ�Y���n!�K��kt���v��>� <�����Z����äŘ� >��<�r� jr�sqQ���A�KP_� ٤����4�*�3Z�zC�Ǫljjm3S/`�R� _Z�-�� +�N����!����M�h��o����n6\[�������b�6��R��\�wϑ�c�*=V��c��=?�j�CZ�yF+�n�����{�>�@<���iGK ����i��O��)r��N϶�� +ז���ѻ��Z�.G��Z�z�ִ��r��Z�3]+}fk���}���Ϯb?���j�ԿV�����r�(���E� h�!��¤ϣxz��ήA{�ցgկ�6��h��*�ku�x���/{��*�0L�FkYljZ�1I��Z�����+'�B��[�0x���Լ�k� }��P������~�+OQ��f�×u��6�Py��V�WIH����Ra��Z�i��:����Z>N��Z����5/b��F*#r��#7i�{�YQǍԨ+ƌ�G��(�HyNd7x����g�{�=Ê6�Wvg�"7�*�l��.a����n ZЭ�����跔=Js�'jvL��bR53f���g̈Ya��T���2�c?5�b/ScSbM#�I̯\%��g�ˌ\}�2|)�)�e��n�E1>���=�*��U��)��@��=D���a���)�f�n$[�I�c�u��huX&���L�;by7�q����3�q�Fz��Wh�D{�o�͌������ �q�ڽ]�i�V�K4+>B� =5#���>4��`%ۆ)�6ZSm��D�{�d[�1ѶИ`+���UX��j,�m�\F�λ��ݳ��� �1�g$��b>��������ã��0��{ KHe� K�"�I&�L2If�LB&�$$C!���"IT�BR, �@�!�(}��c��V��V��c] +B����_H��g�3s����9�|/>����X�$��E� �Ґ���cU�8E5IsT��@U�-wd�ґ� +G@�2#�Xa�:�Ŏ;�BG�Y��n�;�[y�c��q��9.YK��$�_�m�q�g�����.j��]��L,k�c �a�c��S�UU� +��TE�<��'�,ݩ�ӣg����F�s�Q�3��L�����w[���,��q+��'+�y��N��+��fNj?g�8�I�K+��M��u��J,�����T����y��]̈Qif��3�ȝ��;Kn���EF����k�\�m�ǽ��vo���[��V����r_�\���GF��9�Ʊ�l�M�Ԁxꉧ��,'�r�`�fE�8;J�9SU�3GK= ��q��ɔϛ�\o@^o���1��Mf�g���<`9={�4�cV��y+�󱕒c�}�fCV?��8�+��/�n�-��xB�R�g��T�7\��c�_-�o�r}���'��w*��Q�?_n���0��#�����b&�w[I�^+��Z���\����x�m&����}$�=��o��%��PF<����/o������t�� ��]�̂eR� +d)=�WZ�X)��#��H +����̈́�.sA�x>0� �7��f|>���x�����h��A,�B��eVVQ�2�#�*�Rz�T���Vj�|��&)�ԥ�`��- +V(!x�� �l��c� �4o2c�������ؒ���bی-�͸"ۈ+��c��/bO�~o�&�j`��<��H���i��X���1J���E�ӕP��� ZJU|([�C�� +���Jņn3�ڍ١�Y�����������3������l�1tzJٓЂ���R�}e��e�WJ���>�C5o�(�]��k�(��F���ӜU���ʥW�j֪"ͬ����F��nԴ�nM�=�ɵ�(z�ۚ\�1��6&��gJ�m<��h����|P�u<ش�����Z�Ճ4�>\3��� �i��7�Ѵ�xMmthJc���uC�2Mj�ӄ�6��i����i|�q�kzC����z[Qk`�mD���#hl#���Y�����y&-�)�tS�4��s�!&���E���:�TK�Xܗ�.S�� p�8.�j�k�a���R�3н��A�W�e�4��ހ��Rbc�‡�/�L�>e~>g�|�A��`����fN����m�����h5@��8� +q� �P�`%��:X�������>��q���B��x_�]}���%�~1�%�ޅ���&��V�#�7B��%B������70v�ޯ�ե�h�>�g^�}~����$%zEs���`@�}x�ËWbCa�ADA �z��,E�L�� +F���e�;{�v0-[��nr��t�#��L�q�������j��h��8���Чm�>G��u���lꖀ��i�E�P�0'o��eX�׈�?L�����0?g�pj���J��U�^l��b���Px;�w�@x�#F�7b;&"�aw�Q�\r㑗�#��G~�-Q�X��M��7�����g����Q;�O-����SQ�p2"G#q$*���q`i9�-���2 v/k�ΘV����#��c�ak�6���X��.#�/a8�6�����`�����Cj~���c>1�1�������_��Cq��y,�$Ȱ31;Vc��JlYi��$+6%90���H���A�O�P�KL=�P�IS�A��&ze?�Z�#t�I� �%U�oW�9R2y���WP�~X�a��Jy;R��U���496�*�pz9֧�1�ڌ��v d���?�}��ѓ�ݙ��C��M��7�!��Y�'K�G�=2%|�'�>K���L!��rl/���碗͙s1�� � e�c [������Do�=9 �V8Px�Wt�S9��ڕ{�QN�Uy^����� g#�?¡���3���m>�K�,;&Y����g�ɸl`\�*cї���y��Ÿ_�΂j� +��(��[� +OaZ �p�6¥��jJ4�� �ꚰ�>���ªzB$a-��@�S�f����4�(c�CO#���� 1.��a�V-EWQ|řh/΃�D���*���.m�������^4��aS�$��E���������0�� ���u��3J$a"?���J�E>��N�ś�i�^�����t!:�Q�%��,�r\�pVhЬ�E��v�6�V�Z�k�`�n&�AaԾ& ��E��Q�������H���5咸Oͫz�4K�I���='=駛q��fܚ%pi��Q)CSU6�U�hԕêӣAgF����&}F� ���F@����N�����Z��O��IB[%��*%q���X'{��j��}�񻋿���U��Z����LXj�`�-��P�:�FC#j -�1tBo Ag��}Bcr:#�������w�#�K� V�5H���A� 5Ї��f$&�"p���|��wH�d�ꓰb� ��|���� �.�&�7P[��M���`븪oR�#�����$3�2���R$uHYjA\���, ����iD��"*�cD�At������H8��M���E�N�Lm]'{����L�wX��ǿ *��pʐ%D�qE��ׁ�� /B���E��yj��Ml���`֓&����8�֪16Mn?H����}~�~�����=��~���_������Y⦎%��( ��)Dn�(�/WS�:���`ʖ��@Φ%r2m����K�ʡ����|���2�L��h�L�cx��,� W����<�$�R�k3`��\��r2����#s��͡jg�Q[� ٙ�ek�,3ƛ���vs�Z+�*�P�b�[�嵅�O������Η���g� +�S3`���V�jeSˌ[ۑC�h��(�u�:.�:�.X�n0g�<��̙+��[�F�_sa +�S�yH1g`�^.�@��U�s��$����z� 4���fp�'E��g � +m=E�������'��������{�x�����K���4�b�X�94s�퉮�j�#��M�C�d�;�s���rÎ]ر;���ر;h�(|F�u��l��]p�w��r��߇ {�)�5���՜��� ����݌>�4��A�p�&�B����4��hΏ{H�c_N`G#�I#ů�K��u�X4�`�;�1�'-��c�ٮqu��x-t��ɞ�%�CR[��1Y~ւ��}8��6�9��4�.�Hb�U���(�M����m™&>�v ~�f���ت�����n����c8!�;ݪu.4@�W� ����9|������ ��-�M�����yw�t�{���>S������ӆ�#��I�? �{�Y�r��U� � +nGL_�M�%݁{ց 0�=&&OV�ۃA����c��Y�p ����d�r��Xw�@���0�C̄9P eP�`�~a��Y�̍;���ټ'�� �K=�=⭇�܁����uޔ������_�8 � �l4r��9� s�c�x��Ǝi��� ��)�>s�]��u� ~˯�|� �| ��\�K�68�ش���� ��+�/�����c�Hg�i�?�� ؂�.c�*�Z��k�l7��ң�49��Y}��]�Z��Z9���flA���M��O��Ţ�:#�W��Ϛ��d����D<��/W��2v\Ž Z�s��.�$����B���|��D�*Vޅ�p�نg�O�S�-�3��7��V8~$`�P]dO�)�㘁F֞��\�.f�2���VG����r���!���e��~�dJV����9�]��|���_|�#�ht�����Y"f��Q��;�c�^�أj�"G��&�A,��[Y��6�M�Y����߶i9�l�숗�Xu—��N��n��N�a������F��[ȏ�2� �d�2"���62��P�Y��]�n�@�y�r��������,��9lk���tŧ�dX�"�I���h$�1�4429����J��B�b����*_T�*�c1����� +ۧ*oC��{���S���1���ڝ<�A ����<8�~Zg�ն�Z�f�V� ղ��Z�n�j�MRu���j?Sf�9��/Q��b�9�j��&-p�-��Q;]T��-��Ԉ�����ɏ��>eo{g�)��Q~��h��A�N^Z���0U��i��EUUn�E&h����er�U��|�w+W��r�m��]�w?�<��������5����n��k�0�I�!�vß���WÕ_�n/���*�}��c�J;�U�� *�4X�;��<�1*�J��,�{�T��\��,P�O�f��ӌ�o���������v����?)��E�]�����C)�!��*m�U2�a��.mT��AE��5�k����)�7Vy~��7L9�ɚ�?^3��kz7����P���2VkJ�6�Ҥ�3J ��&=Uj�E�����7%��g���a�z<+Ŗ���7�fn��^ ��� �����jz�M�9X�=G(��e�JSF�,������B�W(5x�&��k\�A� yOcB�+%�F�XZ�(.E�Q�6XU��<+Ė|l�%69���i!]55��2{�+�w��� ��>�4)l�&�MPjX�&��и�� /SJ� +��ج�%E�҈��� ���C�E#�\ �0�6�C9�,{rh�a��V�ᮚ�ɑ�J�쭉}�5�� 5D㢒46j�R�'kt�Q����@#b�jx�F��OCcNjH���, Q-�����נ�\Z�Z#mP��G�jR��Rc<5>�_�b�5&.R)q��o���%jd�%ŧix|���4,ޤ��5��^JأNh`�'��P�-�?��<*���?we1 $��n "�"� �2�,�0Q��NHAA�(����M�q��Z5q�4զ�M���6mz���ĸ�&��ƚ�X���a�9����}�����"Ρ���l����X?m� _f�K1�S�U����@Y��(/i�r�'+;� ���,�E&C�2 2��UZJ�RS�dH�PR�>%��RB�NJO��� %$�Hr����T�#,�g���= 3� +��b��oe�Ȝ6R��pe�E+#=I�t���s�j���L��J26(��\��M���G�'�qA��;�Nw(��4�bS:F� �@�Q�U<�Cq���l6�)c�22�Pzf��L�J5M����T%e���U�� ř�4�lW�y���4ɼK���`�nkB�C�&���0#�Oa4Â�`�0eIFs�f{Ȑ㣤�@%�VBn��rc59/Y�y��ɛ��M���DK�&XZaY�p��Y�)�� _+4ϡ�\�qh\�C�R,���r(�)�J��5IVc�w�U^56=VS��5��Y�!���r�>��>�<���e�k�z��P����� +)�il���u�O�y-��P�0yڇ��>���+7{���4�>]�5�o_����p��S$��l�7�SO7=ϡ~�z&�j��"��9�Ff3��A��(h� �����ܚ�4��K}�i~�i<���[�dZ8�Z�L-P �ky��g��ຈ�m���l��y�h�*^/�|�3Xs"k�ĚC�� �7IÚ%�%m���,�1ϵ�x���XE#����� ��C�� �N0�1Ҿ���C����P���"p8iF�j��z��͚ �� �5J���c�{��J�����j}?���@�?6��f��� ����p뤰;YT'�:��p�������p�z��y�b�F�cI�7x��Z�Z+�o��w��^B�m���x�BP\���w���F�z�w>�{��pbGs֏� ��ŜC�9��V�M�(���g���U8���@xu���������q?N�x���;�A�Equ����O�/����Nj[9���W��<��F���^��W]ZG���Mg�_��p��b x���%7�Ҡ�Ï� ,\~��gw-�������/�M�CO���H���9���;b?��%�=�].���;�z���Çp�9����Ae��W�Kä/�� +M�� ��y�"����uj��M�穀5��Z��z���a��qi����ȥ���g�7�`x����a na�����w4������'?P��_���\c� +���z��� � �a:̂�`�&h�6��5z���=�}�o���Ôx�$}��L�_��6o�p���9o��@��� ` DA +dca�~P���:�۱߄�V��_����?���4z�"�J"����<}��t K=|�Yx��C?���KWL|Y[0�Ϛ��2�cA���د�j����������~|ʴ� S�ټ�T?�QJ� z�9"�>��uqN� ��?�%w�ŗ̺7��5f�/��N��LN>V 1,�v��b{%Ө���;��[��|;�x�R>����prWJU}���s_�D��щ��T�MNΨ@�Ə7𣋼������:~ŏ�Z��u[����8�}D|E�� �Bm'�|��.85�go�����-/���(t"ш�Z:�s�_��l���خ��|l6bs����ll�2�9=ق�l��ds�����ۮ�����"G�'�#��$:��D���� ��b��]P��r����\l.`w,$ +ϓ��T�V���W��UD��̮�������r�]��9��� �]���;��A��1���B���9 �(��h���r4*Ѩ�f,�R����y ZDd�+�G#��r���"���pvrԾ�ѿ�+`�ܵ^�� Gk4:��ı�T-��T�iL\�����Y�n0˰/��2,��3,3��1�� ���$��v�c���xK�ʭk7�V�괪*�R��R�U~���V��.Q*�J��c;R������{����;G:���� r�q���+Y�Ȧc�n:�J�F�d)���ﱰ��G}��Vu���Wj폴�~U��e�Zr6�f_T=/�F�|Tg"S8�%�S[K8]ͱ��lsrx[�����}�嘽,�Lr f���Äc�e.v���L��g2�=&�> �1�����,�wvi9Tk���%�?k�5�t2Y$Dq"nG��9o���r�j8��`!�E8��\�����I�L&�1��B(i����K����{SH�9#�3�j���J��Cq'_vD���Syʝ�i%SK�,'�r %�pj6�i�L�U1��������݌��2���ьQ�fL4-0�`�t�ݙ�2�y_� d�������2����L�G�_d}>'.�z�i{X��d�U˜j�Ɍf*3��Y&�w�/������4�i'���p���� �y���-0�w���s��_�c�=�o�m�)]�Ɲo�6t=&��ez�X✖���.kߜ,ȔjٯZ�͛ٗ�s��� J*�fwa=��V|En���+��x O�=ūt?���*%o�^�Β�V�Ga<�Y��we���� +�Ū���I�W=����f�8��%��K�(-����޲Z��<�.z*ֺ���"�t�QޓDY���3%�R�=V +=�x���z1{G��N��]a��92����������k�=���c`�~�5��3�t����RLrH��[�(�m $`H#Ϸ�\_!9� +�}u���e��1�����ӿH��4)��$���(~I���$ �=��5���X�E�_Z#�_t �^���}�Wt,RT��$k$S ��@:;���I T�h$9�")�Obp/ �yvO�L\�Mb��&&��+�#r��r�C�|ǥ�Ġ�p�!Ү��Zj����B��VCq$������Y��!6�BL����a�CSl a��Td��o1��'"����lg�qHL��ݢէ9(�Ji+"�J_�1uBp:�ع�� D�S��bs�����Ma}�a�ܰn�Byw�x f�kf?T#������VJ٭�aH=A�a�+\��8�9�J�I_��4)�ҟ���MD��Z��Y��XI׃(ORS_US[�Ƕ�\���[U�\=%���=���@vP5,O8"�Y=��%]�6�mz�I0�H_�)K����0l>.�wR�� �)���Z��L�-v�j�����5�!���/����C��p��'�V5�4X�ք�,(z�۩g��� C�����|D�' z "���9��&5x����ZpT�%��� -vz'�5�7�` B�cㆎS�}���&T��y�i�0(:5� :�� H�tR��w��K����c���)�j<�)�^�x���rS��긭�����M��z���[����9�����5�Yi�Gcݲ�9�S Ok�I7���e��.���5��ӍB ��2��{2��ce���e�y��(�K�k�]XXXv�]`9DPEEE-�}�3�Ѫ�68ƨ�ǚ&5UcըʹM���G϶&iL�L�9�l?�q��g~�e���}��y�G�㣍 Y���&�Fa���V��[O�?�r��&�4ݑ �C�ƹ��ߢ�����ԩ�~�?�p�Ҫ��� '�K���i.�g����]��l穋 L�h���ݷ�S c���)+����C7`?��vj� ��$��ur.�{�gx��hV.37������kz���nP�7�I7��M�����;*�D2f;y6�U�+�6�����S�|���}�.���U�����Xz�M�|��;��]j�sr�E��5�zH]< ���t9}���"� v�@ ��Z�3a,�tS��|��=���t��������}M��>��|�������\�sOz��O��� B�VȆB}�24F�QG��@�����Ǘ����9 �3���Е��b�A�\�Ru���!u>}��p�?���^0zݣ׽C.����RC�('~�n��>��_~�fb/�%||�������%�� +�x����6�O�t���k?������S�n)�qG�>���H^�WB�ԟ�q��sϨ�سu�������8�Mhl�����6���u��F��*���ާ<�k1N161��){:&�2�l��Q|���#�&�x��!Mg�M:���c�� �w�����/w�E�cj/�v��wz��YΗ:��Irq�\�.+ v��* +��aڃ����I���$bNgkbw%[�z\�h3n6i#�7P����P]�I��4ou.�w:����h?��K.vi��nE�A�\��G{4�XK�IěN�����R�j5�*"� �/��rfu)�f)�O�U������p��-ql'�e��Z!�#�1�Ѱ��Ɍ�i >V�c%>V�����2�e �e�摍�ϯ�il�JfSQM�����4�9�αͷ�h��f�� x�%{�Z1�p"ơ���4-�6�o,P��� +4jИ��T��mnq<��Me>������_x ��������y-���5�+8�{w��n}W0z�h%��K���dhVW�fv�Wc�!�޽LӺ�R��8M�I~�T�c�&�X���[U�s���<�1=/���g���j�j�b(G�ˋl�a5�ø�ph���?���Y�C���i�f5��iJ_�&��U}�M (Q]�H��Ѹ��8C5� T�FU�[U�W�o�<�=���ߏ�2p�Fq��Z#-�9��3#���gj�Ҕ��>(B��lQmp����֘~��+��~e��_����U���C�,d���lְ��ڪ!�T����~�������q��� >O��������� И�U�Ekt�I�"�2¡�9*P�J4<�B��cU��sh�l����+v*�pX^�9y�n)/�1ON"Cm \e8�3��� �O�o��S���x���ʨ~*��Ԉ�x ���4&]�b�44֣!q�*��¸j��+�8K^���+ǸC.�!eǟQV���p;8��6���\E@#���$����#�R�S��A*��ЄX4�h�Ml�Q��P^S���U�5��mn�˼HY���L�.G"�\�i�'ބ���}O�0�t���\{��L�8�g5G~/�K)^�&vWQb� +�B48)J^K�<��Y��Mv)'9_��e�T(3�VΔi�H����g�f�&�����SJ�^��@��%w��M�.���rdž�P��2(��b� ������4@n�Q.[��l��L͔3�#Gj�2R˕Nc��� [�\Y��(9�yY�(1��iW�S}Jj���nt�s�\�N-ک��r>�@���)��;���҃�i���� ��V�gd(͑�TG�9�du�(�9Yg���dr�F ���w�AF��2:�)��SB�}ځγ�$��:P����^ ����,�g�3���_�Yٲ�5(ۢ��t%gg���W�k�̮*�\�Jp5��f�uoQ��eE���ຬ(�]Eg����S �Wg�ђL�1P%P�����R�]e����`Yr#��+s�Y�<��9���S�g��<���)�;S�2Ez7+��;�y�*�sIa����SDn[�X��,4&r����P ^p��V��,�o���4� P�!2W����d��U薡�P�E#Q4N�E� +-Z��E�'�̃�>�8�dY�]p9d�j F�����Ev���Ǯ"��!�fR�zD�1j5�6�$�HӚ��1�Zs�L�5�Gڴ�4u�S�v���~��L�LJ=���}��}��}��J,}Z�җe-=/k�Mي�\!iZP[O��h�g��J(�<�E{,�#��K�!�ʨ4+�iS�3E��L�8���#�+W]EJr�ds���Z�W�,�͊w�Xf�Q�\g�.s%�k�=~�FG!�":�P eP�idz�UF��3�8��dw�� ��$ٌ4Y�!J0F�b�W�1U�5劫���Ƨؚv��e<�H�yEg� +_+�TtuP��X\�~ �ZpA ��x�A{ ��]�36:�~��ԏ0h.CM& l�X��o���ӈ�`]~��񣇋��5顸{� ٽ ��]��k4N�>��br�K �$���B]�)f:[`��k�i8`o�g��g��~rr��9H}�;¥{���Ev��$���9�P�,z�)Y�J\�B�c���U�?t-��=��7��������L0�cQ�q��-��)�8ť|��<�B�$�$��!`=޺!�����\D���|�f)�x���R�����O�hX�ux3<�Ҫ_�;�� L �Y����c��'��E�K�e +�2A]�ؕKpS��9 ��(b� lj�P!ݟ�+a�p:��+�5� ���pH�>�?c�t�$�`]��9���s�Mx�B����@w~DŽ �q`� +�a2�B5��XX��Q�f��e���z���E�|�^&���W��T���_��?�xN���D��H� x&@�Q��G�ՠ���oLNי�1�]e +�?>Ǐ?�Y>c2���D�|��oI�9�d� �8��8�>�//w�@<)�3��̤���N�L� �?>ď�0՝���?���{�wg�RO�yN�9��%�x�%��cd�5^�� ����\���{%���e�3�)�/&�.lخ��ll��n应�w�E��Vو�v�ϓ:��^�<@��G!���������.���b(��?��h�Dcy���2�Ķ�uDڄ]?Sm+�_�qх�*�?J&v�����%��}� �(n�C� +�D�:\��fk�m�t��*�t��3z�s���7�]���/��Rk3ɰZ嶥j�m�\���L�ʤ�"i�ʒ�U��T��ZM8K�[T`�T�}���wj��9M����E�$�Qnr���v�J�ˤ������3i� ��Ɨ��R�-g�E)v��8T�:Lũ#5-u���&�0�P�i���єA^MԬ����I_� �ە��O��_��� ��k���x +�G�҂Ҋ.� � �`��+�ܔ9"T�0k�#Q�i*������7�e�y��G�(��A�uY`w�]`�e�]�]6��x�M0�xD��⠉��h���hԦ:���M��4��=�$�Τ�v�I��۴�;���^3�7{���y��{���wi��J>S�����MM�,�)O�"�t�]�-��)���n~]6��p��D�o����}=׿%؃�� +M|���!�.��oNP�9M�1#U3&_���,UV�S�SE���嶶�i] �u���.�Xw��zH���b=�x��p�g�ي�lA�S���!������|��(^UE�UY����\���QY�M�29m^����a�,�-��<ٗ�оY�.��e���|�9�)�-�0�pv�Ӎ�*��-�M0 &�]���*�pĪ̑,Wi����*-5��,���T��RŮ:�&��5UW���2�7j�{���/h�����*�u]9��r���Fc3��e.�K�FB��|P e��;GY�l�i*.�RQy��V�e�(���S��^&O�F{f)�ӡQ��]��FV>�L�+�y��>����F�G������������������*^����3T�͑�[�|o�F׸�[S�Q5�SӨ�|3��kW�o�2|ە�ۯ4� ��\UZ �FoT��Q=F��h.&� �B����� +}/��P06F�k��[�����y��o�H�CY�2u�LRz`�� �X��mJ<���q%�(�YI�{J��*�6�-h�������Pe`G�Z�>�-o�cB�2�)�f(=� &����rkxȧ�PPɡf%��*!�BCC݊�S\�b�o+6����zn��ڌ5]�����0Pp�]����W�>�mĤX�6&*%���p��¹J[4,���p��(.ܨ�0/�6�&|�f�,4b�96Dx��5�ƌ�@=���|��mA{�D�'��R�b�45AC[R�@�p�D�T#E�MaP��������<��0��i���BS��Bc���a<�}P�{{��$�7��e�h�6�u��grј��?�v6ʜ��M�����nc�ښ� 0�m�x�9c8����GX��f��H��⽓1[s�)��V�)m�)n�ql( �".�ɣ=���å�M�����$w�c:<_��O&�����(���ӧ ����&�⩒i�X� tS�K�(k��Rˆp�p [�eg%yt2'�9d�r��cN��/8&s-�[�ֳ���j�i'7�U���j�����C�m�^0}ƛ�nr�� ]�"W4y��&걙zt�G7��B=��V6�,�Ԣ�����\�1o��v�aM]Q�D��:�����R�o ig3�tt�:��~͍�[`+<���(f�"�$���<��G/r/~/ ��~���[��׸�q��}p�Թ�Zj�^LR�Z(�D�TL�棆ˋk��ś���?x��0�Ajr���f��-�8F�cN���Gg��Z.�x�;\ qS�Y��S�;�Z{����\���������ٯ��_X�bS��@H ؠAx^������q��4�[4ُz��q +q�]��C��&�9�����x���1�~�c��I��2�7e��8c�~��!|D�^ �K��K��X�}4Y���+]$��>���#�I̯e'{5N�����1�bh�of�=Cc@~ �W�ad 0�����*�r�޸Ξq�M�&�����:$�fϼ�ɀ�$`8dA>ؠ�A��d,�-��=���qB���~�#�M����]�[}�wu��O|ʯ~g� � ��r��y�AX����z�Ea���� ����N� +n�2.�S��Y4��y����y]����C4���b���9�eh����'�{�̻Ja,#t�Z\S Z����!}����5}L���>�U����3�� �xG;h�^��ms�{�V���3���]8 +�����Je|�I��NS���4hT�O[��}?�#ĞI�y��bZg)�W�*7�e��ƻ��j���A�r��z��}��}Fw�����ㄧ Sh��G�V4\ԭ��~b��&�Tb� n�_��}�ث� �ѫm����M-v�,�ϵ�'`| �/�>g,��ƒ8B-^T*�G���_L|7�{٢����m���Ӊ9����:�w [i��ɨ� �F���ܤ��`< W�;k,���Ex��N�T2yg?��f�ۈ_F��t���A�7 +�Z��9#�9N��Z֓I�:Y'��� +��\��9�y������v��2�È?�����#�����K����B�h&�t�0�U��jg���BF5��׏��p�����6���X�f�����Ʊ��ZtR���'�e��]��o��;v.�p�8q��Nl�p��9���&M��N�v-m�v�JW�rT+[�v �h5���[�@�Q�ZXA\��1& + ���� +!:�'���������}���<_+�Qˌ7�ъF�Q4���$�M�,�c�]�O��x��a��YEVW����^e�N�{��{���J�;��Q��>��!���ctM���:^FݏN�t��f6R�;�I��ha��:fm��M����E���Q��ڣ^C�"��)R�QX���s<��� +��uM!}*F��jT����� tj"�W�5�=�d��Ʋ7k�� 7,j�pV���7�P��E�,+�s_�ܴb�%4�J�{J�CvJ.���Y�m\)W�eʘ���&��+W*ߩd~�� +Z4Z�HAD�˜��*��@#S4�hт���k��"���6�P����:MAZ]ƴ��w�R�IJ���fa�� ����X��<���1ٔ097�4dnҀ9�~s�b�}���kIi�eF˜�, �W�rFA�e�Y�*��]����Y�z�����J9ZM� `��<�ĉeȖ���" X-������V�����(b ��֣.��:�c +�7(hߡ��} +�Sk�j.����7�-}G���\�ܓ�<:�B� %�C��YXc��)O�/�;Qb�-�SO�Y�r��ʫ�Y�V��I��6+��^U�rD~ǤZ[��ث&����xFNjr;^�������Ɋp��h����ƒ�8$�:j�0.��k�QmR��D�5j�q*P� m�Zj�j�����9�F�fy����|Bu����|A5�WU�| �qO�P�ٍ�Q4�` �z�=�^�0��>�E���ü�^����P�.�Z\�jvW��]/�ۧ��v5�GT_?(�g\.�&9=����A6Á2���3|43 �#7�96��4U��_�.��4&ab1��۸z�sV��W6t��-��ri�bA�L���"c+Ƕ�DOb�I�cN�9T�YPs46LJs;�0�c`w^�@�n��w�Uf 5�V�1!��a�5&9�f6�Ԍn�&<�V���<��cw.�,㱗8��������@c ��لn�ތ�c+Z�$_-xI��L|�1y��y�uz�8��c�}���:�`?G�gi��s��y�Ǽ�O��&�� ��ٷ�=0��ۃ>�9�g4Od�N�i8�)���<|.[O��+�q�8�����O^a���X\���ū�Ú���RZ#�u}��g�\�����"ӿ���3��0���+FH�a���W� ���M���q�����M�7��-:uq���Su_��qp?��a�`����ә>^�h^������; �s�͌I�.��1��������_�^� �}���C~w��=u�e|�������>��r���,!݆���!y��tVL�X1K�/�W�[�����e�2c�̦Z^�ً@'�~��y�y�_��=�ͫ �O�8�v?;NDZ���%���n;7�zI��m�vݺ6[E�֪]�� ��B��ҁ(� ʠ�*�k�T.��T`�@��`��m��2���sQ�S>����w�{�y+8�!h�n� X����_8�wp@7)�8���2��}���]c�^e�����?��̫�� +<߅o�7�9���|N��Fb-C�Oo�c���\#�Wp9/�|^�u��¹�|�<~K��hM�^�#8��0lO1|�e�.�c�_��ރw�&��2�؉��_�3/�^P'�=�C�%��i��/pZO�~���|���1��!��} +�"�zA�RB��L�y���,|>����O��s�yx��4c�$c�syy�0���;���G{� �W�=���hϳ<��*w�n�Y6e6N��Y���]ad�Z�yN���8�K�΋e�T��/·df��� }?�ed��N�a���A{�)tg�"֣=�S�q�y9��� �ܯ3� +����O�Tn���a���w����j~��� m+���'�`�6��@;�v�a��hO����0y$���>�f{;�{��n2��ŵSϰ�ހ��a<�_֜��B~�c7E�E]������T���K�2/{��]B?��J��5h�g��I�8Z��r�s̜��y��)��u����&x"�<���参� ǃ��-h�Qt���1����"���Eo��2K�n�B>@6�X=G�����Rf��f}��6C��<��o�'�G���q�։J�e�kC�}7Ƕ�a��1���1��1��-��4+f�:O�l#�������� <�+xr ����d���8���rD�.�w-� +�2k�9�s�9Y�޵��XE�N�f'�;VR+�� ��8WY�\N�c��o5��R�T�#߯� ��"g����~��m0�a�{�i ��g���XV��q��;��H�V"����/��4�gt6���覲���4�+���dg�dG�$~ +>K�c�@� Z�bK���I�~��hy�Y�E6�Vh��F��~ , )��Y}E ���S�Q�iT]�I�Lk�i�S��;�,>�D�j+>�V�%��������%9��ib"�6���N�&!�����ˀ�Xf�2e�z˪�c�U�9��9�Ty�:�;�Qޣe��JZV��2�V˼�j�Q��AE-��\R�rU!�u��9E�q�s ��mo�hn��0��*��]7�t� Ե�Ti�U)�C�j��ꔴ��XS�ҤZ�n�i�cƄ��YE�y��j0�*h|J���Tg�X>�E����:'?'�n�݅=XK۳��|���ý49u�_;�-s)�(W�a��Q���V����+�TѦhEJg��ά�kpn��r��*�[yZ��srW^Ru� pSngN5p�woc-u@[>C� )�V���B.1W���ljtU(�r+R�W�:��긂�� +�����ܫ�uo���n�k�UsJ�5_���#9�ϫ�}��*�s:���Ļ�v|�O�A?t��bq�o&�F�xL +y,j��+P[��Z��ޠ�M�y���u����7)��6U�>(g�9|'e�="���|��R�uޜ�p�-ĺ�V|e�:�^�$�Z���"��s��~�|�K�w���F�@�܁���rҪ �d%���"#�O�� Y�_�%xQ��gTxS��J}NBw3��h�&h��ڡ�{�������P��a�\a���.UF|rFB����t���-:'kt�,�=2G�WY�!�D.�����5���Wi8�{�� �5سl�y�� �Cc�~��;7�zUS����r� �cN1d�5�O��Qy|L��j��7�8�SE�c*����h�ct ��U��� +�9?�ހ�ڣس^�V>7C��Pǵ�Irag+Z +e��ʖ�ʚpȒp���1�xi�E%ɔL��%�I$1ILY��(� IpB'��P������o�+h{��$�qh�~�\�r߅uc �H��^"sʢ��!Sʩ%)� +S j���V� `����V�4NaRR�Rl�֝��Iّ�]hϠ�ņd���6h�3/���/��LH/�S/9��t�5��H����u ��i࿏{�v�w� �#�����A<��0��sqsc,��1�|�rl7��mF1f#���+�>��i�<>]��s�� ����4�y%����lH*�P_���r��s�N0+8t&�ܧ�H�(�)^b���)<��v�;[�i[A�:A=A�8�m9d E������A����ĵ�$+"�o��<8����ߐ;�ݼ�l��dw���쒓�!� �SAn +� G�@e" +�JG�C�)��)R��Z��СPfl�ik�RA�Te�j�~���N��ξ�>������e`�.�ɐц��?:񣛜����M�'�х���.;q��+��\̎���� � '���)'/a�����S�}�� 0�Pc7�!g� ��y��?QK9d���%� .����5���u!�����}�0�kl����V���O)�^ތ6)���`�{`�5�=�0���XI}�Əu�a���K}���u\��kWr@n�zc�y�GY<�D^�%���-ći� �5�M�7�a��&X90��Os��6���&j��>괟d+�V곟Xl!y}K؟�6Sϟ����!�s=�U|R<������/��hr�뭁H(!0� XB��qa�C�*5�?�+8p�l�I�>�����|�� ��L�}_c�uM;9`ͅ�9�����x7Z�}������k �-Ǹ(dD\,�FN����?#'')�3q˥����|x���Cul���b����3׻�Z��>�W�]���y�D&�Qp�$� �U\0�!V�s��%���q���@�ϓ�s� ,QTg~)���!Ļ�<�jg� ۬������13 BM��[ �I��>�����e�W�9�I���н�Fs�ƺFA}�p�C&k��@&0@>�r0���u�-�ys%� ��kT�m���r�� YWI���e����{1܏�-S׀�C���X�5�ȵ�G6(пјwU�H}�r���:~\e����������M�! s?Σi�j��OZ��{���$U1�#�1J ]v[>�_���mpmu }�)����'h��ЗQ*��� �8�fy +��>��=��w��$��) t��9Ïa|�$���љ�Y�;�6�����f�����_)������b� �5خǶ��&b{�gb���x� �O�)�5d��t;m�G/Q��'*;���������)p ��X���U�f{&��wѺИ����P���n���.�N������Vjd ~����E�=�Kx�:\?דDt�O��`X >��������-`��U�2��K��@ �+�\�g���Q�Q�����H/5�?����z �OR��z��^N���l�߰�Ǩ��c~g��;h�$���i=�� ��lYnl� �W�P��:l7`{�'�!��n��-�n_�%s�ŃtAz�����D��w�m��_P|��ت���]>�`�td��J�a���7�#u:��ID�Q��R-4�,M�GZYm���b�ÛV�͵�ǐy,�G���1�C,��E'9� '�F;5:KQ���L����䥅�L�>��f2����H����6��l�����q�~+��9�3��=\�ss���A�OǾ�ٚ��5E^8BpD��J8j�����nV_����D�����*���P�#����ĸ�c7|�8�V�3�p�w1���wG����6Q)pd‘Gn����Rx�੅��M؟Ld�4�H�R1è�:g(UW�^1DwA����ý��x���K�#>6s���1�3:m���Ԑ`�ˀ)��𔰓��U W\�ᚈ�x�C���� v�~���nw��]�Al}����`��hi�`,� Y̹��ß�I����)�&;U�����^U'�4$y��R�T�R����LPij���݊�.V8u��S_T(u�)G�9%�RQ�}��_��ι�_m�>�@�xV˻���JP�=Eՙ��a�2å�L��2�T�Y���rEm5�����W��EA{�������kߢ�^y��䶝U������r�F8����X�ʸ� �HjF�Jޗ�O�����4�:���Vđ��,��Y�*�*U��"�� �3�����X�|�W�F�\�~9���6>��>`���b�:ɧ2��0ہZ��yVJ�)�7W�J�I*vf*��R��R�Y N@����9U*�!�k��]S���˵HN�Ze�^���+��쮳�9�ALk�=�YH�I�;c�Q5�W�R���> B��K�?/M�<� +�*�ϗ'�'�;�����A׃A��A����?L� p�����ew�^�g���;���n� �,$�$�\ T� ��� +����D��8V�^���Bq�2��Z�N��6�#�2�Ң�� ��>��q���;���9����o��yn�'�[鐫�%g�+{ ]I�l% +e VP�!��d�"Z��� �"�8��<�<]��LpUq-��@�ԉh�ܛ_!� +���c> )� $�Uc��֥� &�S�a +(��H�w#��)�<a�s2�9�C�>��q-���J��FP ��.�~1���͵�~L{� ��M�H��i� 4��� -J�G l���l+@�5���c`��*�o� >40E70�c�ۭ�� +�W�/��p������dK��,1!���a7���f�F3���bl����l m� ��B&�xjG����؄����;@�� |�R�o.�����<���)��> ?:�c�m9�&'�4�^6O/������3�J��κ�s�ܺ�b��Cg\��o3@�j�i�y\g6��^g��8 ���9�@/��}��o��1DN��Q�C�b����wD�&�A�����z�kN#� �����-�:��Nc�nx�_����`�=��'�d6���2��!'#�FW�?���r&�e��R���R�;㚅�ͬ���U�[�uv ~��&�v���6�IZF�P�I�`%XEn�E㮥>��yl�>7�� ,f=F���5���\�3KT�h\��5����!��%�>��擤!s��`������1k���D���- ^[�c������s�X|��0��>���CMlFY} �s��$����A �n–��Z�5d�||�X��`�5�?b �ߝ%b���&&ϰo_`���a��M�<~���H{xy7����1��R�X���:�8{�WY����I��ň�%@�#_&��A�%���WL����$��u��8�x�WX�Q>8B>�0uUJ �&�^�p�Kd��|G�|Fw�UV�3�]����6�KD��_P�Lpo����Fp�*%���U~/N�� �)ڇ��GN���vSO����8��j�Q��v��85�mjd+~Ɵ9�D��!�Mǧ�)���;Lr+���j�OU�,U���*���.V_���ZUb�R�mP���*��Q��!�y7^��'�q~��&��������>�@��^�gU��cS�;Y))*wzT�0Tj��Ğ�b{���*tT��(�Ѭ�j�-J���sH�O�U�/�Zl���(���� "�Tr� ��O��%*�HV^�SSS����I�++5W����0*�7B�MJ3:e�K�1V�ml��xRS���4N�a\�ɑJ���b��1ǐ'� �A9�J@!���%7=A9�$e�����(����ϗ���P&#}�����cr����?��8ʫ +�o6��$�,��fw��I6�l~vIHBH�&@�J$ +�$�AkJJ�J��RZ�j�Ţ��X��ZdZQ���t:0�V�v�ږa�V;������0/��۽�=��s�}�o� +|��ӷCy�d�}K���e+���{�y�3�����݌�s�lP⼫����`�M�2�|ey��*����(!�Uh�+ت�`���>9�ò7��RN-�F �����6`|K�Zi� +�����|A|�l�r� :�)w�r�(4K�P� +�Q~�R�pB�p���N�ˆ�/B׏܆hD��Ѳ!|���PN�c%|�a�#h�p���JF�0ߕ�K�ż�bxLq㤸S���n~ǐ�� Ѐ (������%��������]%\a8��g��|�JH�l��H�Oq�4d�i ��X��6�5������|Ն�oexhE��0W�!��Д�./�n{y೎����Y|<��� � ��sc�Zl�ŏv��0� ��:r����E�E��0��&���u���٦�0k�@3�������nI�k�%���e��� o!�y��a|��Hs�v��B�������!'K�A#KY�d>`�]�*Y� ��Ճr\t�u��L-�1G��l��k����Kx_ o��8I/9kA��!�h.\���c������ <�FV�x%�X�P�b����1����4"�sq}F (�vx��g�U����m��xm�7�%��g�#rVZ���5�d�c?��%DN�)�q63���c= +qŴ���yּ# 3��6\��/5���������Q��������%��,�iD e� ��$~l�6���[)��l&`�,�4�o�!��$>��2ꄯ����MS���~��w9Xeqrđ���&�f�������Nj�n�� �q/���X�6�,���a���o���������=puV?�&�k���y��G�C&g����3�d��L(9!�Qj�g�����ky?ۇ�G>-}����)��w�žk)� +��!��#������6ko,c\Ɋ���A�(���f��C�~���y�Cv��&��ړ��{OK߹�F�*J������y�W��=烀%��� ��qe�#3�p�H���\�΀���j�<9y��{�@�&�/|N:��gT ��"b�c�|'�k���u��4���J��g-�_�-�_�_�߃?���[�m��rr��z��{ҿ��r��GQ +�-�@�t���%��"}�v�̨N�|S�t�LF�8$P��3�\�P�E��M/3y^b}���"��3ɹ�#LV��9�����2l+C +3l3�ԑ���)e�X��%�x?��<�>j�*�� + +�-t��L4���&��qX�sh^�x_�xO�Nj�qJ�tR{�L�(�������P��&˽�v�+p^�Z!��3��N�e�8�q�Y� �������S�q��u��� ��s�a��(�C��2������M�~�]�� +�{mf�{�L��m�5��:'�`6�?�)�=�|w��|_APŎ��L�籟.���L��i$_�y=B�z?"�k��z��DZ}���p_!B%��}'�]� J�)���(<5�k�n ����t���b��#BŅ9!:N���w����p����CȎn��$���|_�)n�S�V��"xf���O�*x�l�y��x��H�%k7�x�x�S�spd�;�I쯇o9r��8+�[@ +ԁ8�c�ҕ�h�C��|E�\ +;��{��Tn���������6�ٻ���4wX�܍*ɝ���yyr��g�E�o����/��(�3�?�d�o�%3���$$`BH@��� ��U��d���(Q�"��EED +TP�M(�Ȗ��-��Z�"��"K��w�;=�����4�s3_���s��g�}���ߖ6�(M@�rA�k&�Ь��%�vJ��^ ;�� K���g�M@�� ú�Z|��u�9I<�9�v,�}��l�+팸� O8:�C�_ �mk��<�b���$�J��.!�)A�-A�&�.~OHtO���H�ZsѴ��Ѫŭ�$N�V��i�%M["V��x��sR��ܢ�x:�{u�>4� �gq�YBz�t��}N�}.ѽ�z���D�Eģg�q�%��+ġ��~���Ţ��N��y}d8/a�Kb�rg���*bNE�} +A�3A ���"�M�~��K��[4�[<~M����� ���[���[�%�V�A�[���r�Nj�?�����]༆��e�y|�1�G@(h�`�*��]�S�@�K�!M��>���b G��s��)4 N��_�(| �SC���,u%�7�$��ђ4���ų ��`�6уv�-dw�C�a�آ�ļb�1a1������1NS�aȤϋ���8!5F� -E�Sw'�:�{U�!�<�\>�y���0���?�*>���⎤�3�&��C̙"�,�\&57��K?�GӚ� +�4J�C96g! -dSCI23!�rm�3��A��{�Z"���%��I� ��cfqdZ$-�*��<�|6xcw!^"�0�Å�("�q��k�N�Ƥ��5�!96"M�%�3�� C�s��o��#�:���2���������4�s�4�/����%���RLZ�Jk���M[����f��� +�ESjh���rٓ���\�gRG���������B �%�xP�EWjI],-��V�I^T0� ��G����FZќ^IRkA#VN�,c.�'�Z�ϕ���W�:���g/�\��h��L1�$�i�RU�kku�RG[�bNڱ���E��AΚh˺���ن�TI�n}Rɻ�@S��3$�(���� �4�[f\��"�� h /\4����D�SGw��Ά�݊��+yލC�F�3��gD�v6gT��T� ��a[>u�� ���������4UF��h���F��4�B@?�h�I| b�aX_���Mb���H�����Д���t��%�0>���B���S� �.���z$�f*|ըj�@8�:F�F�0'�YP�y�H�`�pΪ����4���M LH9:K��F�f���������� ��T{|���j��H���h#OS�4pu�d��d��������q'�q�m*i~R����R��B�7�� ೛%l�jۛ �Z�o�����Iq�@>CRM�}�jP�~D&�%�x������8�(���D�笚�|�9*Ŭ��v��h֘Ws/�w��QqN2��,����AI5F���(�SB�)RV�$��M����׍l�ux��U�y���d�.�/���(ǘn+��Д�<�np�5�K:ٔ�+�s�jU���dӨ��ݒjb��+�1'X�o#�M�����c[�:���>�ЬB�݆��j>��׍l[ �����{T��3�8؂r�99��<��c��Bv�OU����d���N�[����`(���Y9�y� +6izEq���e-Z^Yq�խ�暶U��_WݱS��v���7��٫w����8�v�C� 1r��1�7~¤�Sn�c�o��5�{gκo��s~?��.x�?.|��EO<�䩥˖�xz�3ϮZ�� k^Z�~�Ɨ7�y��m�n߱s�������[{���o����{�>��O���g���𑯎~�����}���Ϝ=�ϟ.\J���������J�]I��YW��Q��dg+��/R�K��r��R�+��k��A��ݔ7) nƃe�-ʅ��p��a�2b"NLUV܉w+3~�ܘ�P~<� y G+K��<�Ô�+/b�:��&e�+8�f���M�y[�sP��>�|� ���T}�<:�I?(��)�.^J�>�\ͻ%�~����_�_b2���lv�����ǣa�O��� �G8�#1<�\�|��LҚ�7?3'� �t뮶;�f���[��m��q&O�6}ƽ�fϝ7�� [�x��e+��.j��[�ȤƟILiL�T*��N���h��j�~��o����'�G��~8��3gϞ;w�?]�p�����ƶ��e����hbm���֮-;zW_�5����a��3�Ж�����j�꩛����sӲ��Z�d���O���G. 54��PCC 54��PCC �w +����u%^��]��/��9��� _ԏ�����-~k���w���e� ����ܝ�V�����O��Ѣ'�~�H�PG �VF��ծ�=��Ͽ1���}C&|�w�w��>����/n{y� /Mٵz�o.���Ѳ{�_�d�'��װ�6R�k]�/�޳�̾�����{t�t�p|g��v�zf��fg�i;f��i�����N���д2/A�oF)�TLP.��� E�["-�����)'-�߶g�/������y�ޘᎀ�N"_� +)�U�k�a�"a�>W�~�ՓĢ�� �?J!���&�v�e��zz���c��-̣>�$CkS�F��kCe\ ��)�j3J�-)|��ʉ鱶d(;���nZ���s�����>w�'C71}f�Dm����X4 >J��6 ���3��O;F�.���^�h������W��}�F�]�υ� +{��E����"�f(��/c�`�4���Ѭ����7�h�^!}w�>8�5��K�h�ʙH��AΡ �5�.-F\ |�{Gq�{���im=�/���Z��t��Up��pdK*8�+��#�K����D0�� +�3�{������7���1�7���@���A�����o���Pa��.57�d0�~D�K2qH9�y���BCO�mHLU��1tՔl���2�"8���dX2,� K�%��e(� %6@d�u= +�ם�����j����^A���\�ˎ�*����$�,!��2.�K���Gv[��=����ZP +$�A�=]����+�#��zw�^ �X�aF�*�b��Z*SR�D �&^\����4��h`C�͏@v~'��x�<\�վ���A�G��i]8�^@(W�I��<�}I�X�A�-ed�YÍ�DV���a(� e������ ��Z�g:8�QCHz�,��I^���P�Q�%�x��I�-��0�2����,탡2Ad�� j����k.s�[�g-���H�Q���$Xi}y�J&��E|���N�e2���@ZF�������O� �A�F�# zw��/؄9Ќ��ވ��0RYe�J($�9J;�C��`�M􂜇����}0� ��P��/69������&�I��l���됼:y���*LYT~?W@l�ͥt%��SY��Bf���a�C�*�Pn�;�ӑ��W�_�ހ��}��]���M��*��'�(�b��N)�%�O2�qbzȅ)}���^K���gX $'��mo N�_u_q��� y�[�r=�P�"fU��dV���p���=!�:qܴ.K�``�ZJ ������s�^�9z�����5��-���&i *ઑ�9u(I�#O���bDQHnƖP ��VKE��2�j���Vwn��� '�\G&���Ǽ����Բ֠�m0�NJ�\���ɰu�U����H Z� %4Y�@�"� ��5P��o�g�1i�p`䉳���ߦq/�����g����(M�Eɱ��Z�,��T"�V $�K�M�2T��jA}��)���Ï���9;g/�(��Ė>������Ȝ�f+Z��5�b�� m ����@9���2v~ j����l��̆�q���'G��%���7B�#~�̇���ސ��t&� �n�磛#X���B�.� ��x��ю?�S�]1a<�u��톖)����/�W/�z�fn��N�cSG��q�(j�9, ߏO �%���Ɍ����j��1!��@��πt�/��,7�]i��u�䁇a\ŎU�q\�3:Z��:.g� +8g��: +ElA��,DBHHB�@¾�- �@�%1, { �E���" +ZD���|���>^�‹��w���>��L�p�P8:H��"���O�l@H�4�@D E> E�ߧ���h �x 3�{ =�p��~�@��bI��b����)���y���`o%��6������5~)� +}�Ozt�Gr(� �y����Ć���_ x� �{�L|�@�m�T������+5s7*��N�ȁ3GR�]x��څ���)��|9x��^d\ \dy��b��.pP��d��m�k����k���m_���"8��'�q��*�����)�c{&��B��?P�|��5 +b�} ���\����hX�L3���5��j1|����%��/h`�?�b��!4���У( ���^@9� �S��a��6���������r����%'����P�b 5��A�(�=�)|F����I�S|F�!�'����AcI�n#V���4j�Bkn    �{C.b�E ����aԞ���=�����a�g*"��t�V�P*GhHL���f)��sU�Q�͚H��%����P�Y����~5�[y�6���V�!�zgkhpw��K +L�y}\DM�3 �3�]W�����dk�i�jJ���$��#d=U$y��A����� +�7B��-P����%P��_6�`ׅ3�$�����}N��+5A�IL�6�2�U����`�#%�yWF�SE� E[V\Ks2�[��nh`�Ա�Cb�x��.� 蕽�|Đ� +Cű-����N�����V��>ߊ�=j���Vy& ����ޠ�e����=������ή0�ۯ��k@��G� +*���h�����\���̰O����^LA�� m��(U�4�2fw���O'p���xa�0��|�YPa47(�t%��1� ��Ο;�\0^��vw���vgԟ�g �oB����� l�����;�e�^��cdUd��� ���~�Pb07(��Pf�G?���^��;87�rz����ĸ~�_|�)8Wх�����5�S����S���r�I���Td������C!b�@ ��As�/��<�q�v����q���XMCA�RF���ӯT�bkt-�#���sU���V%�U�}8Y���@������@yd���;f���ј���/� Oy`���Q\Gg��Cٝ8 ��P�&*)��&b�W�l �M�@�fv��#b�\MG6��l�O���?����w3.�}��CU(��&:����҇+au*�mDYD+�6��Z�Q�(��������~ʌ&s��P��cP|��M�� 3�[�ǿ�3������E͋KA�IT�` �9�IK0�s� ��^R����E��`J��2_m��M�67n����Ձ�/t�]w����I�}�Y�S����Խt�N��xh*w ǼIH���N�d� �r0�� #��oH,B�S�}���ĈA���7��ar�����>�=s�߼t�D�[g���n�y�QA��A�$�L�N�'3 c�8�FB�m}����.)u#=�g4��b�4~n�o�����U��c[������Q8��ܾMYBy�͇�f�BHOI8�t�8�:K +��� |�H�{���Ƞ�Ld�T�}ū���o�ݸ\7�gMӫ�[e`����G�p=���ϡn��O�"��@E�d���Y�s�@�\4�yj��lf��lV����/�o��.�=ٴB�j�:�*����n��%}����l��Nmg[������S�e���JK��n�/T^������P@QQQ@@PA/]�,�Yi��n��m����������������y�Rؽ� +��e��[ +���C�>�yE@��)H;����a���#�s���sE�fK��ϖ��?��,���?_�V3|�~l����EfA��x8䌃���X�H��?B�����r��_(�{J��h3[��^^0_�S �3`��p^A�����kO������o��t�7�$磐����dm���Ð��А +P�+����6/� +�f��^ G�p��1~��)��$�T1�|�RB���.���玦�T�M��I����千�����.Yo�A��7�7�7��SC�kCɦ��C ��?��#4w��PO���?�N���fo0��qZ�bNY��Ln���~(�VbOKm�k�Ze�u��8�M�B ̵����Օ�?��?��#Ȏ��,�kN�D�s�:#�:'�>V\�9Oe� ���t�̚R�2'��L�掞8�N��h�mנ镡1�!?mb#�~GPqEfV�� 7UO$��K.�R+�� �\f�9�\cL��u%�u��M�Xy�ߪoNhkG�W���F 5�A�k(�9���ԁ������Z��$)9��3�Ε���4��R���f�i��Nb]�6��*M�Z�I�nAӉ�W�2���v �-�&Ġڷ���6�[�ɐiuL� Ye�>�3��YK����@e����6r�U���/"4� S�jb�M�Cb�"5b�@ �����Ї���IUB�EI*w�:S�W���.+Է�[i�>9E�ߔ+�U�K�r7Se@p^*6���A��3�x��!�Y��!,�!*y�-�vAN��E�M&A���Cӫ� ���c��uԆnv��C���$e�^X_/.bm[rĠ������yb �g� \����)�ƴ&} I��Q�RV�������m��z;��hg���y�n4�6,bhغ ;WB;b�>���t��v�/��KWt�:A`jNm��g��\}CE���Ŵ�6N��Π7Ҥ}�4E��1�1��1t"���/,�1��Aa��O�\4Fٴ�C A���J�d��2�ȫ(��8�Um�3��R �HaD���� ذ$[��n+A�����?��� + ��cSΙ# ͺ��vU�D֜�Zא�� )F�������/� +(�F;�Lj!������ +14!�� +�r�f���ס�^w������� Y���]1|�6�Q�HUU5gv�Ź=�uts��ԚSͳe׈2xRKFE�MP�8��1H�|Z�Og��k��1����5�zq4�`��.����dz�X�FPV(3�Kd��&Z/��a�s��b��P+�K�V���P��B����CǎOf�{�~4�������]=|�RP���IZ�-��`�� I-����|M������)�z�圾�Ђ���x��M�E �������os�?�߻���Io���cA�����?c)ґ��]�쉗RtI��ZbA�e��򺣕E�HE�)B)2��*�����A��W�8/�1�����/o\��#�=�s#�ǒ�F#�l{t%�/N�Փ %� ʸ�tM���~����a�B4|}���M�G �5 ��qtl^��������4��4r�a������8���((>�����' �) 1�tIDIz��*5+� ��@}������;�X�p�gӻ�G\�^��k��m'�#����!_ٴ_D�TXr��R,-s4�A8K`��qq�Y��9UX[~M���6�®���QU�A��۠]��t�w �\����ԮU�G��g<��6�`**9{".#u<��p�H��,���\x��;Jg��g�������h���j��_9L��q���4�ku�˽N�s�w��y(��ϗ��dyI���K���;�N��$�'s�OM�g�]/� +��$^���y9h�:�жr�����L~�`�v�@��� ��(W6x���ϛ<{�q&: �YBH�Tl��������)�؇������Kc�����ǣ ����ڻt��K�_gaM�YǙ�q�ZG�u��ֺUjQ���V�n�����,�!��Bd! K �,d�D��PZ��q�:Z�Z��g~�y�:��E/�����7\�ߙ���}E;�Y+/W�� +��C�A"��f�?�O� /8�עг�����V�:�sMx� #��L]d�ƨ��ӯӌy����.��Z����rp_��O�F�����6ߙ a����^�� �c��P4����#�@94�p`���X(�^��<��|ͳ��º�<ض��J�smxoƒ�k��B��i�팄�Á���}��C��3Ȟ�P�'�{���$���N}�s]����� +����݅T��f��� �V���;�pd}l ������I�m �t����?�n;$T�Ǡ�C? ��E}����e� {,��k �|7�(���^������^���B�|X�λ_�+�'QTy��Zs'��1��]�%��~"��0�����]�_��,p�� ��/ ��P�X���� ��/��O'7�'fi�w�Ԭ�u�Ӆܲ)���5��6����2]ɞH�iO���Jq>� 7 '8��́j�');�m{��k���&h �ho'��'D�X_���A!NW1K�)��L��Y���[�Ff��Z��y on��: L��㆚� ��P� 5ۗ@��+@t� =� � �򆶤�YIV�S~AƷ��ST*e�\W;^��^'��c���F�:�/����n΢���w���t����@s[\d� ���FP��E�t$�H3�>�eOs�J�0)�/(��k��h�@>�Ӭ�n� f��v��hN1�{�����vg�o�'���h9��_ ����>�u6�EgZ�cin�=aq�W�u7h4�(�N~ =�"���l'h0SF�I7��21MG�M�l/ 4d`��B� mȠ8�4'<@s�gV��;5�Q�9�Ts� ny�����*�r��Q�(����FR�iھ�,&#�{Zs�Jg�K�|�ݶ�� ۷��6@����|ftgB��&'=Te���H�[��H}�����U��{˚���6���˪���Zs�}�I/��S9�K�� ��'h߷ +T7�����P���1!O I��=��;s�c��Pc��ƪQ���m%�WY.��(��I���M���7����ـ������� A�d�|L��g����GX"nJ�Vx�+�9�J�%rS}�Z�d5LV%��TH��d���Hm�/6��%���^��A�fdP�] =��{�}���-*�[[|�SJј*�9(#6a�"��[�R��)����|����Υt9Xe*�\of�{{���8 �o@��eЅ ��փ�o�s{����Ȑ選� WtE�����i2�ȕMe*ic�A�fa<&�ZO��ki*��QC���P�:g�Zd`"�<�A72�����`���/F�L]8�|ÖT4dHc`JB�FF��%%*��R�md`l�ʨ�k��JF��L�a4����g�!���MP�� �}ޝ��n���I�#���\�I��H(t�S�M�@� �Z�E�< Y_'����lkW�On�:JT��KI�I�lP� ,d�.92h��0�u/}ݾ �t�ZX���i��������ڐ���s�M�J��LGk�6WJX}�"��P�b���y� �Ѥw6�[�� ܺ:����y{�����G�=�~b��xH��kQI��q�F�ډ�s�B+GC�+K��U�b9#���2�� Sڲ�uAd�;������ ޺�ܗ������/zn߽����ʯ'm�y����t����Sq��ф������̚�t^����s��4{�g%w��Q5g,lm�E����ڬJg�d୛ ����m������?����g��z�������݋N��P��*��|3�I;��! R��ʼnC䖸 5m��ke��y�����_goM�i�#֊NǺ_��ъ�b�Z�Ԋ"�(� D� K�! ـ�!!�@BB� ���"ua��(nXQ���HU��^���h�?������ܿʪ��@������-g���{��~��o�٦�w7�i��aݯ�'�^� E�Q��G���� ���T�Y���̂ȟ�Ea|1��Hx]&�����]�-E�"͚�`^?�e��ܡ�����aWtL�m�qu�~���)~�?�;I �_�)�O�Ԅ��i�_hY�=�A.3�����+�ݑq�+r�nW���-�n����/��^2����禰�g�l�}'�=�$��qϛ��2� ����&���[ft����C�2.L�?+N +z*��)S��hS��es�� s�� +�����)[+�,vU%8Z��y�p�s�� �T z��;v6ُ�.3 �-#0l��&��. ���. x� ���D� ���ꞏ�|c��es`�"5�^Y{�����JO�D�'"�E�5 2p!�8��� �;B����q(���7�n���\���v{>F+,U�y�v.��5�ก +.�I�- +v�A��@��Dl �� ������8p}!���������:�.uXb��,15���(`ռb�Yȅ�K2��U�w �ׇ��� ���_ �yC�7^���R����@�qX;�o�;�w��]8�|�6s�\��F����V[�a��4��,�/���A��qp[��k=��;�\��ȯ� f�+�7�@��!H��26:C6�� pm� �m��l��O �+8{��q�\ׁ��D!�P@r��ԣ�a��g +B�dI�R��&�ԉ�q���MYϢ�hc�.Ɠ�ޜG��{a�87Ns����o��5d�X�݋�`�J#�o;���A� ��c�c�x�⇿��L��N�HV�vL������7(�I������� ��s�U g� F3�Lc�L�.�S�I�TS���<��F |d�Hw�*��@��4 �7v���l� �%�=T'�eY«�,��<���%�n���5g� ��ڦ���fmR[��z�A�ҭ-K�U��A�i�"��2�=��n�gM^�iS n�)<�q},��&�q�,]xQ̐ux*3�@gd���� +cuvu�&�ѤHom9�v�(�8_-ͼ�B�"ΆyP�����a)�!�f���Z=��p㭡��є: +�2E�)˖���*�����kX�F%��Tƨo�����3M"ZWM��M���,�����S(C U�K������i����s�����໦���z2���*h�gʌ���0O��֗��e� +��]k�[�F[� ���TN�M��A��Ag�����6W�鮣�//w�� �ER� $zGu��Y�.�-��*�\]Y���D i,�W��y:3?����i5�z�[�&����1T oe���м���g]l^u����m�;8h�=���Co��?�P�"ՖgW����K$��BQq#�Pn� �f�����[����~�Mx�Ab3Ԉ�n�����m�����#�Ǯ���� ��F�4i� +_���(�J���'�u���q<,2��Z�VP�\Q�JUd�}�=�5@ !a ;�D�HD���Ȏ������ V�X�� Et�>󞞹'�s1����{�����.b�X�ܛ�|�mz^y3-��9���D�^鮒d L���4T ���~����m��8d{�嘳�����@�_h[;�V'�(�����PJ�I��ki�)%�F��'�\��WT��on��u���wWI���e����U'����z���+�fjo�l���/���c�}I�����6K ���m�+Ψ�U\�f\�V�����nF����e�o����ÅwE��*I���> ���fh:��֥��ݰ��˧֚�.����n�&���(���������袔[������1��Z�(�>D$h ��$���k��+{*%��KGu������S[��o�{d�<5mq|셽q�������j�?�?�gpzB9��(��R�F/oeV[�׃����Z�E�-M���]5���rI@�.i��' �7��crk]:�_��Sz��p�؜�����q봋s���d� ����2h�D�� ���Ӌ�����>n�_��ҧ��ʫW\���[��1(�\Ax*�P�& ��e��~�Qa�ў���w��5�rr,��` ����)||�dh2e"�1��!>L������p���W1CBz��m�M�><\( ���W���yPz�ѿd�f���-��-��hxomP���������1^�R�#��g�¦iI�����IV��D6��)/�D��~R��:.�r�����Ь,���N�/T����V �֭]�,[����y��� +�)u�߃�����'/RBHo�ƒ�H���g�����y��Q0�� �� +��L=��E�D��] +D�I��(�>݂�]�+��Q�[�W���_M��[�f��1��-���c�C\ÿDa��)��5:6`5��������\��,��+���E$�Eq�$���r�V���7�z߂jZ�'W �ۄpN%�4X`�E�3@D�߅P Y �&(����� �N��v�� �/���W�m����� ��FI,�ˣF���9"�/*J��~���� �?���*\8 �'C��|�� X d}�5��1RL܁i�� ��k�|s'Z8B����$1�"��۳ u���od����8��:;��r8� ���8�����DC��+D�8C��N@;�)�/S��~����l��� �ZC�D�ݑA5�"�*{&#U�d8p@>�3Nl �]80�� �{�`��������m��a �CVs��X@�s`5�Qd�3��c&�?.��n)T�C*בֿ��$��\�)���/�]���N`��,w[���V6/S�W1���F@�g�� JU�T�C������4��$��"1�� Bg $�*A��H�P� ' `�jAj�9H�7Z� $d;A, Q�^��j�C�>�Ak�6�*���8��$l�(|�g�<�59��jC�o�_j@nE��Dio�K�� ���0W�, `{k���X3�_�*��y���B��J�Z���J�EZ n ���$/F.�D��>���y;�5?�5�H�oC�IH>�,��1S��d{jC�<��, 5���uj�S� h5�<��:y)�!j���@�Ky4@��ݿ4��$i�g�>�3M��M�$" q������:��y�;��*C���a���Ӈ,���.1ҽ?'q��L��.�\�|Q�&����$NzE�s�eP� �O����N��M%��O_�P��@<Ґ����ֻ��<e��h@!Z�� �jY�u&�o5�C\�D.�S^GU$ͅ�`̐n1���������p��=����p���S�����4\:����9�x�� �V��a ��d���Yˤ~Hg�/$���'�g�K�'�d= i�N��%  ���t=�n�?e5&S74�!i�� �HC�������J�9�@��ї����^�\Z�;=z���4C�1���O#� +�� FI�%��>aOЀ�~��9x,�&i<��4��А͛�l��G6�8`��H�7K��� +�A��Nm��ta�Ls��)���J�M��� +���� + +���.�QY2%Y��")u"b����b����] +q@�$�8�@��50���E�ڿ�����p�����������0̿b�����v9��Y�C���u�7D��r��V��,��8d��I6����Rr���<ĵ�H i(ߴ����׵G>��trÛV�/,أO[C0L��]5���SI ��=��V�� E� ���fKt ��XBk����US�j�OL�~Wi�_ ���� 鶅��� �^9k>���=�퓝�#�ۃ�͑Q��q�Mz�ZA(VI�Xb>Y���ʙ,uIr- ��Rz����V]@�j +齒B� �� dW'`#g!�� ƽ���ß�o=��Uǹ���C;�|{Z#"[o]M��I��j��RE6�')� oTWV�(���V�X5�֝��U�[�+�+����h(��\�A��j��|l>��m��/^������7��K>����fs,�ؐ�'�N��YJdXʮK��2_��f dz��h� �F<ߪ!�z��A�=P�4��;A%r�@��Esw�]���k��ЙM? _p��8�#,��-:Ym��+j�QY��ņ<YK��� G�*�h�ez}��I�$�jp�^i�x�o\GJ�9���t[�i��v�O��=W�{����y��{7����Q�UmqY��d +݄/�4�s� +��b)��R$Ī8�V}�pKs�ة����U���u_8�t�#Tov��������4�t���_�����6�=s��ꋈ�w]�`X ��Ҋs�dU������4a|S�$�$�E���#L���M����aT���! LdN)�σ�M�~k�������c��K�_o}vvo�8�~,�x8<�⻘4j���������̒�by��Ɖ�_Qy�"�Z4���`k�0�m�z{�i��4����hހ������&ǁ���qܵy���� ����9O�"n|�@�F ���'gR�> ݈����6fY�M\d�2m&V�p73pp�,�g�n�W�A����8���vx2� 5����������c�/O�O����p�>D�962{"1>m"��S^��gEYQ���ϸĐ�҂����z���6 +v|��y��l��@�j��G�r�� j`b�C����o�+ o=]�ޜ�����������3a�93W�g�C��3"㧉1��Ը��k�xI!/���)uJ�Tm�� s�E7��C����j?E�X�z���f��?l^��s_)�����;��x����ًٳa'�f��K�����f`cf����K��ʂCgy!�$a�~W��������}g��{�e(]P�������;# Q7��l����a�� +8�� +�����`�� ��x����d�( �� y�B�r&�g�������p�>����;~�`���}���j�uB����R�*G!lu)���)�6<ק�i�x�� A;/CԞPH� i� �=H����1�=� bPz\�Qoh�<-^����(��e��CUM-t��Z':�-"��%�,���X8�.λ���ی��-~����^��m灴�\�qJw�֮� �ud�O�~�q���|�2��P�G( ��a�c>lpN��������j2[�Ke��8vGEłH "��BH)$$��{$!�H�*(( �X����.l�"(�3���{��9W�?p.���Y{�o���fF���0�� ��� dI_���}��R����b/�Wx"x�W���]�^� �<�������|�s�8ųq��0}<�N��b�8��!�����cVx}� s���w���[�1�,b]�Y���H���Le����l�Q�uҬ`�ZdY-IV�Q¾�gu�DY���@��< ␋������ +��_�x:��[9p�ˣ�!��5Q�-e��'��& +㤞�-Pq$F�D�k� +��(���ܚ|�9�ǻe��nkx�n1��P` �#���|"Ȝ���̍��������j�]�w��{M����E�P�[[�L(�'1�F:רgK�j�J�P�ER��+.4�ŧ�3�M7�X�N-Kt_�>��k�DP"ga^c�'��q���q���K>˞^=�Sgs�ו��G���Ŝ*OJ)*J���S9ZS�X��W +tr]�:ǐ�,ȣ+*,4EC>UuӜ��Х��K�e�"[q`/�j�, +�����I�g�M��k�@���76޺|t�Ŧ��ڳ1ѥ�|~y +M_La˭L���Q�M-àͥ�XL$}�9U�Bȹn&�;t$�=)Y�-�0���e�p�D��`����a�nj�{9v���Zk�g�oaG��Q�u�dC ��� g K�v1[F?!RS +�z��dH��4%Y��0��a�N����8�������u��)�H ��d�9�s�8g��[�lI�JŴ\u]I㚚�G�1�h�h��js�P��+]ռ��\��}�x���n�~����sDr�^���G{����TA�PI� �=uz�:ڬ5>t�k���7��ͤ﾿Mw/uk� zDs7�u�#)y��)�6YA�O9e;�푷T֦�P{@���!AsS����w�ZCRs��?U O>�R��j�&;����ߨ}�����M[����Z +W��}�^�w��76��M��U���K,�Ց���=�8�RA��by������ڰ�s�ԁ�� ��֫� �u��TqZ�V��"���D '�(�`A��^Iyݿ�20d�u���Q琯U�P�������i5w���["I^OjfƵ�<ɕ�awY9���*�����y�;z�Z����]���k^wi�T���4��ل�ݔxwg 10dB���V��I۰�ՙ�!NG�|�=���x�a��~i��w�\p7?��W^��)��m,��m*��m+��w�4X��Ƌ��k/ TA�!G�Rpn ���.q�.qst�� [��q�3c>V�F���n�=R����R�L{�� e���"I�bw:C�/��8��hΎ��C���B��h$3b�\�PpJ�x֮C�����y�K�2c�~�����q_vd��r�T�]��p���t��Inp����F�"�S�p�},t�66�!l"F���M�l��� �I���3Ff�9�X��!�A�N{H+��R���ƍQg�S�����w�y�*�w�lHڨ�TG=�� ��c��ps�dX"[��,G��\�Z� �$7@t6�K�H� �� +/����������i�m�>MK�H{�� +D6XkB�A2]d� ����(�["O@~bN�{@��i� 9���Z� �F���?x���9��� ϙ��a�c<�M� ��c���y�*��K"ِ�^r��۬�"/c��cW�������Ȭ�>iǩ���F�9����ݬ��ۜ��{����1�H�H��@���?���������!i�&R�i#g�.���Q�i��@sTn�B����z!�<�y���1v>�� eJ �?�Vެ�#�Cb�h�w/e�=(}�z��,~L:���%|H�Şc��d�A@6��}�Gn�R�Ũ�j�=˱�j�*���n_J2}���r�cf32gҎ�$M�I�ٔq���Q~��7���ל��G�᜻ �v�fOJ�s�E]�Y�*H�P�����k�P�N�����a�Z���n�Z����we���CI~�T~%c"��7*k�HN����T$�����K�c�͢ܧEw�/ �sG��x�vt�'��g��@B6$�7���ϰ&�5�o�T��#�G���:��i)E� �ed��Y��$oH I؄��ld)C@+R�����>}/�Ç�����}����0�7�H�^��0i�ƟR�O~����O$�,�i��,��K�0�)QN|BȢ�`������z�@`�/�A\��$�%�%�!�5�v���_�k�]�7�t� �7S.l����������t�9�nF�� f����=�������ް��|܁Uǵ�6�[B��!�ڐg���izn�T�[$�߮�s���ڀ���x�oʐ��8�dg�W�����os0f3iA���p��Z����@��bڢ2�Mq?�� n���.a~DX��+"��U��P��"� �� �"d&R���0� ��w~T]����sJ/�)���h +�k0�x�� ���Q�bF-��&��*�E ��jQQDkbaĠ8?R�9�Q_�3��kỵ@��`������ �ܦO��_,�Z�_�t86]�a�ɿe?����'#���a <�R�N`V0epIt&����+�٤FI�7)��D�F��P^2�)�$9enUH4 ��q�!�uL(�n�_�َ�+�;Wc��T�����]v�gGjx@c5�FȢ���LG�Ŧ 1����RI +�.IN��迈��< �E������d� ��^m��d��F�1�Pa��]�{f�펎��_.�����h�"�&���% J������L8Y��V���E1�F*dޑ Y��b��S,A� u-�3А��Gr�k���uA���K�[~�0z�d{d��څ� +��U�{}.ο2�HP%G�s%F�(� �1/S��UJ�p�� ��`������) ��F�V"�Ѐ�̥ɑ�����+O�����湖�vN�Yz��r�G}ú���M����dG��ҩ��X�\ʇ��@�.���KX� +C�,� ��c L�3��EGD��s��#9�h���h��>����dë�c�V��[�L:�<��W޺^^r�� ��M&�31��\_.�s�)"�$WB�I)� 2��_F�� ���0U8M_ "X�� ���=SvXk��Λ�����n�ky�^��ٖF+u��kQE�ov1����J̥�� +��������) +11�8)<�^JH�'�HF�'���阵�(�|x'ȑ,��Р����+��=�t'��n������L}��eY��K^m�wZ%.DR�/��XJVlt��K�I����*q��$X�- �b3'a\�t�Z ��� � �޹��������/���}tzc����Z��OUw�Z�a�2�0Һ� AMx��B�.g�D�Ʊ �b^HQz|��P觪���D~Śx�3N`�4}-�b� �Q �_(Pf�Ziڍ��3BMh�����4�1�w����~�/y�-���`?v�@�$��P�\FpM"�O����.�c��/u��F�x����,��Z��m(��5ۡ_;�@�� Ѓ�=���'�5ǩ�[S���Rꠇ������ݍ"v�;tbP;L��*�cZS��-,�5�zk�z����4M��=KF�V���)[ P��n2�Fz�CC�5�z����_�Z�~nf���:���j"u��>��H�A����������p��ѽ?��گ����i��4��T�޹(�΅p���U�&Pl����������}�k�j�ۯU5{j��ٮ�W��%/���{�z9��JԤ�#�)�-p�������p�5���4�X'M!�����0�M��x�w[�^}�[�Z@�4�҆��B�:t��a}�~~����o7����K�ha�]�9��ڹ�y�e�|�e�<��o���=�p��㹺�Iܮ�gx:�z]���8����_�i�f����������V��{��Ps�T3���lE�.�.��$\������~ڲ���e���%�3�K��}�p�7�I�� ��8K�e���J���J���J��݇f{��6�;X�����B�ECM�ZPՀ6T�у�>�@�?��}b#�o�$`���W����{���tC +�5@;� ��A���_��m@�%kPkj��~Cf���eK0���Jjn@A��((�g4�:�I��?|�kX�y�I*�x� ��$%���Rt����f��f�fjj��3Q*jS$�b������Z\�ua�b���'��q�(�����������\�}������� Tp0��zS��s���( 2��A�� ��h���B�mT�‰c4�탱�!�����]�~�^���q��D:�M"��!��#���M)���X�ag� +'�d��&�n,�D#fa$ȋ���O0�K!��G����>(��B��'j����� �m6�s�+.\�I�9��M������D*��9�N`� � (�7����Fx�!�$�f���ツ�^���k�x�]�����2_K,GT-t@�B{�,Z�����_��]��$���$��)\�N�a��8X�E= �Ì�z�s���\2���N�l숄���^ ��RMVBd�2�eP�ڠ���fV��*`�u�}P\����\c�B瀿�<��Jm�Qۂ���G0�ց~��Ӯ�^�� 7Pz<����^O$��B°7��y��i}>Ǎ�hc'|>�B'�:8��<WC𼍑2�M�0,��؀�oN�X�ׂ��䣮�w��v��k����ʯ�H����H|�;�������č�������WH^: �4�.�x#=h�1��, -G�rR�:"���� `q�'��y�q���~�=��@$=� �&j�� ڐw c!o&��� 0 *��r4��b�Y�0C�FsȒ,!M[�t�=�N�U�"��)������3`^D��`0~폰I�𱤡-Y�I�|�89H�  #D�:��#e�DN3��a��fȎ\E�%�+�!_q� �U��7x�w�܎ pN��}!�k�H�) +�'�c��-uh�&���W�؁�/1�(��"B`��p�����7Y����ke�9�⬐˶E������TxAT����GLr�o�������c�?��K���O~K� R�S�S?�{i_��c�#:�u6ᐼJ�U��O���joS���p� +��'r�"��R�q�ΐ1Qc���M#����)'����X����kF/�%m��G{�~B�?d�%�K����D�.������v��X5�u3Q�i��`sl��B�E|�q��볢0H+��z/��}+�K~�?H�c�d��`v�1n ��O��� �?dh�=L-�6k�q�=N�ƙL�R� +=d,�G��J�fb�� *`[�%���ƶ��h��>U^ذ�l�`����=�>��ԧ����ٝ�G���0od�g>��$�n�ޤ_��_I�\�2�s�)��p��Fn��[lu4�v����?5�c5�vw�ֿ)� eG�+ ��˙�%5���oD��H��:2�p��~L�ξɹ��������Χ���}��⏰O��2t.��K����C �7������:�y��,� ������T�z�d��V�G��[ʾ��=�VF����9��P�i�s.��)/�����w��"�`8�P#�~�}b���C:1�J"�n!���ȼ����=�sS�bMs���F���])����c~.SPnrn(�W��%3������ʓ���N��cž�Q��[��������=�T�� �,�BBx�y���ɮ�ht�9��e��5h�p[Ԋ��˓v��ja̭J9�j��s��T�}�vi��.�|o���C�#���$ +�$��Z���-�����2�dA��C�.�q� ���{���'�i�:��&�C �D,{ږ���^������;2(+r9gJ�' +*�GU�Y�s��[��eu-�Fv��A��dO�se}���N�6�V� � ��i(&�A��;}�_;c䰛�p�����­�s������}�V�t�*��Y����IVe�˯W6嵨��~[T�s�d��Jiu���je�j��e��kq��@H[2YD�,%�!�i���AG��F��>s�:j��h��[i~W����#J:Q#g�W� �*J�-e�ٍŻ�uM�j���*Ugi��rY����B�?u�z@Q����5B]���;s������k:��~�#-�����4)�A)�ԡ�Z� �I -��� +��*HDP��]@?����8*��~�Yѳ��}���s��s��v�:�� {�:,��{�����~'���Š�B�zj�Z���ƲԨ3�Y ����i%9ՙ������p0W(��D/��D�)�췉���y�@4�!M?a{g6�-—KR�.��~��4�q��j4�h����^��\����:Y]�_^�+(.*N�/����g��d�����)��Œ��Ԍ��� 񟱒@�:�m�C����y�S�n��~c��+����ǯx��`���q��_��8ΩZAd����� +ё���TaiEfF�aj�Ŝ�¾�#E��%/���KiG �$���I��;8����-88� w�>\��/�~�e*=3rp��AO��^?۶�[cK8������!)��Lj��F��U���^Y��\Q��/?/�/��[>�_�L���RZbٛ$���8I ����rԫ⾶oý؁{q{nv�h�䘽��a�����^�k]g�O�hV��0q�ј���Ĵ��d������L^M�0�TW���õO��5Ki1�o�xU+q�@6�\ET)�I}�QFˣ���{*�޴!��ݖ�17ݶa�� �L��jiO$3�#>$�M��r,�ȅ�#q��)�MU���2C�u�6�d7�m\N ;��~��8I ���j�����TD��fl���\��o�,jo:� {�F�e�DzS{�“z�bb���#; ���W�קj�HjNgv̦��_ �-�8���$�t�%d���i�F4;$��ݑFS��h䑎T��^Ŗ8����6����_p��& ������������ׄ�!�q쁊D���$���߁!c`V�7�61��=/�{5J�qP)�^^ ��>�;JB�f6��gdt��m�B�᱃F՜�A�Cƾ��,Ǵ�PO��hޝ����6wBš(��������w�h�ñԉ9mb%�~�c����PI _}8-��ۤН��� <�F=�Q�+��߬�O�8�������)�4m�i��u�y��(�<��4' ��+d1�*9��s\�\g���h��'ع���_l�{�$�2ZhBh���F�I�+�D�>/�οQ�������Kr�k{5��.���T���@�%�u�R�=w1щ�������X�E_��R�^K>KC ���� ��/>�/�i���E��%�F��o��Zg��aAլ���� H�k��U�-ɫ���V��"W��CW9F��H�����Ք}��B[�Z�~�Z����/9�}����)g�O�rv����e��N�����fB��8�2�Gu�R�bE�|� �|�#�5���l�YwT [��`��w�i�} ����ӣ}x����=���{�ɏPc�M���e�C�0cy^a�[I2ކP_B-7:=�P���&\h��Ά80����d��WP�h����'� bp�N'��t�<��P�m�u�༮-t������0�y�'I7V�:V��y�D�8t p|P�G�."�IL0�a��<7y���+Д��_��*���bTm���ҷZA�V (�f��M�Q��4L�_�nHt�� �� �#�Dd\(�Y�N�m" In`!� �2�Q��䬁"o�d `n2��M&�`��� Pԇ�ͻ!��+iC��4+kB�Du����d- �_F( +� ��T�n����R�����7X�5��7��Fp����.0d�!PF8�;!\v��j�@ndʩ�XNNȫ�I���C����o�@+����!W2�hJ�Qf�:d�����{R�v�O�>�/}�hc{�6m���@]Ĭ��� P��e���t�7�|�|����ϔA�$���י �T%���OX黀�� ����>�]4�.#`\5ƨ �L��Ϭ�_���9��,���P�-�R�� ,?S�����@5��"��Ib-a�d�V��p��'E��BP�>0O���]�QM^[�T��zYuQ����� � ��Ɛ9! I�@� @ ���A@��(rUZ�P������E� +*Ȱ�w�;�����9�]笇ظm�@�X�  �o#D���/�����a��$v�l����a,�|��Fk~�`W�e�0���;xۜ��{!p .��B �i+�n� hk�rx�[6����?nn��̀Q�'q�-���[F�Ö�8ā��h��=н�����0� D� A�q1�O�#pR=���%�~�h��@m� �3�@� ҵ�@��ez�$�|�e�[IZ؀ w�s����*�Cf���V�=zG��%v?��&��W�0���e� �'�w�aO"��w6�x��� � � Æ9��<��c�X�^�O��;-��U�,�iBr��3p�F�m^�V�!�uv3�։ث��ˌ>~/�ϸ����n��l�$��;C8��� ��T7[�ځ|���فa�䮛 ��N�!�F���#{�4��i�!�U��!��_�ٔ>���oA%��W����;�9-<þ$�`��O�Df�hl<�%n�|TQG���� �wN�::�>r�~�u�.��;Z�m�`�.�W&��<���AȍԄȾD �W�A��3�JJb;D�|��I��o���K��I�yO�����%�^��H>�J�����3*dS� +�4��p�1:?��,�y��7����s������_��pyP�]y����W��~1GyF���ԦЎ'XG���E��6�&�Z�,���L(�� %�;Hi�{I 2�+F,,�jB&)�&:W��n*J.���e��W��{;�i�4�IsȒ�����VI��T|�(�0g��-�$Z�.�U��íN2 +TU�%�� iC +�nE>rSiT��՟��՟�y� z�� ���߾�C�7u�27ۉZ���5/[|��ٲ��[��Wj��ʙ�N���[�QM�*jm��U���-M-�4�cR�<7�U��>�4���2�_%di> +35������L���A��,��t�y ]l����rx���O�g���wۂ_;�CO=aC�A�ֶ2��fS<�֨�T�hX%��B}�0/�D��=$קU�R:U�)?�R����H����ӎ1t��hk�uN������f����� �G�kf���,�ںkyWS�:s-=�hU��R��*S�� �Y�����#0d��e���I�U��+*���"�0$N��%�ǘ��q�5���@�:g6��t1f��_��Km^t���?��p�#`���:�Ἇ7R�4ԲwVW ��e2ra���S���(�h��r+��F$!ˬ�e�����H�P<�3�Sd[X��1�5@�� ����c�bf�q�݉Ř�]K0��W����4��t��� ���Qr��FVXY_a���S��֗�pRK q��b��\&-�O�+�=JA�]��4_8̗-,�q�i ��O�� +�1P�=� f��<��^g̍Kv���;φ���ڻ�p;iSe #���ݓ� &��ZJMr��`:/�2O_^*���y��Ni7�.���*���a^\��W<ƴH�=�;a��f�~.�a�l̽�s0�W�0}W��u��8�/l_�t.ҳ���Wl����:�j���~IH� �("�� ;�BBB�@aG(���Vԩ#.�u�Sw +�,�0Et��VEq=�c= ���b��ʎϼ�O����;�~��������|}&G���P��n�j����'��Stbo~~́�����Ս����Ҵ껥? eU��e��>6�� �S9�G��g?2ɃV���Env�K���7���r�k. �^H +��/u��sYq[[ 7�s�bM�FuaӶ����9Y ��k� +U� E������┆�u�9��&��NMit���� ���t�In�3 �.3��^9w�^Sǰ�V�Ց|��פ����Э3�7\X%X�Q"���L�{~�:�ܮ�Զʬ����y�����m��dmC9����Te�Zl7$ch�I-��if�+� �q�A��3$M��S���c�CV�����{n�� �Э _}#/��zq|ε�����I��JŕJ���*-��A#��HO�r��{��kJ�x�BrA7좑���ܭ����t�~�NZn2I�##r�ߒ�w���Y���Q�۞�7<�{�7�ú���{c���D�����f�k�n�NS�2��K��R2LH.$ &zrX艨���Y? +^��3C�� \�?bY>.�Ԉ�d#h�ݐk��y˰q���o�oLlq�d)jMlp��-:�2�{��-O)zIH�8!J"����HX�>�--�t?x�9��g#��0� ��e�e:@����i��5� !�e��96�̰�p�\�C��8���h��Շ�" `Bʂ,�R�)��!*�B�k�� �;[����s@\�#��/�x7)�������{�4�<ǃ�.�f�q�q�!�cB��E�1�"S�T�,B�%W�"�=�U��^�jo�3�v��+�w)�n࿡���) +>�H���m�W] �f�{�!�և‡�� T\c�M�P�C�j1de6��C��!>�Q� D��Hhu���«���)�5�Qʤ�L �����@�J��M������ ����0�&�j�Tً�����H�� �C��ָCR��6�� �� Q�r�q��� Z�لq�鄏� �� gL�Qغ|�A�A��Cil2} �f�l�)2�HϠ�Y��_8!e�+�<�8��!������v�C�K��ľ��ā�I�p��1�\�h"G$���wH +�.Hp�A�F�ڕ�Lw�8(Xa��hS�-��^��dlt�f�'��,��r�w6�&`FQ4%o�L::!��Az;���׈Qɛ�o%�Cҹ�7I{-G�K�+� D�4ȝ��P�*��y��L�a5�%B )mP���1o��L�6�Ɍ=~�i�ޫ����Ԇ�&7rG�Qo�1�I�yC���W�W�/dc��lL��g)�B�CBt���!ő�,��:飔�c}�!�"LPƷ�:��̚ ��bϱ�M��r��6s_���`�k���c�N����8���MEqk�K��Xܪ� {H����� @ b� ��B�-@"D@�D� +A�^��VP���ֶ�^�u������9ߞ3�������)�1� ŌyD��>$ �< ������{��>p�}n0��� ��1�[ n32��+�����$lw��} ���b�:������X�ۯQ���)G�r���U`�0kq��&�L��x��O��������1� �����Q f#���@O[ a#����O}k�Tm���=�0���}ډ���}�B��s"oףX��}i��$��6h�W��������ѰV�0�+� +s�~�1��e9�X��E�T2K�����^Q�9A~�E�6fL��H������@�S@�V��@�((C�^� +d�!�o5����n3�a�N����KǪ�]/�wt������9Q~uq���X��N-Q�1��J8y�j^NB�03�S�?*��?g$����z���$��� �{�����s����羚P?�l��l��e��w]O~{G��I�=V��kȉŔe&ti���r���:Nf���Q��J�8Y9$Q)�JRR^�������y�:�m�<$�H�X�|�\^ԯs����v-�K.O����}ݪ��7�r�V��>���VA��N�fgf1�Ӌ�jMOu�^��>/NPJ�Է$��?�I��I��e��H\�@�\�k� �����X +�:��G�.�5y�io�nm>K�W�g�(��K�����ɔ4m#%'���]ƍϬ�f��e�iƴ$:�7�<�-3.�#%. l�b$ �zo����b0[��=���\&:7�;�/�j;�E� �����W_v����_�U*є(�ɧ��B-K^P•�Djω��^�H;)���ʋ*|˔|�J� ��d!���"���5.7� ��Eg0ri=��{��v��U���M�-�ݥ� ��:�gv��_c����Ąr5-�4�uF��x�b����$�[�ܒ�\A�?LQ�G��l�2d�����=��iv�'p�o���ٻǩ��ѕ��7���w���6q�i�D>�YP|]>�&�Q�*4�q�������w��� ���m�������WB�-P��A��;�?��k�#�t���{h5h����0ph����Uw�-������uHy^���/;,1���� +��0�i�dҌ�,���M6��ɍO�h�oht#$1�a�-0� ��p���F;0r��]�����m�3`�fouw)�^��l���w+{���/�J�#�E]��� J ˒B��'Q:*(�v#-��3�>�xJ÷�!�a� �m��̝`�,߷�A� ,�h�r��O-������i��~%�s0ɇv9-�t9�(�a�x�@!p`�9���� l ���,n�0a�ߌ�����@����v�;�(��ݎ�[G�%��];��1M�ο��Þ�Oʾ�\O%��(w�Ɓ����f�dl���fG��m�r�ޟ~�n��^BL� Ѿ"4� I\��dL�C��pfb���c�!�Ń�5R�lOh��0��P¡E��j9Nh�8b��#��M�N� �dB�B��gC�b��r�Dd9CV�I�;���h�d���F�o۸�O������@p�꣞Sc>�����k��� ᳐E����N�C����P�@^ᆌE��� �gސl�B�����@|��<�:��S!�R�Ԩ/Do�/�G �[1|l�� �h��f�;���U:A=�*�$(j=��'o��s��背f2�N��/d~�~C]��'�^�O�a�M�)^���R�q|m�$� y$ �r��ȋ��A�C�rr]�3�CS��2.TkyP���~�����@ȏA~��6���d�J���� +�|:���a9���z��[ gBƄ>�c8�i�8�0� �:W�=�7�9�>Э�vc4ۂ�nA��P��Au,��l���ȗ��Q����!��ѿ)^E*�T��'*� d#d@�G��4�L�X( aaV4�D{�%1K튢|O��"��Ə�� y��%��~G�nw��v?Dsdڐ�T� ���߳���`F�������5�}�E�=�z������&L���`�dcn�=� +'�\��y�0���.��+\2lZ�b憘���g�M�Os�N��=ɪ�H�ӞK{��*���+��y&��O�����\�������0�TAt�L��i�/���v�NuĂ �7�u�cżs����J>�?.\�0s�}��Իy���m��9,��?-��w�n�og\�?�]�}oD��|$u�0�R�.`�������a�̥�S�������.��͇��=�/4���[��/��[�$����ɿ��(�*�n�)�1w�����Ǝ�K�N�w����=Rv��<[�7E�)F��$��z��".�5��,u�L,��Xo?�T�4�8˽o�����Ґ���17*�f�hiH�R���R�F酒���EM�s�-�3�ԧL�4'L]�c�;ڣϳۋ�d)�����!�J~r}�E����o�Y��{|�_�y�"űo����2������k�s���k.�_��Y�B|Ʋ.���͊c�����/5�K���9P|>w�Ϲ�%�V�Ke�d�Z n)��J{�4���/���#/x � +b}��_�`߻F�ܽR����|�~vL�U �k��,��W����Ty�|�zߜ����_��);�����q��c�����2�i�@Vs%dM�}Q ỐOs���ڷ��YVp���3? c>���� t��F�}i�1�\Ci��������`��m�r��kU{*7iw��<狹_��(o3~n9��h�2m����:oH�Xն�f�>��L�0?I����8X�UA)ғ`B(�@�(� =j��j�A�@P�((�2눸z�Q� 3{f��{vV|������>_���Nn��MF��*�1&�8��xx��ot~ |��N��Ό�ъ�X��Qu�TY�٭���9�.}|�gWF>U�VJoO��&51�/�'��&������Tſ +�NZ �� ��4D��#/�C +���+2T�Vk��r��R����tLg����ve��뢰%1Gz �;ry�r)R~1�)�ܿ>��Y��ƪL�a������&�K���E���ļu��s��->��T��C"�{٘p#�W��7�� ư�nA��:hO6z�I�w V��zE'�:J�� �9U���*���%�Ie��Q'Nt=��h��/��L�@�� +�T���P�![ ���ד`�]tk�� �5��]�R��wҗ]&ok��7��B�ۣ�K�q��-I�M����7�9�'��LW����B�Ȏr�0y��L, +�M1e?0Y�~�rD���#CdU��V��&z 0��_�@�]=h����x�V�r⸁p��D0`ƿ�ޟ:es�Z���d����j��J��h�*d���AC1��b�)VO(�P��� �T��{�k���n��~�x{�o�eF�g�C��5�='ݼio�s�~�)wC,��D쏹k5�t$��9ǐ����27��zO�1�7ml��36E���|blՋ6�<�ȕ~W�N�P0-�� ���7��HP5� �#(^�C�}l���g��I�q��LO΅�s��d?8{ ��&`V`ǘ9�f��32g�̠��촋�������#�:J���R%����n�+Wq� ���g�C5(~��/���r!���Z� �����Ɯ%� �Y���g�f~�������,��"/��|&��x6d�t��m�G��U����nߣCnO�6�p�`��s���Y9P�@� -HU�Y�.B�� )RyL�����R�7*�71�[h���P�)���,SOe�Nwe�n��6s�e����w,�~^�p\����O��;�Cd���e�.|�-���{�2�!aYb3������V�������]5�+ꊟ��J���J����M�Wӌ�V�}(���������>o;�6kb�������6ە/����a+~*�p�<@�����k:����>� �}�K��ې������_|4���kC�:(r�:�k���!��T�� +5�C����^���pZ�>}�w ���� <H[����_�H��h� �\�~�:L:�Iv�M�Q�"�� +ְD�{P��9J�ڍr�w�2��I�u�|��u��� &�9��+m������8�)@ �g)�k��H��E� vȜ`���� ���d�YT�g������;Av�5&@ �$$$6!�)6�7�,�����E*n8R�A[EQ�}k=ť�ӊ֭�Uq��3_ۙ�x�;�����}�srpig0 b��ɴA$� +�ZH�2E��1ʴ �J�Y�e�c������'6�PT�9����I~�������(����“��F�p��� [83ؘǰ�'� h�iC���z��u����%�i�cj����&�v&���O��N�߃�Ѓ�`�O B �J�π_�.xz��ǂ6p����0��~b�8A\4��u��xg���3��O�>C�|��x\-��,��@�0��Y���ï��� �������{M�;H3��)�W�;��=%��w�Ô/��x0�ȃ�&��|�<B��D��d�,H�:��τ(}�� Xi��ct� `�)����$��������- �?&^[�?i��� >����T��h�\H>��D����,�Ku �� Y�B� !�2����m��@���½V"�i �Ekn��ٓ�W����B�_ a5�W���\R'��H#��ݘ�ZX�c!F���](�#,��2S�֛C���M��ʆd�͔dp�G����#v�g�&�W�߉�ڏ�ux!�px.��S l�H`�8�G!�ք`gr{Qv4b�gم���D�)t�0�1&�*4����� _c3�f�E��;�v�7�{�^��u~%;4��� �s�I�\I��>���{7s~���c +��R�V$4���e�Pͦ�2��4/-��!E:�� >&����ϵ|3So�"j����9O�=���w��60�����G=��/xߑ���I����;����vM �+�3 ��"� �� D[1�`�@*��&�����D3>�+�ߤ�L_$������~YT�|?����V���.���z}nF��s#b�{=b�wUy�wTy���ߥ�7� Q�>�� �v&��c� a$7���d�;3,�!7�#���ў�L� �{�g� c �N�r�����Pչ_Kh���ȹ���&v�߅���s1��D <}Ip"���X�ˀ���|�ăs8�Ép'�4!���ι�t�l2K� %��d�s��o��bɬ��&?�$���3��K/�w)���|�*Ι�������=G�� :P�u�i����㟈�&L�U�w( ��dx ��C�I�b��̀B� �R2� +{ƛ*W�I5G�neЌ�eJ�ѢD����Ng���N�˽����^��w0�5�@r�p_R�hh�ɠj_Ȁ꘴?�lw���w�}��K�o�p���[b� RH~6�[EFV�Q��lƯuN�������V+�.��Y�*Ns:���v(���@Vo���?��,�r���=K�%}�;�;RC�� ˷��W�$�V������Cؓ�/��M�7&wУ��(#��Qo̩G������0�6�N�X'3�Z����Ȗ�gaks&%�C�>���_GT䷫I�+&�gR�V�R�ZfQ�6�Q�mv��>��-"����{�9�צ��U���[^��RZ��*^�Q�$ސ�A�.o��9wGxS��#V�D5�\�j�}�\�?!m,DPS��O��;��!oQ�z�R�[3���~:�����7��S�����o�h���U��ڻR��]���\Q�o+��/]%n.Y'k*ڤXU�MYW0Y�?U�)���aDm�{�g�ՕAP_�&����(T����L�f ��֦C�n�A��lM���U�`�`��|w�B�mMIs�2<;?��n�-�_[])XSY/^]�,�+oWԖ~��*鏬(9]Vr��UQ�.�r�Օ�T�� i��iQo�hjl5M]_�M:�4���:��-��p�|澮���P���Ѷ[ZT.�k�zlX�����п��Bа�l�iT�W��}" a�Q�(���B @ؑm( ����"��"PYdY���(.P�jg: e��Lm 8���Ȣ�TE�g�Ǚ3=a>����~��s����>9 +�f���?pf�ތ���=!)�B�3&�w��7- �����:�í�T~!3߷���1�� ײ��~\��bt�q�j��ZVWdx�,Ҭ�d���X�]~a����t���,����^��}w:��}.()�;x{�����B�r��%Fe�T�A�:�']Hx� �uE:����L8˄�M|�j2��$�Z%�������&E������Ź�;���i���tK+��L)(�I:Z㟘����7�5�Qp|�o~ ��^���B���D&���}��8��jh�]π�4\n�AG� ��b�y�эWY�oP|&lm��M�95q��U;�U��.�p�u<�c{i��G��~[�b�.n.�.zS��7�dAW��m�(W�I?e���ϕ@:@��F +��:��@�yc��C̪ns�-9竟�j�s6��@}�pom����)Ҥ��� 5�q'>Vn����T��Uy�?��? ���Ȫ���=���us5:����r%�j���8Of��.-��lH��a�^t�tz/��Z}�=b]Z�f��x��;���:ƞ͒G7(���=�����:}B��|B�F�:�V7�^��:��{�N�x�� +�۵W�:?y�O��^T]ׇ�^+F�5);�ǃ�ѽAO��ﺴ�4�B�U\�ۘ�{�>�ȔF|rT�^��^��v�=���#�}�#�mJ�6'jE��V������H�]r�.�;h�H�O2����pl`)0��?�c��Wh���-K�j�э��c�ǚD�&Zn��*���Q��<������ZG�+2�[2��Q���)'��9�O7��^F;uߑ.> g�_�E�̟d�+��?Ā���p���{߆���L3�N�p�p�~����; ơwRL��2,��X�� +�km��b��>�����E�� !T�*ք��!�>����8�^��L�I �d����l�T,�q*�+�N׶�>��~�LW4Ӡg3s�'|:D����x���� ꩻ��D�a5�`�ɿ����� | �9�_����!(_�S�W"�y֑v�uc8��aڽ���԰y��e=�c��\���\�t��m2��Y���Y�pO�'������-�B�a ��������-���|P�&(P�q%H��ђ�����BW�=iS `��0�F3 1�� +Ә+��{X��Y��2kY|�u�S�����}�.?�@���O�߁�2����`�`A�a��1 +�5��Z���JTP+Л^��4#h=��up��,��08XKt0����Ļ��7�5L�U$�;��x� �#��0�%�u���j�}4��d/K� �P@領�F)�AWJ�) �(���t"�� ��E�ƖF;�R!��"�Jh�`�8����� A���hy��ǵ���H�s��q��'�*.Z��o�ω7r��,�ɖX��D8��(�g����?�E,A�66���0G ��\� �Q�J\ �����Y� ?ψ�r�ȝ�/j����:Y��B(�>\E t�1Q��B�0M�Ʋ�!Y �2���P����ͺ(��EQ�K ��� ��g�ij�oĨ;K�����x�,(��R�fB�Ҝ0�S�D% ݂5�%���;��_�t�߸Jkx(i Z�����G�>b���9<��J��/$/��%�&��Oߒ"o��?B����zQ��o��3��4 �oh""�� U�t %����B 5�@B ��TY�X8�V�;zг�c�X���<��?���~��y���qY�A�:5[��tMި �D`f/���^ 4�>�� �z��� }�����z��3u�����<� +q�z�������:O|I��~`��V=���.h�`� t "�7�N �qQTM� ֆ���AH���$2�Ī3�l5�c� ~�[�>`��-c����5��Sf��e��~�� ���#Ɯ�}Ƃٽ0����L �� Ƌ�B��F cJ���j���H�}�1�@LIJ�Q�z#r�߇�zVM�#�����ٳ�n�'A���F���}x���iۻ������n����zЂ�L0X^��W6���!`�`���U8ߐ���4|�3���-��5���.!q��1�GQk�G�,�7[�޸��V�N���a��{��r�q&��Ր�ΗB�;_ y�4����F�=֧#��TX`̿6��M�{�W"H7B���d��]�沼5_g.}ʎ�{��f�k"��f|����*�k1�vW�Z~޴��b�.��#��"�� �t?>�1>K�g� ���O.Q�x,�ŀ���^ �`3����8�x�ػ,�|�+>I�q������峜D���K����m�%�8��op��ks=���}2f�43J>}��p�Iʡ��^�~��3G� ����4���@��x�{���;W`�2@_�V��Bk�c��ڝ"_��!��y���٦�9<���B��4������&�C���� ��{ㇽ���{���H��G��5��@LׁpH��@~�$�{[0||G� +���=/7A�*l 7�)��Y��Q�S��ɜ,�#��9eN�2$nc�z�?�Z��N��5���ӟzw,��;XýȒp��>�I����dY>�-���-�\!B�Eݔj�o�BW�h���N(�Ԏ�}��ɂW��D�+�,z*2m;�x���B�a����"4���hR~/C���)�;ªțf���c��?���]Y뫊�]�H��[@�Y1B�VaߩSG���B�:�j�&Z�4y/�#g���$�H�;$l�61ױ�������TW*�H��}$B%M\��(/��,�� +� n����OY x����b ��- �;��j����p�:��D�U�ʎ0��\2�������ck�Y�,ͦ�&k�\�w�U��Eb�ʊ:������NFQ���� �_r*(��VP~�[��|���(B�0�l5�g>B�U t]������*�щvut�c%�߱�0�N��kc,�l 3R5n^�Ԑb]���P+�u�H��d����|&3�e����#3�0���x��=��Kv�H����U�=k��i;m_��0�p�t�n.��>��'�n�_Zm�}�W��� +���>H[�4�@o��Ƥ��`���G�Lspf=�1Z��e_��L�Rs��`6�`a�(�����nQ��5�� ����S�≧�����3��JӾ��U��_��z�k��;�q�olc�oLc��9a�9��1 �5Rk)�C:�{��P��W�X�����\(n���vW(hd��Dzs۵���� �DQ���:�8[�3.�O0�8ĵ}�ݶYٶG�1ֻ�5]ƶ��D��\"ΡK��Լ����� +�����*�/= 0���"&\Bֿl!���:�!�#��ԑ��ufq:'��:� �;#;?�����:�k�Xݵ�&��$�F�$��W�1h|�~��z��=�}?����o����� ��? ����n��3b{˜��XFӛ̊��V��sB��s��>�)�K���k� ����~���ׅ���By� ���yV������?K�v���@��x ��D?��� Ÿ����B�G0�qL��d�0�%�c� Mc{ ���x�g���u7�v����+{u�+}u�+5=�J��p��_���A���_F�9�\��w`l7@�0��Jt�t�T��a4F1n�ed��8�� Y�8�e�bI��e��I ���52@�cs�'��?2���5�����P�@�` ��EԔP�\��� ��1l1 l0�1���LF��>�b���a� ���c��/��j����w�JRC����,�Hn������!? ����۞ Fz0�E�Y�f�&���\TO�a�l>/�r�*� Q���D�('U���DE��� +�尢��O�\�\�D���E��M�‘0��Qn ƹ2���8_B���X=�&�P3]� �^"°O,ߨ�[�Ve�J��ڤ��RU�UG�/T��g�s⧪+⇪n�}�Sq����[��{j���VwF@��/eP��`}��\��z�i=u\Ԏ�c|��p�<�˘�VtS�~U*~���Q�V�@d��o�}v�5uv���^��ͥQw5����y2�F�k��H����Wɕ(���a����z{�tG�h.���R�0#�3���{��g�$i��n�u��D�;n�ݽ�����ov�%n����=N7c��o��K;bOI�Ƕˮ�ޖ]�}$�7,5ƣSk<:�O�Q����0����-�m�H�8&����d��հ�d'�d�X�dY�I�gs3e�]�~�õ�5NW7HL4�\��r�A�׭][�ަm}^���9�U�3�~�fݐ{S"�6&��d2:�HF'��6�Q7���t�̓М���ЏyT�b���q~��t��[]͙i{i�B����έ�\Υ���M�8�t���2�&}�w���� }��q����_�GR��JEϺ4t�KG��t��f��m�L�,+z�wN�q�›�N�x��LdnG�*��/�Z�N~��I�[r��Mu�G5}�q�I�K�@H &�8L�� �5! !!!!�B�-D��~A�u�m�γ��M�z���vq�w�HE��Ӓ��ԫ|�9��0��������;�F�zx5�Oռ��Q�Q��B�g�C$kP���|��sKM�gZ;����>���� ��.=�w�$�e@�q��<;eb�6��tU�!�ŕ�FQ=�.��Q#����U"t�G�r� V��M�N����|D�#2���f�o�+)� �;�i �Dok�vp���a�2�v\wz�`Y�s�:�P{q�G�2�ˬ��6��d:j��H343���!Z�HXi�\�:�!�$;�D��0u��t���� �[�8?^���|��W�A� ,��9�a��i;d8�У�;�^�r�ji��&�������F��7�Q��*�Vnbh +�CJdC�J�,K!�)��.R.�>�H�_�R��T +DQ!�5(�{�A��W �i��e$�J�����/�����wwT_��Z���I�q��<�xu�اB��/Wk(�%�����R�"W�K��Y��{��O#��o� T?1e�(��Q0dkP6� �;�`͈���"v��&'3{�@�x�1��Z}�&�e��j��*���BtB�/�S��PTZ}����.+m �h��D��z��W?�䫿����)*E��2D��k�~[�O�p�Kf�]-�{`��t�R�m-��泎u��.U�il�R�л�ZJ*�R�%�Ɠ���@���M����Fd�>ae�������-�Q�(��w���=|����kXh�ރ�k�}twK���fW�vzoUk���%��ƜyTe��7J|� E��ueTam5-�hf��t�d֌��W� �R��UXz͏���eDL�5������;h���ϴ�`��!@[�+�{} �=L۪�_9�w^ܧ�Hr+�p�ڸ��V�w�U9)�EC�i6P3�&�����4�l��6m�&���l���bB��&�fBdk�*�=�[\����?ޅ�;`�@������I�v0ʾd �Qџ�\ЛvPԓ}��-<��zg]/&q:+ȩ Tv{;-�}�߾��ԾΈ��f�[�%X%� �1~ּ���i%�wpϿэ;��h�0L9�n�(h�(�T�m��i�x��p,م7�q0k�8}D�:��b�|��. Z. Q���<Ƽ���� 8߇�/�!�ך?�� �V��������6OT�b�����7(\����7mǻu�!k�S���ԛ\7�l���YőK3Zϋ3�^���N���==}�3�F:5��tj�O�$:��@^�<�w��!���;�;�j���� ]����'pW ��D�����K����M���/nEx�Š��ܲ�����S˭G��<���<"���b�nV���>h�����0�-<��m[��8�u{\��r�#?��Z_#�3�M/�e�Ȑ��o�e�wbp��8S-�]�Y��r�N��aU�y�,"_�M|Tn'U��ԐZ���\&M�a�Sހ��ׯ��T��%=���O�z{�U z9�g�IO�1!�E�4�1�C׹z. 銌������hԯ-�iw {���=��k� a�������C�,�C�R�D�NئC�� +G��g���s���Y�g.��/1n�_n���������ߘ�7�wϰ_�d8"i4���6�[4�X\3<����oq�%�P|�ǝ�C�s��ɔ;e�T3�(�#�j�nC��Lo�7��> �嵄� ��3�7%_�������A_K�n�^ ,��Pi�s����c� ?��\�����t�N��� �� B��`��hD�SE�oOu̐&ʡ'Q �<��8���H�1&��FT��ȅ�?G|&�^(=7�ت.�Dv6l��t�v�S!{lO�VԆ���!����������a���P~`*Z��p�����ӄ�qt�L�:R͠��L�Cs��R|�I��_��Euq��ӱKO�,���^&?����u���-�Ñ����#�w�6�N�/►*♺2�jw*vE�ME4ʈ�hn +�ҵ�Пƃ�L#�#�Z3�p'S�2'2�����h�����,��ď,��Q ;��mu\�ݾ�U{��w����+��ig�a����ˣ��l�ns�ۧ.���eqhW��D>F��` �}��l��A���mst��l�6+Bx4s��Pz�d�\���y�ʔŊ��B��b������5e Λ�]7�w+��w_��cmB�KI"�K�PU��v�v4��� t�6�L睦y 4,����B�8��,pc��7p5�aFr�D{�̔�=�jG����|Ŗ��6�\�!u�Si�z�)�k����N>�*�ve�]]q�+���aM�LtX��*b7�2�)�:��F[\�B:��qP��?�Y@���P���U/�bT5?F�37Y�-g�UYv�|cV��t�b��Y��k2�5��X�2}�ۗi��Ӿ�-K;�4�����N�ҌA����^6 �r��u� К�H�W?�w�|��98�/�#j8��g�> �̛f����M �-K�e�Kr?R|���Z����9E���5.�fo�/�u�������$�F�!�@�n�� u�lJA@�5@X��YE#����.`ǕxZ�jUl��F�2���Z;s�n�g.��8g>�>�������&�u)��1�$~��*���2~DV��]���Y��$�ILLl'b�o�pk�9��@[D;W��"!�+���H��^૫Q��Mm�G�����3ӭ>�ȵ�NS�W�V:���u.N��L��V���H:.�K�$�M��r�"�9�1{b7�P��.����8E�C�`�{Jm�]��i��nT������ś��XVʳmʲ ��Y咢L�SAF�K^z��:k��Q;�k���i�Z2E]�\PUnZV=CU�`Q�J�V����$Y�N��M.)��g')v�'(d�s�8�]ٚ��&�3��&I*`�F�ga�4g˨�}���=�@W�:�Eh[+�������W��V��(��D�����V�erی�"�ԒJiRqì5�M������h�'*o{D���ZŜb����'z�|K}��jp�v�A���H{W�A����L��l�:O^U��niC�a����n�4�:vf�Gɖi�Y6I5�5��تz���v�����++�ET�u���Q�O��L���9DU0�D�R�/i?�WS (���l����� BԶ۠r�W�~>���oJn� +㬖��u1��D��� ���m��R�U�j����Nau�g}Pw�5�n�|�����5s U3b7���%z��Ct�}���v�=7�[�*�J5Pjfq�o��Ez�� S:B���L�6�ψiO3�ڐk���6��V��*Y��%]ֺ�)���s`�7΁-��Z�òf&^��l'��~��L�� ��!�߽�PvK'�^�e�.=ӑ�#Af�'����O�Џ�l�=R�-�4�+Y֕m�Yd�bk�u��f�M��_���Os�a��k�%[F�~����mf6��z�����P��(�h�U��(��(�H�"y�5�������E�/��_��f�m�7A�|o�i����=�3�z���j,}{����=e��{��g�����7�>=���f>�yz�� ����Lwo�T���y���#@��D ��rH��!O.tȇ<�Tg�`�n��J���8��T��y��ʦ� 4�.8�e���}��GO����������yb"������u������kh+: d ������lX��a ��uF�v����m �H���~��P��;_��7W[<�K[g��&CO�#�����ٯ�<����~#p;�n'�p�c4�}�����S�����?K;�9��0�� �]������<^W|1�J ޹�y^Y�y����F�y�#�:.#��#��NW?�K�~��^y�w�4�'���K.N��毛�7R~�A���}XC���(��{���������THoX@zS +Ǜ����C�p+��WC|;�wT����Y���,��,������3���3����nN����A� �_z ����|J���>e�|��5�r��� �B�<�����x� �G���hf����L{�'�0yZL�A8� �c<� +���0~2��$�o��򏁜a�?O��@� ([�@z��0����F=7�� 3��������0z� �׋��z9�cQ��- �7��ö́�1j��5򄌑�����+)?W $��ïK��(ۍ�(��0�`� +2=�1 � ��|f ���L<�B��_�!3z���3:�B����$Ք���D�(�+��;`.e�� ���3e�э)߀z����]" &DD,�=q!^d1 !�����5�.BC�NM�Ĵ[:8�e��1 O�M[�1�� "8f��1�3(%u��c[��K���M9AΒ��w�>���m�o0���8qLJ��8 ��ƍc����Gg ����0��H YG6�.����Y�c� ��\#'���+q/����?d�yTSW���K¾�!/�@� Z�*�,�ʾ�H�HXH�Ը����ТH݊�8�m�ک����^EN�w~������N�������r���Oq�w¢)�^/  �(s�Hl�Cb��h&�M+�_����<����8� ��x���K������K�O>���N�c�t�f�' ��HbG���ZdAC�6�=��|Gw��ѽ�8}�|K� ��ߑ���g�cr�?F>�c�!S���M���A�\�=��iO�c��Og�#��SbH����5�|'.���5Ԙh�Z��z%�B��S�E]�3Q�Dt���NSEW���G�-��M1f����O���� u?�Ax���}aM>n�ۓ�������O��_�)��S �'z��R�C�*�}I �d+�d����[�}̛�~�?$'�7$�XW<�.z�6�0��s�;pv*f} τ���p�-���#k +�,�I�����K�`btV�`����Y.u˻��w5��2�U�&�߽6]��n|ѳ�����MF<M�y~oz���I�fC޿���Ʀ���76�#� u�Am��a��G�����������-��Ƽ��\%��9Z�y�%F��jM���0=�����f�a�v�o}����O��O�Հ�)�c>׬���>����~?l�������������\�Ȃ� ��a�h<������N�;�: �-4� ���˘'�����כ �[ 0X�4[���>��a�߿���~�}�'l��_���o�0��'([wb+`�5�0���@hl�FcY�q��e��F9� �3Й��ۨ(���֑p���<� u�}��ֽ�K�{BVq� +n��n����� +��+�og�Y^G�-�=�w[�k ���[?�0^�c���_�t-���ě��:�����a�q�F�be�=��-���V���؝�՜��vk�����No ��o ;(�6�1�'ǖ�g���;����͑ض9 +�|�/�=��7S���Ѕt�>��L�C�O�!�l�/5�ѓc�;)մ31�bG�ں=���[n�[��c�m\�L�_�&X����'\=�*����� 1���X�쁭! �Bwa��0��$Ѱ���ѡ 1���&��T�,ҨC�h�-Mfٚ��ޔ��$��7'V94%6ҫ�V�ovZ�C�,n�KC�QQ}܈�.��K]¸c]"��0��I��iq'� A��R����� :J����m(sEM�^��ğ�P�и�(Ƭ� Ų\+g�j�m��܂�RZ�W#P� BU�QV�W���-Su�=#�*x!�Tc'� �jLޤQ8�'� •�\C�T"� �� �R�FM.�P1�h��a�, 1�(�6-+I���d���,[MQ���P�SV � +�;ej׻ȵ��e�=nR�q�4�ew���8]���,X\�i���P��%�28Z��2�� ����X��N��vQS�K髂X���&� �Z��:�\�Q-Q�g�9(J+��F���u�i����W�I�cn����(Y��S� ��üIw��y����pB{�a4�ܷ ����7X��FU7��(o�E�42 �Í��b�rkS,�k�lE��V^U�M�*�U.$W4 *�\��ݢX�q��0�����4��k �3��!��A4�(AD�q���p�U�֩�Z��� +X+ +8"8Kl��Uk+���.D���:��Z��u�}_�Z���?����y���}r��?h��L1+�'Ǫ�$�;LZ�_3~�P��ec�^:A?��i�Ö���8�g��~����&�h�;���+�Wƒ&�^��I�>��7A�R9�����{��u{��d�*`}��¬4=f�15�����x/��j\j�ѫ;��|�v��� ������G ��X��{E�wϔL���m���n�5�l�����%���$ ݓ�W��o�����y?���8�lJeҁ�5��29�e�g�a�:_�_�q�ڋQ�q���=�C�8���9N�w��n�����X���ۚ�]2�xu��j��8��Q���gCl�s��4و<�+al܃��?/ �b��, q=0���D�Gcr5����04/��"�����~�}T�s��{�r�e����.�r���,�E�v�ܜ����GD����������7H}�z�Q�I���;��q-������r�i�9����Ѩ�� }�>�mm��V ⭱��5^t��Wt�S�Y����Nq�̟���X���b�ߢm��_�6����*m�管;�k莿+��g�s����'� ��v���}��8 �����.B�- ��8D�z �6P��F �m���m���m���m��dۤ�}���h���ͮny�c�!�xP:շ��n+�9 +�d� ;�������H΢�l@��@������Ѻ��EA0[T�V%=вdKƠE�4+�+J�D��u�I�U��>%�K��ſ+� +����T��� �O���ﳿ&3{���_3�[�������_� � ����wE .�R�.uC�K�ɗ�������"�����ۡ�r��AWY �E ]�� omb�j�/e�?f�SX�hf�?�� � rh^�U�?�����mw���fp����ػ��>���p���b��P٭P؋!�v��I����/��3x���G�������@��S`�� +����j'hj��X�U�5@��¨#񥤆���5��kx�k� ^��]zB/�Hf�����,d~Љٖ�@�ˀ�O��&���|P��:�t^��;5�o +��@] ��a��\��:$�d���w�X������NR]����%����� +RJ�:�R�p����U�u~�ߜ%�H���x���]��/d�����Ϧ�{̽��j�  ��~�O�9�^�D�.U��e�纍�.O<��Ot��c� ��BT���Pw��k`w%�襸M��t������l��V�GK��f��#d�<3#�K��w��a��5,Ն�!]�j��r�}�v�a��2v�7�Ἰ�}[��S-.��R\� +�@��!�nӀ\!Cu�~�a/Z�lE�Y`<7"���{���n\$n������ �q͸A�h�?�����J� �ŀ2Ey�uŹf�)�4�S�6��b*�B:U�l�|� �� 2���������ۚ�0�#�Z�ŭ��� �i��4�UT��$�w�T�9S��i��̴MuڴWUb*P��ԅ�J����c��������~� �2W ����:b\Q���q�}n�E��%��󖱢�2YQj�PYl��:e^��Ɯ�>iNs8a�r8�.��h����v����O82��0��|a���j��|�t�m�����GF8BF�"x�Y����;����ը&(�n��1�P�O|3Bq"z����Q�t8�/ǃ�K��G�h�E����2 j���Ī}Eb�'{��c\jl!�B�!�$K�@$6�Ib�ر@�� �8��X$vl'��Y&��v��L��=i�&�I:M��m���43��3��{�y�9��^�+b?uU�L�$�L�(��8/~�?b.����J�Ϥ��T���J�> �F�I�� ��l�� +|,���Ki� #ޖ�_���LA��YB e"�d�D��G_��Ş�vQ������e� sI��Z���OKB����/yȝK��3��kFJ0��}�n�3�уL̽�{T���� +���r���r\��9��f�W�� 9e�AEE�r�5����� ��z���!֜l�=+;ŝ�\��2��S����� ����cr��0G��Y)kX��P�!�J��E��Bl�k�d��J'�+RR��D�.0����ԓy����� ��5������L�G �a�Ÿ!�5�G�h@�h@�DЯ$���a!�0���\̜��/�񨻍�(#AḦ́˚Ͱ�y �4i�ӥr�)uQ�L�6�Wl�zU�DQs���=\��,�+���� {����xw�/\����: >�ul��G<�>G~���=<��𞍄��r9��8�� �z1iV�I��Eזƌ���3�SZ�P���J\ܞ���x"�Y|RԡZ�oS�'���&��>Ij)�{|K !hQ<��� �0�*������A�-3�^d� h��E����0cJ!M�����aCq�G_N��U�{ʭ�.m#۩m�v����4�B�fFԤYJh,]K���N�i~�ɦ�[���ڴ߮%�'�7؇��1wޭF0w]�żcX������[�kN&�U&VfG TF��4�n�QZ��jF���n5�r��]�F��Ю����k�/'Yt�6��~��5�F�_�EO,�g5�0_�.|\�}���D�W�1����y+���Z���u/iВFEtU�G9����*=�QY�h��c5T4sm&���Z�����@b��bR���&��#�� +ӏ�J!@xU&��K���>zpu�6�͘7�9��o=Fl��c� �61�]�A�SF���4[˩ � +���ʪ�n�X�;��恸J�q��ʟp��|����&]ՇȗIz�"���C�G�/�_p�3��u�8mx�� 8ل���ǚ��y��RH��G�"��^m��Q�lF����Y]g�Tֵ�L�}q��q��:����4��6�Z�G�H�X�#*�qe�_k%xa>�}�g�6ּ���:�:1wv��w �Ҡ�Mζm�֖Ljn=Lnh�G�; +��-����Ze��ij�g[���nAYè��>_b9Qe5���^R��s|�^���b;�Gxa��}x��&ּ��+�?�1s ��[ܮhhw���~�{I6W*�֕I�v�FVvǘ:˩�� +zy{-�����ns�[�� +[gD����������dZ�$�E�,��,�si�J����g����|XH�CBr<(d��s r��뀯��hf'07��!�_��R�����:�W��Ɗ����2��B_}�(�VM��* 6U���� M� � Me����0?������;�ϋ���gns�e@�@�Ӏs%`�����-T�MP^q��7�W;A�T��(���ĉ�ff>X�x�kU@�c^_�� �c?��\��p/0��Q�z:��U����e@�+ �n:Ԥn���ZpC��͐7�݀��3��!��/��o)�ca�؉����?�DZ��ڏ��CK���sw�ُM�>��0U�﵀�&��Ѓ�)yo�c��������ܤ���Q}�E����.>o9����G윸�����x�~�Q`���:�ϞWX��x�}�ͼ{��~��⦆���5i`M��󞬉�"��C��FQ���l�`��.~ �� �<_��� ��@��]�Q }F�i +ͦ��Iٴ�6�6*��TL'���;<�wx���Pß-����l �٦-��/����!�9M�J�%��rh�S�a�޷ �q�%��Rճdo��6z�'D+7�l9�����/�6B�B��Ih��Z,����=�eB3�2��X�'(ar9����!^����H����3DG�����z��p���t��s1�E;w<��;A��&W� �E��8�>U�Q�1�=�H?y,�NxdJ�<��2�u�Q�-R��.�����i������OeE�B��v�W��jz���/�+�/� x����=�K{+�~�rK NX���2Z*�L��-��!K��e�l�%]�ϒ%���#/����X +�|�* +}�)v�\Ul�Sl�}����M�bc#�?4esZ �4����tU�����\q��/���Q��]�}��IE�cd�����O��Δﰦ)�[+�ZW(7[sU��ͪ���� �#���s�5�����oP�t�U]�*������60�>��k���t&T�� ��Q�?w����Q�=F*N�m %�4N�)h�"/����_���W�f�Wdkr6h�vج �o�"�nY�o�̠6AB�m�А�c���̿���B$�Q��~<�)p0�Ea�W������HiC�x�ڰ��ܰъ��_(�{NV� ��^��� +]d��L��k�$d�>=�H�(�aAh�a^�S}ZO�#��=�vn��4ݛ��jfWpj/�s'Ϡ?FJ��׀�7�G�bCdr#�H91�������Pf���蛤^�'Y��g����i���3l�z�2� �h���8;��8�������R�}J_�#�6{�܎~f������췏��l��:l�v�ژȉ醕1aRVtYFt�b�aʅ������&-j����i�ّ���"� )+�G�7N��i�q�4%�Cr�c��G ;ғ�=�F������Y���c�P�'p��Fn����XoEF|���O� v�"-6Q�͠���hfL�ΈI�M����=ߐ�e���41z��W�����CR�[c�@a [�5{�砚}>�������)8�� +|�`BV�� ����`)-��,5!Z>���ʔ��U���L��M����7]?1n�ݗ��bW����q\�>���r�{�c���� ;ғm��|/�����#Y.��h=?g�o�ÌX<�5��/�e������� �GAk�Т��!��#@� A����z@T�Bt]O������Za��]��-3�um���n���~���L���� _�|���?��~���i����扫t�$���))2k���89ǹ0��Ւ�J��T�2k7�gk[=Lڃ�Y�S�L�^��&3iH��$���%Q�S�����{�� K��r�ٻ��>�5��`�:�d�1�U�K��k�R���$iAz�c~��97�⚣[�X��Vu�������'4i��^�ԛ�4�#u�NpK� J����?��sY�Ij�����e�C?��1���4�Lӱ����ظP\���!?k�Ԝ�s���r2�\� V�A�Z���w��mꔌ����5I��^Z� ��Iz�-Y/(�b�k���ی�8���(b��q��1;�¬A�y<��/��,���Ź9�$�9 RSv�,3��_nvI_^,י*�)� nZc�:Ѹ�#��M��&�����x���`�D1̧���L����ڿ���bI��c���HQbQ��` ,��-�-�)�,Q�L�R}~�,=?�15/�99��U�W�H�]��������k���=O�yƘT/6 *��5 �a�pݝ�' ��恥�.���8VrVb���k}9%�`* BfI�H_�P�f���Z�I�W�ɖ�09%[\�K�Euʘ�-n�E{�# ;�E�<]UG��Q(�" ed����\�g��S���V�k�z�e���r9�*�a��GF�4�*CD)��⤊E�Ċx������L�ūr��*q�*��/,ۤ�_�[^v�-��,��-���*�TP�[� +m� ��t3����[k�7ֲ�!%u����NH��@r�Xh���v��或�E�c떈cj���� iDm�lA� +����sk]C�[�WQ�T�YR3�YsW�Z�א�眧'J�#�o�n���X��L�m!�Q�%�#�41M�����pQD�"т�qx�N�hrm,���X! n�w�ݰ�yf�a���^� �̨���¤c>��� �x�c&�;�b|G�:1�S�����Y�Q��1��#:�����������A�s�9�����|�������ҩw X��=|�}鄓���2�v���� ��q��~ �� x�́GO4�=ˠ�5½� +���P��B��E�E(z�<���(O=��޷��z�]ɸ-��w "N!��� ���t�;��<��� ��J��i��7N}���7��PH��I2$�9��CԿ����p���;�����7�q��BƝI��S��������0�"��@�!�tI�e���Ko4pe" �WX�0��/�#�t�pL���.���#?�o0�5�w1c�b��z��x��;��~����~ �3 �'�M�J��p�T,�=�/^`Q�|9��Y0�y������\t��$o�>r�|O~|F�!����Dϵg�/P�d�c��E]�c���An�ArKĂܑ���l�X ���Y,?`���/�G|��b‡h�E��E>{F)�[6S�Dϣ�̘.c� x�6o�>����&��w -C�}1���<%�ă�=&�Y�E��y<�����N�� �>Cp �m49q�42�,&�$�� Ud=�LZț�N�r��� ����qO�?�/ � +����z%q��x:�)$�D-�"d�% d+�A�Pg?u�1��q +���x����k������%w~���A�E?4���t�N"��|G҉�X�y��8�&>y;uvQ� ?�u�R�8�ۃo�>�?��pn�A��+r�7Fx@�q�nT�\�9�C�41$���[���1�j�l��f�4�h���:�Ӆ/��u������<��;����H��T�}Pem�:�X5�$�p 1$�$"B<��x-�J=pQ�깞�jkkն�V�c���uW����m;�뻏��:��3���̛���~��۴�o�7(S�韮W���_'�}Ք%�CC�P>"�QmCT��oB +~�Z���C� �j����]���������FҊ��6\�l�U�~\��_��qQ���B�Y��OU"��1J����� F* �!�zR}��/��&4���w�|���kuW�a\Q�Ɨ����#.hV�s�|�يs�=���1|��Nw�'#��k"�uq����b ��� $?��-2�z����p��۸�%W���b7;>��Ź�U8ӽ����z4�Þ�8ٳ'z���^m8�k��:�C�O�`�k�����O�]�"���_�ǘ�٧����1�-������O$.E�������&�꟏Q�8�Ñ�EO���g`�f_�BfO�r��2�lav ��lp��x�ix�m��7�1Fd7�w_AB> ��'���� ]��8\�Q�|L|4h��9�'�6{�6���`���ٮ�f:�S�-ڙL�v.�Y��ݤ]�n�nb�kwr���ܺ!g�5C��V��_>T�-È��G<&�w銿6��Z�Y=��[|0,��Ga_�p�ҍ�6� [tyجs0�t%�z��m��u�:vMl�*��[��/�m�[b�J���,ѝ�.�ݒ6�x,m!J�?��� +O��?���$�[F�M|@���380J�]��b�^��q��!ވ��,fM\�2��]Wʶ�UqK�����i�B}��Y�HҤ_%��o����5�O��W�����̸��񢔐��O��%R�k�L����!jy{�Io$(�'ClH��&���$�%���IfQ��mN�pM����$�2BZ� +���P ��)Ҟ�s�=�n#ڌ2��tŪ�h����1hNMa�f3sR����N���a��C��1,�36 +��K�5����e0��j��*`�� +��G11E٫�`�S�g�����~+�O�fz^��b�)K2��9s�G�1sӐ�����c��� 7_k*�ԘҐi��:�A�/�OL_��LoWU�P���Q����*�L��,Ch���>��rp:���>�i��B�z�eE6�l �r��1�M4侍��>'������d[�P�����JY�Ҫ��2� ��ܤ�W(��6u�y��8�Ɠu��E����^�W�(�6ҜN`g!�XK- �5?O�Y�=1#?��o�v����`�� ��UyvΟ���-R�%(�Z�B�e�“�LU��Q��ݭqZ>�8,�;9,?�y�™'ʝQxɷT��d�8��Gڳ�����X@~�*P`���ڢQ3a�6=�$��fb+ +rٲWZPėX}�5 +�� .k��a]��[׫m�]���NV�M�_j�UTXE� �gܤ:�![G������-^��]4�:��u����&���r�D�����i�י�;����� ^��Q%��k�}��j_�ooU��wj,��\�u��b�����3���^���w��Y� �G���r`���C��3��}Q�ye��1L��ȸ�f����nowKlE~���F�/zGn)\��)\��*ܮ6���,��x�2�Js�� ���KtNR�S��*�4~�$�'�����j�+텒�x|�Q䋃�7�q�2� ���t7���畖Kr�!Y�w���]���Q�{;Tiޣ�T�ď��Q�V"�_ <�3:�S �P��4v�������N���O�~%��npUF�Q9�F����X�Ҙ��l�Ri�r* ��J�$�?I���R���F�*Er�Ve���*�I�X�P�T!*��E9!�{�:��;)��`�Tҝu�i �/>���aB0�H�������1șld�B�Lf(�5�\Z��O N�$�I��2Cp�0��]<��^P�U� ���T��$ +�Q��S���o��&�7h"i4�L#�UOs��: ��{�\?��a0�G!=���p:c �0��66)�a �~nL�>���\�yT��Ɵ��3,� +ʦ0 �'�-Dk�$F��5O46�5"�eE� 8���H�pj�%�����&*.��TӨ(1�> +&������y�{������E��� +�9�^��٬Iθ�I���&9]h��Bm���^��]�u �KY�+Ǣ�V��w��dX�'���!-'�Y�0�����0������g#Y��T����:Ga�f)�r +�/�lV&�TƜ�Ҙ�Xe\*T�%�R�=PC_7f1�&��y�eVr���� ��d��ia���=�����H����>}��BR�8�Ο,��$�}�o�ɽ��X{�c?&�ؾ�c�~RĬ�v��yw��R�@�Դ���`5�G�Qk�׋�W�I%0��PCi4�K��+MA/�@�t C�c4b嘆HG�;r�X/us�������Rغv)�XH�k�����}/�q �;�z�8���x���@�M�i3_�pz"©G�3�*�ViDhe +B*"�r8�*Ǣk�$T͆U����[U}���V�<��B@_.��S}�YԞ�qp +5�Qod%0�0o��6 r'��Է�%�\:�+���2�A�v���k<]S��ʄ�e��Ue]#9K�@U�����{!�m����y�`<5��X:x�k���7A�z��>���RS0�\$1θل�y�Y��<�n&� �;��|�&�y@�/�a�����r`:}�@�����O��=@��@�A@w�:(�����_��h�ʹ�8C;��2na�oa�i�&o��-\�� ���?$O���9_H�g���F��W� � ���c��$��9�ϒ����j6@��Wz�BW6���.�Ao�������ʢw����^����Kr�����N`���'��N��f���nu�N�_����_�o��JV\Wp(y ��es̘|�A%��zp�v�ccp���>��&�7Vlc<�.=c6��$�z �=�0��8�����WO]� Թԩy��$�&ߓ��Bwp_��<�v�1=H"a�,h�`1���0肉�g�0�P�B �D�D�*N�@�#3I�"����2RN��N�@��I<�7���>F;~�v���[�.�vB���-�ӎx�J���d"���%����"��SB� ԩ�N 5j�{��q���|�˿�C�?��N��?D_/����b"���Od +�fRg>u�� �p6�Q��)����\s;SU�[��wh�W��p��}����+�\�D�� �Z��BӅ9 ����H^!����M�?Ө3����m��&�SǎXC56s�jn�ݸ�X|��8���%�:�U��j-�� �@o���X� �^�z��XH��o2�L�7�7�Z��3�����X� Ȧ� +��󸮥F5*p��hf,Nc<�Gi�a����& ���U�nO�G;���<#pW�� + .+���m�W��s�)hQ��窏pJ�'T98���Qu�KpH�nu5��uد9������:��P�#�"uO� +�v"©�A;����*<���h���?��p�{�}���X�N�!��pkg�I;��,��.V�U��OuEhЕ��u�]����.�)l�����m� +p�-/ XbEw�(�K�e��*\�y�>'���Y@*������o�1���zuAS�;hv�cG�bl ^��;�C�Q� ��T�6`s�Ql +���n?J�p!���!�� "���'��,��Y��<���8�}�h�HBm����cj"G�:r<�Q�Q�ʣ>Ħ� l�Z��D����B�4z�T픊��51n�(�T{G�����UHOi�c�{��W����T^o}�kd4�h��g7��P���i�h�2�X8 Pbxņ���iuB�T��#�'�I��b9/a��2a��"a���xF�q�-EN�cEv���:Y��=��k�=ן��@�|��U���߶�^p�Ħ�X��cBI�Xc�զQ�7���4QZe���k�!�0}$-3-����r��P�e*S,1mU,65*�N*$�Pf�)盅"���J��C�ơ�q�s5�����>��}{`�%v��,iȵ��2��j/e[&IK-��Ŗ兖 y�%[�a�)�-%�y�j�ť��e�y���ޙ{D �K] �q�D�pFf`��f�����D� +5.�K�q-�5z�X��Tk��Ĝ4�mz�5m<96ij4Iۓd�1��w�=�<��������/�*�&~,�$~#�$����h���������he��3x��9[/ ���)�I?-�8�7��`�s�l�ِ' �|�z�e�m�A6�G�#�����ulI�����1kLs�lJF�ɄU&��3-���X,V��U�ZM��I[a�(�w�c��m<�+1�Vl� y�+6��"SH"���?�7�w��g����:x��u�H?6�#��<M�Xm�E�%��4�X2�E�Z� +�S,7{�2� +�ۼZ[b~^*6o�]���B�e�Ka�?�����L�K�^��Z�e��}%�s����4���k�ah�E��I�٦���*��t�۲�m�Pj+Kl�b�ͫq���ֵR�u�l�����:��l�sm�/�Ԭ��k�Cz�����u��]˸9��D�q-빮�l-�#Q���W�� +eʔ$�#J�L�HY"8�X���r�]���+~)W�$/U~��Q��)ʅpEy'<[���!�����܃�Y����ż�1t7����|�ۊ��Q��B��Ru&����T��@�j���:�\�L��5��IRԀ�Xݭ�R��Y���Vx��O^��YՐL��ܢߗ�u���J��@�o�/��K�} J�#Pd��c:�9��p��HG�#KP���X&.q�5َ�,G��jo�2�;u���q.,�q3l��>�����P/�����^����0GO�4l��^\N�G�V� G�3 +���w>�<�\��$丌X���]9�b�C��J�L�Wcq�Ҧ�6H&g�ltҥ�^ե���Ou��o�4gH꣰�+y|'��{������X���[�rz��TB^i$��1�qO�➉ŞdyRa�X���,�|!�S$.�T�FO�&ͽNkpo�R�r�����F��I��II��>�KB�^ޠg�S�@-��H �z��������dW BV�HX+' �; �<��)XTe��ʆ�U��VU(�eb��NL��,�n�����{OKqޫ�)��ڸʐ6��'.��S�8\�>����8��4�ʕ�] �\��n� ��~�OF�o ��}�H�Y��S��s >�����Ź�͚پ����S�X�[�����hb�B��ڟ8�t������f`���5� ���|?`�� �4Hn���X�< �S1�?��$��0�o�.f��0��f��i�������8�Y���c��c� �1������Q����u@�fύ�C PD�3I&s[�1�ef��ƌ�hLo��i�q�ڪ�3�fL (�(@L�с<؈ �=x*�)����`|�W�� �~���K����wQ{s+=��o�^�[��6 �Q1�L�Lj��ۢ0�m,&�M�S�X<���`*�30���`1Fk��Z��ن�;�aX�"��FԎG�=�a��֐��Q��e�۩�B�F�T'������%`�^ v�����>�ۣ0�} �ڣ1�}�t�'i���;w,Ǡ�F �؂�� h?���[?���C����AzdݛX�'�$��b��_f�1G�� D��qrº����+RW,�] �Lz?�] �� ��|��d8pa�D8�vs ��0��C���K77[7E.�� ̹��3_�oI���}�^��3��v�i=�E�W��G���A�� �a�:-��Dr�:���0������� 3�G�_�l�����]�B���G�>Z�{#=�`��7����ԧ�_�_�� D�Q��ԾI�@�!�j����{����r ��a�C�я =��aO�p��a���Ȟߓ{��G{]E� Y�bj���٬5����{�����#����|D�c��1=�GO>�g`�|C �x���/y�=dO��4�� r��j��b��E �20�*��;���o����!���"\>�'u�g�_���K�H����2�������kDT��} ** ��EZ��n��nh���YDQ�A@����B"2��b�M0�1��rRV&N�RV��8ff\*5qܢo~�T�����������{�=缤O~���ld�!�H����u��'3�en�����D���ٍ��^ӉYD���d��d�"�d3�Av����t�S�"�oq?���x�W���?���"� ����~� �1� 1�t�K����l�F3�`'5ڨq�s�s��g�#>��mj� O9z�<&�ȿ�?�eg7�N��&��qd�OT�@���E�ꬤF5j8s#5�P��{8g;���V��!}��i�_2�:���2����G;C5��ķQĝL%��_AԌ�3�s�Ө�C�Bj��F%5j��H�-������_�'�Q�B/��/��}� �M�oq�~�$7� � �/D��Ác� ��9}�r]*|=�c\| ur�QD�UԨ�F-5>��V���9��w�d4��o鋫��˴�����wi0Z�"��6�;ٙ0�eG'�\�;�k���B��q�5��J�N&gͣ��p �y]U� +��D���h���9��Y��ВS��G|��kw�ql���C�y�e������Æ��o$O�^17�����x� ��Ұ,\p��9�b�u,Ǚ�U85|z�6�S �9�G��#�qGF^��Qߠ��1�]�� s�h��!ȓ�����x吻|��!�+�ȍ��p�y~���.����)�D�pM�1�lt�-C�[ :����jt�mD��6to��O���$�x��m���}��qo�c<��6�WL7OfRߛ�7�0L.Ot�%wW􎝆��|�=^�� ��������}��`��M.Ů�k�:�-S��cJ �O9��S��y�l�v M�=D��+4x�B� y�4�����������O3 ��: +]�&��s6L���*���g��sf2�ϴa��R4{b�W��*��U��Y[Q?k�P7�S���+��}]��s_���\��u��S^���}�)����ZO.���;���v{{b��s��%�}4h�1��' >Vl��D�oj|�P�[�*��B�o��ηUX3��P>�G\=��X6rޏb�|Y,y�P<��\��{-��]�~�t���S��\ `�*�a�R��J=ʔ�X�LA�Ҏ"e��BY$,W� ˔�b�r����+-]�--YtI��#e?!��,�C�G�߈.1��0�vƲ�1-Zָ��.� U�c�6��C}P�U�T:��(P��L��y!E��_H�����^����X���<�j����#5Y�%� �`J�c�/bS`H �����D[��ZӅ(�RAc-"�Ub�u����B�Ǥ��+Rp�R��9����_���P�p��|� l6� +� iG}�dc͝> +1�c��x����@k[�H��b���[f�B�+��:q��#1��&.��헥��{R���h��2�q��<��3I��+�s��#k��v���x�a�>�Y�=�D��lvBP&-~�����,�"d���%�Ğ�X��VjI �5bԴ�c�1�Z�i�C��vZ3�\��o�1\r�{��y��{����lb�>Kz �4&�Vq�.�]#�4"!R�hX�0�&>������'����dӀ��~��M}��̽������5G%]3G%>4G%��V��hd���e�T��>` + 3��8�E<�gTJ�&;iH��bR�48%LS�h@j����T����6Q}Ҧ+:m��Ҳ����+���3m�),�)t�USh�Sh��d���Ar�Cc#����˰ Js��z��2������gکO��zguStV������_ٱ +ώS�� +˙�М��SP�E9k�S+��c�͹,�����2L����/���R��X�ݲ|އB���}��0�� ����f�8*��]A� +, V@a�� ��Zƨ�e�|,3�mIU7�"u����e�<-��\�Ga�<�X������|�"i z˗З�Q�bjP"M�1+�X� a��F�J�Ե�C]J}�U"ϲ(y� �{�H����k��r)O�sy��)/�S�f9��C�y9�~#ǒ�r*az.nc[5(�X��hda �V�>���c�F�g��W�A+%��r�:���!����-;k�l�q�l}Q�3dcMW���2U�P�� +#[y��L���@��^�R�E7�_W�?7Hq�؃�R�)`+�5�o�k��Tg/S�� |�!��adg,���@���PՑX��uw\ ����xº2�����s���/���)k�S +܍>i��ޖl�oaHa1��~R=Ci}_�CP ������o���,^�Ç���<�OXI�-�A� ��Gh�Foz�<�^�Òs�dwT2G��vN�I�8E�a�g0?�:Ǚg +�hrM�@-�H���| -�����/�:'������֣��?����<ŕ�l�d�l��l����j֟��%��hMFg&����9��G�E�q\#���d������G��(�+t��|�+e���`؛�����=�vE��Hr��sh�@���:s��t4���C����j�Q�N�F�i-��9�c�֋]DN��g:�Й�C�GaoA:���N:K�(g�Jm�5���b>���i��-m��P՝ U��|�Ǵ�����U�����l';���c��WC�(����N�z��M����=�~W��O���2��|�u{�7W��� �?w1Ԅ��Z��Y�����?T�}�40VE�q* ����� zM �f*7h��+;8WY�E�Y�y!��GsC�+-��)%�)��a��_�ڸŵ7�+x(��0fl�#Yi�k�͊P- ��%,@�=#��� ����^���+e�O���iJ�WZx�R#2�Q���>�����_� +h- Z�E%�Hy!�@$� �$�BТm����������N�!��Z��ҭ�͵{������3��n�u;�֞vN�Z���!�~��>��Ͻ��`͊�O= �S��&��'�,V�� iw���$���uL�s�������0��^5���K>[R��)�G{Z +6�g�-=��X�a�ڌ +��pŸQ�� ?|�mX�� �� +o�^��:"�Y�D��X��\�f�!��U<ຒ�����X�`�d?���|���lΞ���H�)�E�k�Ӱ:;�9:�rLh�)GCN�9u�����]���Q��-\ʰ�Q�j�IY��̡�T�P/*IT�80��Tf�?گ>����8�b팣E�5�yhV-�O� j���� Q��`e��<�y ��[���v���&*�w ��_�4#2��]Y��&��H�4c�O�79��rZM;렂��Ʊ�� �_3��9�j���&c�6.�N��:�t�p�Q�����æ_/��'EY�QZ�'� �̆wd%��["�G���+�� ���?X�u ;i����& }6��0�(��Ӱ�9�lT4� +a+,����ƕ(5�`1��h�(.z^��ɊLC2�iTVh�#��H��Ec�[L��y�B�~'���Z$[��s���8ܦIp�f��� +�b�L�a5e��X���X��0��QR�Bq�*�[`4����(0z�Od:�y���c���/"ɴfI�����J�G�=L+���s�����3���Y&Pa����0�J�R� si:�K�0��PTf��̊��ʽЗ?]y��X���}"�z\�lo�T����Be��(����me-�r��A/�{"�z`-���]c,�M���b{,��KQhO������|�+��U�A[Y��J�*WC]���[�:��l�1�p�YU�D��+~����g9��� ۀ}M���.�G}\��fN*Kq�C0TGB_]�"hj�!�&y5*��P9�P:+��Z�lW3� �tu� W�H�=*�gDj�U�O!wIB��F���s�/Qw�Z��ǀ'Ɇ5�y���0�(�Ȑ_�{��8���C��A�G�L� �V��;�V߈��Vx��2oR�/#�{Z$y� ���H��D�G��qK�U��(���=�C�$ �s[�*�e^ �O�o*2}QH��GZ�"țR�ڔ�M*,o6`Y���UHj�"ѿK�[�'���?�����m$4�CB���$�!�s����;ڹ��'�Z�g��[#cR3��� Hi�@R�$��bi�,i]�G[Xܪ��� ;�u� �Fl� �1��1m�an�%� �¼��"�EB̺1�q�}����~��ux��@��s `�3]�9 �;�v<���Y�휋G:㱠3�;���ż�-������� !2x��Ø�����cf�0k��}6J���s��l���O�\�<�N�DI�d �%s��"*���\���$�����1#d���SC-�ڊɡ=��}��c�ӟ��1�K��mc�q��[���g���<؎U�`�4�� �H�v��f�'`Z� L���p &� �4Ba�����{y�����,�0�`=��z��� +�bc��'.���.��v7u7R�j��#%L-[J������pm�c�r�����6��0��%&^��J�����I$�"��|�H���L����8��x˥^ȩ�I �@����@ ��\*""^��b�2T@�W=j��>gm��t��]�3�6�v[�����N��vݦs����T��|�?D�~���;��K �N�H�#�H3i#ϑm���%��1|�I�1��G,�C�����y�|G���3��y~�g_2��)ѐ,�O��"Ưg�F����Cld���b���O��aj��W�L����#��>��[_0���o�6��9�aOƒ #5 &�$�dP/�:jT�ι_������72~�w1�N.�~�v�p���:��k��ߤ��0ڍ>$�����%����q��αRg�r��r��a�ga��������oj�^ԓ2�4j������Z����}\�� �q�>���)t�vpg���p/�/^�_ğY�op�j�G�7�0������8����=]���O͙x�ԓ3��I�<�87+]J�j��bf�@�F�Rc�n�)����C���\�v�V��{�k�4���W��y�? ��C~9��wy�D��)�B�8�%3���/ D����Q���U��^���j���M��]c:�u�t�=���'�y�e����&���I���-`�S<��m^i���:����?_��� ���|px\L��މR윤B��=�Vt�8��ǃN�2t�T�9�%h�]�g}���w6�vc��>��G����c���h�"���x^�Q��y����1��H���}^����Y�:9?�"��56�qj66Lub�TZ��GK�B<�kW�)hVub�]X1����e��G��;���Kf ?�6��I�:�����E1g ~��s�7ڧ�mF���eV +����5�f4�`Up>V�.���X6��!�QҌ%!�X�5���0�<�_Eu�g��x���G|L�w�� +��d*g>�� �I��ǚl���)X>�#��"B���T�GP����\,�S�Es�a�jTϭC��FT�mCyT�G@Y�̋ �Q�o� +O��}�����؂ձ�!�|�u� iKd�煕Q~X=u1���cQl2�jPkDe� qN̏�,���Q��⟠H�n� (��D�� +�•���>��.S�L� �>{H�h��%��kS'�F�$ $���Ơ\*C�4� z�$d�(�OB܉�(L\�|�2�d�p�:���F��8�7`O�9I�a�0��x��'29g��I���i�gk譞>�'�B>e�`���H!�[��B��IF��lp&9�H*F^r%��K����)��)w"KyU�Ȣ��(S���`����n�:ظv`�`볎>V�G-}�+Ǣ$��t(#�R����#O� +�J��٪\�Rݰ��#+���F���¤�QsD��yUd�� _Ad����s����6x�����:�ْ�>�����(�}�T"O +�:��X5)�h�ĄLm6����KaL�A�n��6�tۑ�? ���Hc�N�A�F?�V'�.�����w��/����Z�����d=�����F�.V}0,�9�ԋa�+`ԧ!Ð�� +}����Bk\�q=�L�H5��|Q�4@�A�4 "� F��'��Aj?�xK1�#�MQ��2�����g��L�d�L3�a��� �Y�t� +Z��L ԙyH�!�RU�2�d�"9k����^���>d�{|~y�0���B�c�{?�wp$�(�^ �J��5�ř��i���� h�!Pۢ�f�"Ֆ U��lR��H�qC�Sy�R���H�o�Ծ��s�G�Bl�$v��a�3�#�{/u�+9�Tq/𹼜��<����\z1:EP�yC����YH΋D�# +�rGd� $:m�:�!q�A�E�k-b]����g��|A#�% �9�i�?��wQ{�"��>�9*V�K!G���%�=�B$��A��� �;��y�� ��@TQ ��`NQ#"�7#�xŠO!��m�9B�!�H@���+9Κ�~/�;9�_ +4��s]�QQXW�e�ueߑE�=�-����fQ�(̸ �`T 0q�8Q�U bզ�A�lVMM�`L�6{b�CRc4�h�������o���w��{ xm�c�b-��fJ�M�`�P��W��`Ř��Ք�hSE�(�4\������l�dZ��R��[��_����yE�`��o�جloCk�i�Y�Χ6B��}�3�U�XO�|)�uF�(<�K�9]�����$*0��r��?w��rS�%/C�y���{I�y�dȫ�W�{�̻$C�2�0M�icv�E�F����C ���������]o�Ǻ����*_���c��%N�Ӑ$O��,�L�[��f)��e�\,{�d����39�oɥ�.�����߸H�\�y`[���t�C��H�HokG�[��j�V'k�\��r�v����:Z��u��$��M�ℵ�D� ���\���C��-i��`�|91��]%�^&*����YH�h�r���U6/�֙ 4>6����V��vЫ�� +�dά<Ȇ3D��$��ͭl��J��a�b��WS�2��m�zAWڄ�f�_��0'��xn����i�]�'� �)�vba'��l�uPC!d��|�R��[Y���p�����1�5��6��v)��4�0���wIw���v��j�Q�:jXG ��.@�Z.�Z�}-����K��b�����na�14���,��tt���N_tb������\�K���K��3�4@ o�/u��a���h�j�!j�6p��EN�c��$\bq�'-%��r?�= ��k�g�Y,zA����&Z������@��q��.�I����X��4i�Á=9]l�i��x��3�o�'3���#MF{���-� ~FK.�w�uN�Đ��v>Q�@$M1p2 u��1(}��\�����4�׸���7qț|�m‘��3�}�l�d���I�ƿ�>_{�[4�Ү�)���y�W�P(]���%| ��[��6��]?�>��F���C��#�c6�1��q��F�./�l�~ �`0��)`�(�b��J��zآ���~d�|����i�s���Y�;}�/���\��p�e�d��Z� ���AwH�0���Ŵ��}��k1�˰_�}�������-�� �:��5���5�u�]�|g��u N������|�OC���x���̹7T�} �c� ��ضa{�.0��.�S���0��I� ����v͏�C8 �Zנ������"�ZI�J��a/`߈����"ih�~1���/Ƕ �����\M��?��Ч<~���b*-��a8�k�7刦��NƠ��A�Bc")��}�gc��f�cߪ���^��N�������*�ȎSD�2����P�-�T+�nK�K���_�������ϡ1�L���4ʓI�g�#?��EhX�����rc�;Y�v��O^�Ö�}�5��1%�;J�U���<�f �ȋc��Q���?=�IBg~�E#�ih���4�S�N1�ehTh���oֱ�5���HUD���R�n�|O��FI���7�c]O�;�99(o4�ыկٓ���p�>�h���i�#:���cFg1v��՜\;��� ke��ҧ.���]�:6k �8�q�W:Dy��{�+�e���Pvw9��]�� �Ƨ�im��Z�q��G��i�V9�h�s�V8��s��\ +��e�J]�*�T��N���u���A�2�_T��=z6k�\F�����X�ᷔ��a�w��͆����SUn�Z��=�̣����U�9R%���3E���i��I�� �*4,�\�J�hX�|���~C9>�5��f��Sv��Vf�s������p��N����_Fъp��uQ��������7N :���s���<�y]Fin��*�KU��t��ei�_�f���,�e� +X���m2�Wz�J:��w4#������^o�c��Z�ן��཭���R�$��x�(0@s����]��}5'd�f� Ӭ��� MVF�TCӕ6[3� +5=|���W���F�jJ�Q�F~��Q�59����6>���h@ h;��3�bʹvK��|�� �]9�ʎ UVd�2���1��fF ֌��=Vi�)�=MS�f)�k�Rb�5)�\c7+9�Z��h|�����qݚy�����}�;����`s�آ����#;�E�Xo��jz\���kj|M�V��*%~�&u���nS5��Q�r5.a��t_���7�W=�hTb�F&6jd�ѳ����m�/��u���T@T@S���2� 0 �]`H�䲨1� `y� ^�K$�Zf*h�Y�)=�Zֶɶ�v�:��k%�ִܓ����������?>����y��}��}��˚���ƎL���}%q4�bb\9\�0� �-�_E��U����G$+7ª��\eGڔY��Q5ʌ��5�E���J��Tjl�,����5����?N����ܛEr��a #NJ �+�� q��-z� +��)?z�r������X͎1*#&U��,��*-ήԸjY���R)��JNإ���2%�Șx~��)S�'��F�N��m���[�q8���8�G��E9�^�2LT�a���J3D)Ր KB�� �JI,Pr�\%ͪ�iV���'4˸Q���2�ː���.���;����?�^���b���9�1�1�A��a�a�V٦�0�Q��G����%#�d��ɔ$cR�f%�*1�D ɏȐR���fř��E[*��| w��)�<@75؇�����~��gא�2jSH�d����d�8�̓d4*�����yS~�N�C@�S�K��o���ޖt/��*z�XlȤ,bI&�X�P�,��cR4Q�E +*����(M+N���T���V�)� +M�-Ճ%�4��CJ�ɧ䔼K>�yC�6�&35‹���JzY��Q΅Zz-����X҉oya�+�>J��+�)��5��I�0=h��D{�&�3�SV$��_V�q�Ojly����ʳ��<��˳�:8�e� ��,�\��~Zʹ�4\�S����H�l�2�y1�����!�P�&�JO���ոJ?�� �HyU%ʳ*Uc���Qe�{�"��n�[�F�V�KիU��F.�w�Z����V�mh�Ƞ�F΅ǩ����zr@L���I�����1Z�(7�T�:B���(G�F�e遺 ����: ;л��X�_�m�Qg?��ߎ�����I�~%g#��=R��b����|J�� c��ʥ�UÛйM�����\��\<�l�F +�H��-4���9xp�!̖�bhpj+�ވ�V���Jx���m�H25��?��F���5 �m [m �m�����%��E��%��fn��WS��,b5:��.�_B�冴��O;�o-�W��e�9�7�6q&m��OI�0|�3.O� �o�v� 0�na�`���� .��6t�#|NA��������s4�5�{��|��w9>k�1��>$mI���g�iໝ�S�Q;�v���M��G'��$]���0�P���`�C@�uQ�N w�����+ +}��|7���[ً���O +�FwJ�]��#y�‘���PR���������a�#> eԥ�8� ��t����4v7����1�q�z��j��iW|?�-/҃� +܏�W�O���1xN��A^�S�I�AN�$'g����R��,�Y�����h��m���y���׵�u/`ͅ�3�5�b���%��Ұ��>�Z���� ҅�\��Opn��!���p�8>c���"5�ec���,�ý�K��K�f+�ų�`�����ߐ������o���O�!|����z�-�Kp��\uC�ѫ�� �7Rn�Wos�ܦ��Hv���;��;� ������PeP h�fh��(�M����EyEև������b�7:󺮢g�����Kp>���5�HCax�$�q`�\,<���u}��[���rl��w�q�8�%�����̾F^F)^Bg~I� A��gX�>�?�Y�u ��!�y�aM���Z�������`{!��`{9��)E ����h̏Q����h�;�:��.�i�o�f��p^��'Ѻ�7/}���J3�G�����~1�`�9U�~ YKm�@k6Ӣ?�ڵzGOѺ��ѩ�l�S��$�8A�Q�n<��r_ w�_pY�X�;�|�r�"𓈏4���-��"el� +ֱ���c� ��X�:V;�؎��t����^��*ׅ����5��h���� 9���$���� V,�a߆};�plՐ�Z|�� �-�]�����ɳ|k������yF�;l�ݘ؀���m����@��an_�L �b ���-��M�&k��k�^�5�SWU�v��6Ҥj�Ti�ViӤ�ݴn��U�NC�����}�>�}��}.Wy����%z�"Y/��_{�O�b> +ۻ��3>wi���J>EOOUE79��𓣛}��!\��+�q�~��F�6��e�������;K �0������"�W���ҽ����M�y���ޑ��`���H�R���sxx/Yڱ�8]����c�~9��X�ze Tt����OҢ���Q�B|�������c��29w��x�z�����8�-��R�L��Sγ�hqy��i'Ooi=�l�f�f1����s�� ����c�`4�!F�?�јop4V��c�:��W�y,=��|��`oŔ>1 ���D�`1*��u���`6Ǝ��jL�z��a"Ώ�n��h�F�0�pC L��Ò{��_����CI"����%�M��{�M���l���b�dK� ��II�%�LTc,Q�cI%�:0,�APڀ!i �H;0 �E�l�dcds�I^Ew�Ut����m�DG����{+�3����w��L��YfV �3�7C;���1"�#���#) ��/ՆC����Гք�6t�w�`z?:�G�Ϙ��2�іy�Yw��z ^�ω?�9�B��� x��6`���u��Kl�fi�q�'���L)�� �(��R�‚@v9��N�g�Ѧ��U�G��ޜ!4�L���E4�?��-x�o��� �s�@���Ïy����<����m��6���6(dᜡgm�G�J��*�*%��������V�@n �rјۊ��.���> u��Q��D��\���,��� Nݿ��{x�m����t�M���c[:�o���C�x�hd�j2q@�F�V�� �� �Z'� +ܨ-�Z�K�g�1TΡR��av�+(7~@�����N<��_&�-7p�%~�X�� �R�ud�� �h,L�G��z}j�T�p�p�2Ԣ�؄ +c;E즣(3�@�y6�uX-/���>��K�%�"�Y�����=r�`�w����p�s���:���T�:��&9�&*M�p� a7�Qn.C�ŅRKl�m����$��iX�ga�]�������GQ��"��}op�K�c�m�*q�-�$� RG7u�2V<�U�5� �� �Y��f��j-B�͆b[,�n�K}0�u��l�� ���ۯ@g��Ǐ�u���W�9D�($^#�/c������H0�u���G'}�c��1f����I(���خ�ٞ�݀"G � ��W4��2]� +�&��ZB���w��|j�'���,r�����P֊�&�E��&�.w��m� �� l��i�&��I�X9���㡭�BS�����5�u�v۠�T!���ӆ�^(F��p +��Ho����"��!R�䳈�=�%��.p$[;��x���u��w��I�������E덂�99�r(���ݬ�«C�ׂL���:��|H�u!�7 y�I$�lB�r Җ�Hl�I-_�Y�̷�۴���?7�7��s,� ����i��jڥ�Z �Qn Y�8���H��!ů�ܟ�d�2��pA�ф��;! � !����3� ����O��q�F�_|�g��|���Af�Y��㼓#��VA}�FK=J�}� io{eD$� + B� � +� +D ��!L`���0���!J���{��e7�#b�ɽ6ɼ0�X�a,L�|�q��zJ�] PSSm$;���8D'!b8�� +��-,F�I>� d0�� �1�y7ȹf����{���5�"�Iq�[�\9 ���N�����98���|���_%~ �/ .�) ._��\Z�!�,8 ]�u'0���B(5w�N�� �FO3��朜�>��d�P�g���<��Y �]��qp���8�����{��N���!d�†�Թ�^Z��>\Ҥ���}j�Ct����r�t��\�\�ȯ�k������K����8D�??8{=�<��<����w��rx\��O� ��&5�y�� v����h�}���q�����-� t=��!��� P F�j0��ؔ��f�/���T�d���V� [�=��v�]�������K�u�_}��K�7�펝ץc��+� XA��S����Z�Qvg�+t�B����-��l�7�?c�k�n���c��g�����X����>Nth���o����+|�������+{n�* ��^�k踂�?��t\B�{l��u�m���29�wt�t��"w�7�1p�����y�����G\Vx��塿ۏa� +��]��x:� �k %��^��i op���tDoq�>!;�p�(cv;���i�� �w��|��-�8�8,����~>^���rlWa���د�����@�Z�=ZA�X�f8Z��_m&:-D���`�k�wp~ >s�������z�K?�"��'f)X��~�v�c��N^��F[4E��т�&tl�2����!'���*,4�2�"�^��q�6�Q{�r��ר���_\1�a�#b��P Gcᨆc2��p���Ӝ����.E����(>���;�����F��v��f��|��¤��n�� ���3�a#<�H�#�8�� � +-F�"t��)��r�k�K��w�մ���Z�)�e��Z���T�m�j�����KU�}�*{lVEσ��F�]W��=�x������2���u�ndy>�у�����n����Oun�5�W�&��h�{�j�3T힫qCU�1Bc=�U�9^�=���� �y.R��J�x�h���~K��m*�*�qt��S��>T�g���Y�B�*�ݨ|�V �{Sy�+�����0w^����s�6�|���;��:rT� +?O���j�_�J�#5�ߤb�*ꛪa}sT�w��+?�\C���o�������50h���v++��2��*3䞲B��#����u �� j��v��}��L��$7���T��A* 2� (F����588C�B)7�P9!���_���)� ��t�2�1����RJ�q%�ڕ���P +x�w�ۜC�^_��������IqD7��g�� C�"���De��(#<[���J��Ԉ +�DNRR�l٣���Z�w�}L֘K�p(щCp��`�<�9���k6��d>��F�B��r�<��̨~J�2(-*F)Q�J��+):C����� ׀�r%���j���"�ǭ�ٴ]&��gzWq��2����}���6��1�d�Z�ʧyo":*�1CБ�T������Cd3F*�'k\���T%��b.T��L��j���e�<�XK�b�*:ᨢ�����::��P+�������֣yé�Ԡ�E�� r�f�.��S�_%Xe���l��)!Aq Ɋ�f�h-Plb���)j���@��۶�`?�P���-^;�m�&�-�¸������z��8Z��2>�΁�kJJ%�����������Q��C�|�`jK0��~�a||��}�X�z�f��X��d/�,`0��o��JfJ�j��_5����� ���� �T��E�� +�WQ�%+@3��T.¤Vބ�;@_K�ڕ|VK���H� ���F�7�D`a��Lr��_hvȣ�<ȣ�<i���F�F6�w������h �e�s-��*�*���1��2eX�I��3b3I��s�m2���Q�"@�z�cn^��N�VN�����$��)�I&��O���/\�T �yp��ײ��� ~ ����h�� +x �Nw� 8 ^o�7h�:9Ϛ��Q�L3xm\���|�p�Z��+��>V�4�X�9�np�� 9����� +���%p��b]7������9��E�|�F�k�.��=tq��ߣp_��� ~ @�z�! 8�d� +�%8�b&q�O����,��� �7�G���;��[�s}���F7�}�#8��>��oD�X��׏x�o��b����E�.!�}F���'��W\�G��8�?#���} +y 7{�//�x���8x�����B�/��?���x��x��d!�]ʥ?��8 +��J�q�q`��2ϓ�9�cʚ��v鷈�uX���i�<��^�^G����~_�[��'22�8}@-��1/i��� ��z�]@�"b�#v9�1��:�:f�)d�̲�%�8 �)=�`��A��}`7x�#vL*%����x[f���E�A�>���N�lb��=��Ӊ�e��2��į�~�xV�a��v�];a�A-����63ڧam��F�n�f����:��i�y�Z�G����1��c�W6�����!~>�g��b��E,C� ������%�F��3��QV��Xn��8ױ�wl=���>t� ��3�m�I����B�6�wh=�X�)p��1�b8�{�V� ��e5�����YЕ(�އq#�%��Y�/��>�`�ݍ.��F�(��$�� �p< +G + 68��jȣZӴ�<�G�� ���UJ�\ #��J��7�a�́{6h�^b{?�v�[�!�{8v������ +!J$�����D� �@�2�-D�ʂ� �x�P���W���`��k�,@9��G�Y?�[�ԟ��0G�^��m���8r�К��.5~a��_\����0�A� ��O:�YT� W*�N���.g���d �m�$�VM�{Mn�+rޓ+����}�GXo|/������D�A]�U�9fy�;kf��T�W���5-h�r�,�lSN�C��ݚ�;d�\�%��X� ��mh�#��aǕ~I�w���w��[��~�8����:Z�ڲ��E�7*H��Fy�b�����=41��\��� �T�3f(�8NY�ɲGNWfd�2"+�Y���&YM��j:.��,�/��>R�+�ц��hkk����nт�ҖQ�|�k�9T�(�ƛ�m�,S/�M���y�2̣d3[�n������\�F)%f��ĬШ���W#�^��w�h� ����8��ӂ�%m�h���Y�� y>��̠NSi���kTF��.���+�_���l#� 0 3�ΰ�l +(0.�D4D�wq�;hc��9�&٬i�&VLlk��XS�i�&=i��Zcܲ��U�t�����=�����}����kPq�QE!� ��0ԩ��,��+7l�F��SNx����1W�UJ3nU��K)��rF�7�r+%�.^��nr���n-d������߂Y?=N���#�_<&0��ҧz����s�+&�OQA���1#RV�g&),3]�Y� +�*հ�I2d�Pp�<�(0�C9��?�(8/���<39����A�M��֪��l�Ti&�Sy?����;�pM�gq�$*��r�kPHn����Ȑ����P`~���˿�̖�qHA�>+��#�C *�B� ܼg������9���G0���s%\*��(��E��Y�X�'bt��T���P%�b���_q������q�-��OI��,W����Wҍ�1 %���g����حN�ՠ�:iV�4��x� ���i�|��U<}��/!㤀�A�+ Р2�|ˌ�)�h`y�����r�\�r�Y�X +0�嘵r�CƠ�S�W��.j�B�����豉��4��/Ɩd�%���ӛ B�M������� +��0wE�=�\�.�BD.���"��c'1!Mdb���6��1�;��-s8��K�pG`O+y�ɇK*�����a�@ȡ3$�x�� �\� �\�5\t5\@5��д��!`u+�-M�_M;��"88Lu�m6{�������&P���\����� �U ����jb�ib�h�[6ҋ�P����@/�D��G=������l�����y�C�2�����D��-�\X�:���` +���X������X�� G}�� ��3�5ã9p�5��X�ᲈ�XĢ.$��ml|��|��<���[\ +nm ��5��ʡ]�ֱ@!H]/Y���@� &���� +�Vx�ҏVx�£���%����R�Z��q.|�j&�UL�+q4+�ZO�X�9Hf�F$�|�6K[����w+�(����݋����� �<����� d۹x���vzю��(���8�r�96����5�]@�:r��;zgA���K2>A�������b{����婋�t��} ����A=�=�=���u�h� �$߽���V3u�"o%9Kɓ���FbvI9V�������#�=� u̐�ǜ�c@E�?e�b(�E���a.�^z����C�U�>_��Z�>�QA�\�%!��Կ_p���5��5AG���y�1�~ ���[��/� g����?�>�q��&8Ǣ�%�Yzq����]��9@��"g �5�7��<Ǽ�=f�/΀w�9�Q|P���5�X������r���*�����.�S� �8��y����P  ��q������-��M\�׸��p@�E~��_�).�: x�~B�>�G����"Q���U�mp�����A0�ҷ���x̯5��c�=��U���� �K��+<.�$���;�?�1?R�>@��k?���e�����έ��x� +^�?ni 5�3|�5��ezqA#�_L� +�^.��{�8 �3��w𗿂���8�#=�C=��:�n$�2���y�?t�,���Y��?8��Vr�����E�r�?�أ��8�G��:�rX���D���^��]M���2m���~��A�馲.�= ��ݠ���&�救GZ���q�+��YȑL�LV���8��D�D��RK�������X�%�_�"6�c�v�v'���i�P�6Դ���l_����+u��:�~��G-rE�.9�Ϣ�B��1į �D�W��c��� Ğ�2� ���Y�N���y: �߰Z_j%yWx�=�19��v�-����{�E'{�Cf�$��I�l��q��1��� �B�jrԑ��d�kL����7���6�`0`n&&`CbH'@B(�HB���[Fi.�K���@�%Y�e (m�fi�6AZ�N]5mӺ}��m�6MӦM۪}ؤj�ڥ�4�G.S� =z�?��y�9�9��『�w f�� �8�����$7e�l�{�W��('ߡܿ�$x�q���Ö����8��� ��1Ua�#��f<ߦg��3�q;�������cX5�#Df��=��� ��M��S��w)��h5�����졅p�$v1�i�L.x +8K)gY�B�D�i���m��`��� ��$���]v��>N�K<��n���'���2LY�%u )tY��='�e��*�����\v/��q~J����� �M5�+ɢmI�ښ�Q{r�ڒ˵9%�M)aES՜USj�6���1m�"��Z�~D� ��XR(�j ?R��/�1~ +b����:m�:r�"8��+GS ����I�ږ��V�QQ�U��6��`(V��B�Z�7֫޸Qu�6�Mݪ5�R�i��3)�yNU� +��V��UX>T��3S�����KH������'�bCط��E��ȓ&K�"�L�3�Tg�U�\�Z�_5���ZjUm�(h���ک��_��Q�gͪ,��m�Ub{S�����g;>S�#�{Lo��&����Yg����{���(�C$;I!�Qk�,��ek�ͭ*[�*m媰W��^�2G�J[���SI����3�9O�Q��sWޜ��������w��6� �%��3���3�Icu�KZ~vl�F9�{��IW�3S�N�ʜ.���*��8'�"WH>�涩 �G�y���v?�<�U���ʬ����Q�5�`� �Q�)-����[J��&���R��Vj0������vƟ^�Dw��;�X҃][�K> �'������d�MSf�I��,kr@� ��ʨ�Vz(��P�RB=J +)1<����G�C��F%��-Ÿ*.����E8O#��wr'E�Xw3�n�y~i��jl���q0:�R��ި���F���()R��H��#��k�����/��-�� � �+`ތ���Y���tdw�������SN�����0��u�R�;���Hfb��M ���~f�/��w����_�ዾ�K�����ax������ e����"�'q�!�a$�|�:�xĞ�qb�M���G�#���a���{i�{�s��p�� �m�x �A��Y�2`��͐���ѐb: � �}�0q8�k�]��A�(�n��bL4�n"�L���vLa�vL"�&i0��b�K4A<&��?åC)�{������1���ǎJ���w�� ցJ���9�>������c;�c�ܘ������ɋ9.��?7Fҳ���B���_H�������x| +�:;_ ���U�:G;0�������\|��H��v,b�b��,R�(2 $�y{��8G^��~��;��?��o��س�Ei㗩���W��H*�_��%p p ��Ǎ' 67��%�X�,�e +�2�X&��8�ҫ��>_{���Ŵn���a�"�r܄���*�_��a� �|n]������M�>�g�V�c�B~�P�W�� +I��ʊt�����9c/g�g�TW6\�ۏ�_ݛ�¸��o�o=^I/�G��!�R6��\�{t��Ɵ�6�%inmzK����4I�IKK�EZ.��E���\�1AA�Ƞ���� ás��)�`�e2�q2&��s��ӝ�Y�iO����s~�/��<�������Yz�,��G���G��>ۇ��;�h +{mf�5�*c?����,k����s�5�����1#�ꋚ� �b԰��>���_�8?�@}^�Gn�x7��u6v�̀��/b@2�(CAw6�ڦ�q-gҿ����������u7�g���8�?R<7�{�{B�G�e�E�R?.�������j���K��?�w�v�T����=:�u�ч踂��8��9,�C�%t���z gz��@�{�཮kz _����>���/�߈�M��_�p�귪һ�ܷt���ɜGG�8���qy�qa��6��W�qR���6��K��'H��z����0�v�]_�p|ܟ>��ݛ�����,�:��:���)��tG�s��c8��8�#����8��Z��ܬ}�d/ ��_�R@��m!B���#�_�y \�����b�3�e�'�"֯�M�z���G<����S�q�������?_;���Wh������ +9�1��%c��يP9��`-� ���ђ�o�c-��^,p9�=�R ����B�N<��Q�?��[92���t��d�n=L<��A��ȑ�]�Xe����\�h��E������x8z��'��m�H�2�G>e��k=:B��t5��J�R���=pt±�n����ѽ(\��S�ݰt�*�O��.r�����?��b�̘�C"�f��'���Q��~��m���m���I�G<�4�����v������PAo��� �ɠ�y�#�y�����n��s�mE��o +���� �8�����,���OU�B$�����P���]����*��,�����Od�_ 2��\�G�{?v�����X�-��s^tS�sd�+�\x +�)��c�:����h�������_�P�� +~����/k$?�f�O��yF��>Oq�m��r��Ѻ�!.s�Sc��>;\��䱧"���p᪇���pMd�pt�v����Z��f��^��w@dG�\��ȝ����� +�-a4��u�AL&c�jHָA��9�ʂ�͞���*P}LHu�ª4Z5�����9���_'����`�K�0\RE�-U$Fp�+mw�����_�ղ����q���lI��&&c�qjHNQ8��:C�j�U���`b��+4$�JUI� +$5ȗ4V����H�%o����U�q���O��xB��wU`��BSDE��O��ƮG���m%�#P1i����(��bP�ɨ!F��t��9�4y4�T*��R�j�����ܤbs� +�*H�W��5r[�)��\�ʱ\��zD� ���$#F���#ϯ�w泥��8�!7#kȍߚ� +�Y��J-*���R�BK� +�U�X�)�:Jn[�rm3�/T�}����R�c�����xG�i�3-»�����[���1n�Ō�s����JnFS'���R����*�U`��cO�۞�<{�r%r9|�I );�AY�㕙>MNg�ҝ+���*{�^�2^�5�M�l��������k����H��=S�l-~�@� �F�����y2���4+�iS�ө̌\P��� +93�*=+�4L�={�l�]��< K�7���#��L�_�O�̔z��vx75R�x�eXՅ|���v���ꤖz P#����6(�e�3Ǣ��49\��#��L��*Y��e�k���.�{�L��ddHO��*�sLI�s�#>��|�o�� �#���c�`�;�3 mc��HrSCn|Ĥ����*� Y�|���vY<���TO��>� +ke,�K)EmJ.����+�x� ��U\�Q���y|�;�r���Ȼ ������chiCG3#�t��2���7���^���R�L%V�J�e,u)� %� VRYH �2��*�ۡX��x�K^n"/����˴����2K��-p�g�]9��]m�� � �jF_-CF2�֓b�$&�@��>��*-J�L����x_�b}^ �SH~��gC����c�c �~�c�U���E���p>4��q*=�N�s�����aXF�h����11��+)���`�b�A� M�h�P���i`��0MA C��?��V��j�)x6����{�Lz�Ӑ����أ�VB�V7�q7 �������$�K%l\xa�0����t���\x�� �� Ǹ�cB�Huh�c�C��걓z�CO�N0yy@�0���"�d��F\��1��R����k�RivHMdM4p��ġӄ�&��4���5Go�L�Lk�.K�hh�h �k�\��ni)![� �9��<���h#;�?�;: ��6������+X���y�#�t��p�� ��30hs�1 ���;��� 9��tG7��&�4�nrх���U]Gy�,�A����U���Epܳ���:^J�<�a�<2h6��ƺ �����gG��I'�M/u�E�賏F�G.�Y�'�ṿ�����; �1p�a0�p����{�Lߐ {%�W@�Ca�!W��қ��O� c *��r1@����_R����qpf��L�tL��R��l`���u����t�^o$6hV�Ӑq� �-��8.sf�p��>�rF�qخR�+�_W.0Y�� āt0R��οgj��s�;���������pH���}�A��#�G�G�s�"^�@�� ������a��G�>|��T�p��!X��4�T |�p���Ʋ~k��g8��8�K8���G����<����N�]<�E��D4��(�y}��Y���Z��Y��;b�6���ԮO���}�<� +��n�-���qS���M�8��z{���S�x�8Nk{�M)�(�3H�4�z�~=���1p�p;��T���_+�}Xኁ' �,�?u�� +��q�@>z�S'�u��/�� >�z��:=E;��N*ңn�<�7��U�#��`� :�.��_�OR���ܠԍp���/���h=�k�!G��!�^7���Y����J�g��z\��h�����Dt�*��bn��� 6���^ ��489x,�؋�h2�G�����M>:p����6��N�v4����#ԥY ��E�f��U��R��0��we���� �m���X��u���8#� ��t��e����D���t��2�!�U�e�/�Z"\B.j��(f��mV�]����O{� j���ȭ7��\���~��t�� �\�χc�9��)���2x�Y�ŮC-�Z@�泳R\ �,F}������9�(�48ĵ��5��x��W�:E�iU5YJϨ�.&�j�$� +���n1 �Bx��S����(fYj�C(�����i>'{��og������G;k�}+�l$n9�C�5���r��xx��K<����s�G��Ή��x*�j�]�r���~"}�nwUL%o� Nq�O�*c}��e;W�&�YC��%/��P8�f�fc_1�)��� k.\�p�����ṕg�����t���SO�Y:����o'��`��Q:9-x��w3Ӑ���Q�z��>;\�p%�'/\�p �k4\5�h�r��#{#PN. +�i��dgqe�d�����Y������1@3��z�MaL$?���r2��C�&�X5>ȡ1A.�%jTP�FgiD� �a!w+'t��C��V���:��7)5�C)�O(�� �1|!O�w�D�t�.���X�m�)��1���PAN��O!��ǁ紆*�dT^�U��r .eGx������G�RZ�y�S�b��dS�<��J07*�������/)�|Q1���{�Z|z��x���-��k~�k��撧��f2�KmF�•i1)��Ts���8%���dɐ�2\ ����(�Z(��L��%rF5(��.���춗e�]_�[����}��vƭ�I�����m3��l�4�Lb ��� � R�� �͢�(��b�%�e�*֖�[����m�%��TvG�l���F��òD�(S������/��t�N��𳛱��A���4�8�6S��42��dS�w��F�8�r:��v��,�3��木������Hf��\���R��W��~���M>��d�{�����< =�Z�Q1��]!��2�Y��Q�,j�LN\�r�,���r���Ni�� �9~�L�SeL��Ȅ*W*,q�B=�9� � +N��UH�O]p�w�L��,�X�ߕ|VLl���)�f9�#'��CN��PEyL�xl2{�2y�eLJUD�0��(�-U3�Ui0��v�|:ɮL��1v� +ͥB+�t��r�)��D]᥊y�� +ݸ�~0)\�*��ָɽ�û{��Xfm�հ����2��V��|�ߵ�=rů�Ĕ�T��M�T�۩��jE�Z��W��j�^v�q��q�*�B�˄ΆKZ�[µo�5�c[��_�U�`�8,���G�� ��bK�^2ٓ:��hh�5�i|1�/j�Z�VXA>��ך��_���,N�7Ѧ _\���[=_�i�u�`�x��D�@�yy��_�2%ʹ��x�>r��؏{�Թr��`j�f>��+�T�e$9 `c���U:� I ~�%����ٱ�/袁/��h�� _��s�)q��q��l���������K�3[�j�� ����M��L_�>���7\;ֲc��4��Q�kTT�((k�x��[��w +�ሕ������Kk4��U��@���{.�J�1P╢4�� �ŗqE��`�Ǝ���U�n�\���ɼE���i�]l����'$���{.�y����ǵ��1�Ja}��� � �!����Ϛ�:mfG3m4�I3]4�E35q^��'��$�;��i츎[�u� �r@ +1�T��<ȸѹm� ��a���-��߉MKvǀz���(j-|�BL�9���~����3�p.�Q3 xԭ�G�n�߶d���N�;�|ܛ�}��6��'Ѷ$��3'�qR�<%&�4�S|qJ~�DzR�>���ދ�x/�9���f �|�ʸ'y��j= k�âٱ ]��0���!,��ڣp~����ӳ�q�0rN�<����Q��ٗc�;�ޥ��`|��<�\�����^�\e>����P��F<?W��O�cq|��x�����i�o��r�M��_�a�{� �u| ��=��&R��K���忚��6�����W$�dv��}������*�1?��X߶��i�{�#_��\��Y��3Nmc}� ���6�>��|d������)�]��;��_��_����/����9�Գ +�3���%�Ol�OI�' ��3d,��mB��=�E;��bW8{�;� +�,g_���^��U��*Ilt�B��t���l�� �x��������(���� �$�/����g����� �:{��'�iv��6�l`�����g��v�;�����8hûC��������Q��O�)�͠s�'���I�=�.� \�x�������������)����9��)#+����y�J���9���ۉ�xs'5��ۆ�� T�x>)�3�tSI���/ WB�)t~���-�v�����k��~��ƻ�Fv��NZ��������M���s�Ep]��z>�Dk;��d�����dI8�,y�b�i�|EN���b��W�V��f{�c��r�Vրco��5�(������X�e1/����s�SG j+�G��Y�v������ꎣ7�b%8�pTȊ*J��3�L�JY�–�ٲ�_h9�� +uk�<���q쨔+c��v��0�� �j�k*�z�/jW�PY2����@�8~�R���5�3~ަ�n�0^i���5Ə%F�9F�|2�fƥe��ƙ�W���~�5����U��b�S���'��RYo9Z��Rm U��N���uo���ֺ��{={V 1��I=�L3�N���9)1�k���%��ҩ �����Q�2$���(�"�t�ӦGQ��(L_=�7E���(�8��#/�|$2ގD��#�U��y��l�u�j��6��EW�m���lq�b}'6�t2"�s ����D��D���E]zG�.�Q�uX��::zdVEAfm�g]yY�#��1r���H�d�����|���8���Z���#���_��y�)N��RlF��0�)N�EQnf��΍��yQ��3��F^��H�F�����;9rr�"��������L�.�Ñ�8��#-�*|��ָߍV�k�Z;'}�^k�\ʖ9[C����k�(�)��=;EaAz�%�p�Fn���IAq���2�������Id"���AB�(�7Q\� �! b���)D1��Q5 mQ㫚�ؾ����UZ�E�JI'���n���[��z�^k�{���9{����w)�ʢ�c a��eZ�2��R�[Xh� s��q�����$z}&f��D�U�Y������È�[S�F���8�0�*�\�L8������V[F�8�k'OaU�OX� �u��s3�qahuaq��u�1v��te�u9�2_�<��;�}G2 ��KB��#�� �&`T�q�&��I%�Yw���4v�6���NX�9 + 7ga�V^h�a,��ӽ)C"��G��`C��������A��N �yb*��c�4Z�̲IhW�G��V �L�gMb�g�Xޅ8|�DIQ��Nh<)O���z�D�D�F(��73��@t�i��iN�i6���3OLf�1�;��CuI�م�Q��|��{b _���?Z�j`&�ޱ.v?._�Ə �������ς��(3��8��яWҗ�>Tz.��?�����.��7�i<��%�oD,!`R�8��\��)����`.� .�j�ȥHB�@H�1�%�폎�@T��Xb��/&f:���.c�K4�#1�wsb��=�8|��L��f�Җ���xxC��Cx�t������ �$2N��(��mt �5&j0�T?�Cp�mG2�a���E�h�9K(�U/0q&{���@�Ak���X� =������ =���Y�&zfͺ �u��Э�>H�V��^iPfPwމ��Ћ������������������lxH9,4�ٲ�5���f`� ,�x�8�08�!�q�M٠)]I��� l���"�1�0BTI��##P$�Ccb�a�܍��2�S�c5#&��F��&�G;Τ-gҖ��H�#��D��� ���>[3�F�5�b( �A�b${��i�z��з9�&�l^}�p"F;b2!�{as�E��� +D&�x�#�8j$,by�b!p,d�L�Y���]ّ!1���C�H�l�p����������\q .�������U%N�LH��-R��dch��� +�^����@�D����3Hv�gx�q�|�D�p��*�жhc��H�u�}��6��7j�ʌ� +?R�#�3I�3<�� �P��S�,�>����� ؞�E�q�����\��=�-�R'6���;��9IA���zɆٜI6�|XdA�,@��W��־+Y?��[�ړ�C �iB�F-����(�ӊ �-A[(������o�q@j� ��ȡ^s8�j$,A�E$�h�~?�Xhڊ����>�ǁ�-��•a�0|�!�St�+�R)5�D�@*zm�ah�C�F��nl�V7q�m�͐p�n�y�Qњ+�{��O�#Ok ��R�>����5y�]��Nb��s�0 �;P�^84~��E���J�c��i���l�)���%d�t�U��[�PY����#��Wq���€rF�t�Gz]����(9dj_8���`���]���భ�K�J7H��K�ws����ؗ1TT�..�(r�ۮ�����ѵ}�4f�>�z��{�ϟ�ࣵ�L�A�����ϻsƌzf�zkfL��(�ք���C� ~�h?�j�}�CJ��3��E�%�/c_TV��J�*�p��T�_���xE���y\���_�^H�ڨ;Wi���� Y�A�"�ҭ[���l�!�I�v��^يR�9�$�V�d2���nq�y>��=/�����<�y�;�s�����+N��w $� ӟ��mWy0����\�*c���<0gל�uN��@�B����!��� ���+��G[Y��u�?R�|�^��rr���H��/�坑�������,�~$���K�]�Kn�`����l����=�Z�5�[7�q|g�Unr���"~��F�8�ߛ-cY���� đ\ೖ-K1�Es����)�`[�����>��zy�H�����]P�F(볫�ܤ;�dq��F��V �Lk-��z�PߔJ��K{�w�W�y~��P�'C8�d,ߴ.����� �:���J��@7 �d�z�qF�@���` �V�"�� 6X�� �#����#� �� Z������e�WŔ����ԃ��N~�a�~�qfu��#E".�l�йy.�?Xϊ� ��;��m� HK�=�`(tu4�G!g��n���_��:��^!��B@��zh�C�LZ8�l�$@�� +��+� @ �e��!�O������Ax �C�8���~ⷎNs]=�/��I���֣�3ѡ��M*{q6l�j�K~!}9Y�����m!���!��_�7�Hl�ް�(��Qp�p��j�`�0G��Xs,D�`+�����/x�G�F�@�ҚSШ +�s�=�t��##URuM�T��������?|�����zq+[:����s����M�n�ִ�������䂹3���3�o�\P��7.��B ��<�L 0 +�wzB��F�1��2 +�Ȇ�� �DG�r� <�6�X��`3 +���83�|6 �~!�]{=i���5�$��>�*�OE�t�O������1����o��,N�4����GO\ٞ~��pc݌)��G�R��0X���QA�l�(f�4�� ��M<�Aoc0n�`�����"��0E��>���)h�@<׹L"]�N��JY���s����r�,�'��%����hݹv +��� ݆/�U�)���|���J��n��P��W�� +�x ������k��F�E��Q��`0|�=t�[� 1x}�f�p��c3��A&����ŽpJ�� �~ ��7%�1�����,۰�PRN�D�,^�H�U0u�����f>�����7웻ñ]zQ��ZV�����q��6 S� ��d`�0��XA#����G�V�J�[�(���9 +R���WvH�o�^0�x�3� bx +p`+gQ��(^���1�����ױ���>���9��ږ�騬��*�^���x���#qb ,Y2aHwc�VM�O�b�/f=-��ȁ/} ��-� ��`=���瀾�}��k��)��� +���4���`"�� C�!�)�p3:�m��u�@�XoQ�v� �����n�gn3������w:s��+*�����q���BV- ������M$Nre�O{�}v� �R`�� �8�3J�yM�O�4�)X��ZG�y��Q�j{�DM {��_π���Y ����̸�Ӻ�|)�we��Uef�ᨈ�����.A�]��]��dci��I~\w���<����8�/�t�� �P���g�+��e >*7E`S# � ��3\�G��HpχH�n aKS[��K 5�u�k;�mɶc���V�ރ iE�HD������_+�߾U\�'�9GVXJ¬���9M�<~̨�����փ�I+���q���ij�L9%��A���0p��cF"((�`�77Q����#�'q��� h[:�-H,�n#*Z_YXO� +=�V�y�!�p�������LY���zY*K;�x2����}{"w��7�e�r��"Iw�:G�Sy�\�V[�<�6'R��չn%�:溬'5�m���Dtb�Z����L\�&$ +��ܾ��~v���ן{��}߻�����<%E��&�g������IN���DH�J��"�NƄdD�]� Q�!�c�@ +�d *��>7 �8P�W% \� h�`3�^l:�9�3��c<��xWo67��!����ʺ���[�ЈZ��I���4�z{z?c�vT�g���C |ޮ���X�.�qDh\�1�y�X��C>�M|;��egA��� ��:܂�8XJ�[7X�I�|0|�����N�7�����w[{�Ekv���c�JȬ�����i%J-��Q�#�u��|FB���ѵ�<~�ԠV�T�w�|���_�JvV��{J,�͓ɯ)��l/`� ���R|Vx��fm� ��96���pL1c����3Y0��ߜ,��/���N��P�[@��Q�t�+eK�T�e�9ۏ-p� +�Ȯ|BpW����$� ��%IH�O޿y���:�~0?_(g��D��,�rE}K�cШ+)�J_*=��I,�?!�4�l=Å�[�P�ծ�=�Ğ� [������ �}g��� OZO$o�!xL��=�5�dbBC��) �O�մ�>�R�I�r�\���r"#;�@V�2[��k������c��lz��i5a#*�X�m�?�;�6�2.�#�:ĉ֙Li���������_�8L+ endstream endobj 7 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 25.2.0 %%For: (Will McGugan) () %%Title: (Untitled-2) %%CreationDate: 21/02/2021 11:24 %%Canvassize: 16383 %%BoundingBox: -399 -690 365 -254 %%HiResBoundingBox: -398.332462851449 -689.234553001443 364.471187674504 -254.433344658513 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentFiles:/Users/willmcgugan/Desktop/eg7fso9i.jpg %AI5_FileFormat 14.0 %AI12_BuildNumber: 220 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_Cropmarks: 0 -841.889999999999 595.276 0 %AI3_TemplateBox: 298.5 -421.5 298.5 -421.5 %AI3_TileBox: -8.36200000000008 -816.945 603.637999999999 -24.9449999999997 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -391.645553619303 -170.184809335895 1.47137402390547 1788 959 18 0 0 26 66 0 0 0 1 1 0 1 1 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:-8 -817 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream +%AI24_ZStandard_Data(�/�X\�~VE? -��L�d֖���Asll��ؤ���`�"RZJ��&�M� ��s +A +X�J +���4s����:� 3Ͱx����n�+c%�Ӊ/7�i�����^Z�Q��@����Ƒ.Ƒxԑ8� �t5 E"���q����H n*�ƪ)�3vS�8�Sk�,����U���q0�D�:���8�đx�T�ѡ�⠅�c�H �x\Z*�5����"�8��� �j5�3;���� �86��k��,C\�]��c�B�UpTp���t�%��!Q{�H��i�H��*q<;��U�\�pʡQ�Q�����"*�6��!���H&a)j"޼Z� +�B�x�����ÒGbv<�>Yu�S������e��Ńa�$��<�8���C�聉C�*�,��X���k�������?e�[���H �xv�0.j�#�x����QA�?�!E� �R����X1 �q�(1�R� �q&*��H����7�"��"�x�G&b1��#G�ĵL�]��9zy�a.:�hqX��P$��Q�F-J�u�)F1^\Lb>��q4�#��k�x���Y-jA���X( +D��+��C�H$6x7�8�1�GmcF-*q�-(qd"bTQD�W�:e�b�s�!ܝUb�U�\ ��o��H�^ZN+C|�U����j��� ��UU�*r��q0��p�G�E�@�w�'���8�q ���8���qT��W���:?�P���g> +��X(�;+�k��0�1�3Y�++�*�xPcQ2�]�f��2��dV�`��GD��B�V �K�\���!������H ~��QCG� t���= ł��QA�q�@(�I4A�J8a�K`"W$ F��E�(�������.�Q�Dkl +Ɛ�@4�(c�&�'sPU�� r��> +�defwC(s���`  1"�!c&b������X0z����j�9SW��{�XJ�sv;����Yϭ�GD�YZ��F��H� +�B�X(�����EE�� +�"�8*h��X(��y�8f:4G���'烘�(f1�i̴�V]��}MT�Emt�DTd2:BJ:!�H��ĠM���\VWXY/D%JQ�bT��5�l����p� +/�p�c5���fv��vCX��0�5l�GW系���!.q�[�7X$,4"&x$P� d`'���N�K��'"��E2��=�������X���Q! +���8�#��SBe;�#���8�bJe;�#�D"q$�Ĕ�v�0rLP�\��A $`/b9����"G�T�R� 9�#T�@�H�1��Ã��&@40�B��X@�.�Q!�Dt�,w�e� )��dڹ� qv*ː� ��)s\��X��g�N�Ƃ�H0�<+�0��3WU�QU�5�� )(A B�N��$$��###SQQ�j�QFUT�D}�,�z��U*��6�1�QLb��O΍����3�h�E.r���Eb�X(��b�X0�Ec�X ce�A b� 3�a�c�HF2�8�8�#�P0���`0�c�h� jP��p� kX���F6������h$����h,���h8+)�� d��@ ������1nq�K�~yxwv�:��1�0�-La C�- ���FVk��N�;�>��2�7�Q�RT��ʢ�p�H Od�����D�h ��P �D ��0��(b�3���#���w�O��d�"�HD>31/-��k� +�(�q��@�1�a�Q b�1�Ƃ�X,����"���-��-��EC�P, +BqE*Pq +SXQ +RT1�F��X$�D��(�q��Q��!�px �\ ��H ���2S2F�53S� qB!Ѱ@z��9*8�p�#�8.H"C� D� � .hА�P� �� (@B� 10\ ��`��� +Hp�� ��L�����\ !� �`���B +H��� <4x@$4��� ,�B "<@2�&Dp��&h�a�I�w�����v����eX�hZ��?*Ԟ�������f�uU������}Vn�H/�Dv��k�CC�O��^4!���gE����S��Y�}Lbǡ�[���e���T闝�͕�GM߆p�D�w��c��,r�[�!:��-)�����}�S�Z�����t�Cgcϼ+�O���CvKgy�ٟ���h�N��e�>_d�$��V�d?�)����n�kE��|l�-K�ƨ�6Ųhe��zн�Xh�*,y�Xs?;�Y͙���Gwtӷgb���T�sکT�ף�<��/�%���5�v�yY�*��,�2֙�m5�,ݭy�n��%�DX��GO:�����|�ݹ{{Wޮ�&�Rn�w�=���"C�o7K���W%_���ʽ�����mv[���Ů�ws���S�N�n?O�^ �- ��.N���e�7֋asJZ���N�)vme���.�R�C�RV�g���Bעcҽ�/�3k[�ҭ�j-G=4�ݔDC�� ��s��n��[{��~�\R�׻'�Kճ��~VW�LIx����".�|Ϻ�W���#��]�8u��{^I*C�_1��W�&fu-���铙m�O�8o�YN�L����y&�a�1�3��������B���|Y����b��ͦT�#:�j�<�o��I:f� �� b᧕�&�ͦ�3���.vr�/aV��<�N�h�٦��> ���.�5)���ꮵk�n0��B5+�ٵ,oUyY}K�l�F�e~0�~eje�ʒ����T�5��_V-�����Y1[h%Ǩu������6&!M�; �dUz�eOXc��!+S�]"UK��}96�+��|n��IU��N��Zt�be�O]��R��03�2�V��.���Yڳ�i7��n�fG�I�Y}D��=ˠmi�C�;Y��J��K,�9��\��˘��sC��1Z���Ϫ��f���ҬV�f��]^f�)s�aZy��҆ +Պy�)��o0�B5ė�\X�v��a�Z�6Ŵ����!�bc6cXL<��cf"7��T�ֻlՔ)#�.�i�lG�ڮ�i�S-7��;����n�l���5,�ߊ��ݦ.'q +ْr�zYʚ���쾫�U�`� �,-;�<"*�Y� RM�Z��g=4ϑ,�����e��]�׏��%�U0mj,+� +��f$K�y��C�m�w��ŷ�#[�X�����2��2&����GY�v�����˘���f��$�K+��;,C�8oW��� +�s�T�G��� ����,�حNn��3G>Y%��ѥ3�T~#X�2!z�\�c�V��[�e���j 1*iS�ĝ�_�l�"ES�J��d�[����j�+T�TC�<���e��v�e��,I$/�����̂Dop*}n<��RD*�2]p�`I��b6����$�$�N�t/��W��)�2�HQ�3��GN��E�ꎰ\�����19�������I���SX�u������u� �"�uŪJ���*=[��L)U�ܬ��u.w5����ꪪ����¹+�V�|2� ֧u�+:w�$��H���}��i �,�`��nX8>�[�)��J���=Z�9*/[1N��N�4���O;�1+�3� N�e]�tT�H�+wme�Q�� +V�i�rVHt���ݬ�š�Ϻ���{/�Z{��oo�~�+����eS�]��jzy���Y�*�ϼ��M�sV�6hUG�bKd�Q�Q���P�Ch�L?8�ݵ��k��U�������m ��-a����]�\�������ܮ��������~�c�s�Ήj�;���J�X.v�Q�1R"�Y�}���l�lNDx�6,�Rb�-'�Q �uO3��mы����uvg�:�0�ؤ��h��.����9��.�M��V�J]���{�OO��w�V)���thht�ױMo��C��������̲~��PY�ic���.r �~b�*��!�����&��/"<���w��&M~��)����\������S�άc,;eɰ��c,�̞���4{�x�\�����!'��Ƽ2�K��ۓ�Z�<��g����NYJ۞��fG��^~}Y�V��� �z�cv�:�d�[�l�!�������e��:�%�lo~��l���3��fl�O�JK~�S�u�qIS� ��uG�/%��Ms��d�,٫JSNԏ��J�g�q}��Mg%KHT7V�E&�s(Ӫa���D��W�N�R��gҋ�ؘ�ƌ45�{�hCY,K~:���m�~�NuFؾ�f,S����f�BXU֭�R�^V���\�ƉGo��5�\H�� Yo��-��+"^}x�b�Jf�ʛr�:�| �jߡ�D����_̥ۧٙbأ��[�����������;C-��jX8W�:���}���C��w��Ro�W%��_� =��D>4�dd����!QQ�OM*7����k��ZV��{B��7?��C-�-}�_���L��b:�%jm�*bke|hegV�n��R��,��t#t9��ѵ,2�9���O��{��f-g��eUU-�S�1�ޜ?6���T��w�������ģ��6�'� +U�Tz��g�楨�ğ� +�Y^8=e:�F��f^jdy�}n�މ��>��s�B���.�5,�����\�bb�7�+_��� �3�<��mAJ:3, �Ye���� �U�]+�2S�@��p~y3�W?"V޴$1bx�J3������5��aU�P}3/e�"�M�������wUY�y�B�#�˙j�ױ6��BK_���T�Nw�Բ�g�&�^�4��Y��J�țG5�k!�����{݌�Ӱj&�EvVt���]��?T�*".ە��T�m�}�⋵Ļ��7��"?{����ď= � +���jί]>:���Z��J������˜{c`�3��!  �f��I��>���2��\�:A���J�*{S���2v�Y�1_�w#2�����b�9.6�Z�E.mU��}���Qo+��+��*���X���nY�iHT��Y��2��y��1[/ZY�,͕f3�tYڡa��ͫP�'i�r�X,��*� +��~'��z�,���eL4+��L{�Й��g6f�u��t��k����:��i�U :� +˟c�U�����Ҳ��ݍ�Ū�����rީ.'�GG�C*I��i3���}h�T��M����#��$��9G^������ЯTb�M-�bދJ�̇��&ٜ�����CՂ�K�/������J���$�!���cLg��}WNaV� + �%�Z+3��e�X-�Ǭ����;�?DW��n%�Y���;�̜_u���;Kc�ΐ������!rñ���7�b�w��UQ�Y^?BxT}�7ƻ�^̳�`�^G.���z?5����Y�퉽Ĭ��Ŭr��,�ʎY��~�)������f'�ˤ�eSH_tC�b��x��iWIW&|�c�VΛ�`���S�g��y��U�rNW�1��_��i�9e!,̹yby�xV� +K��BWF���M朞6�N�X�"����3�U��5��D���?�Xt1��i��fʜ+9˞�O/�]��)��,�y������~ʥC*+X�����cg�9�|3��x�2�L����O�\9��6>��jUL~�Y׋lֹ#�=��t��C�9�[U~�rO��~ƩC���<QѮ� uU1�hXʖ���;��>K�ODe��UNGe �����b�+���t�@n\w3Ð��Y����ӄ���V�RG��2:]mu2Q���SeY�я�W7��1J�9��t����je�o���>�2G�*����Ш�V�ʏL��z�['�����u�� �4IY�Y�<)��$C�"e�O7}Y����l��ݙ5͚��a��_�Ac�u5KE� ��V�ز����B,�&"��T�� ��^z������J�<+RΔ23g�ù�5����l6�WW��i�95����6�"���e���s��(�H�{D.qn�UH���N��i�^Ec�����CyD5d�� ����t��)ٸe<�V�^-r3������:ea�"�E���r�5���0��k8�S��^����ʈ�WM[��]'b��DC9/&���zh�������eD�� k�C3��Nm;��5��*;Q/M�Z~��7?N�Z/�D�~����cZ�H�� +��t�����*�h�RI��%ô9a'�� 3/1�5�K"v����������5UŸ���~CX�We_���s"4VM�2}v3�>E'ce�M{8�Y3���nX[i�ؼ�J���YKa����M�|M�|�"�=ǔ9ű��D�xW>���K6勽��+���ᑻ>N ��i�g�����U�_H�U��'���ɰ�|�A��GT�38-+_�z��-o��<���:�z.|Ur��Lj.���^sv{�U�U/Mˆ�����CX�����X��:z������k���|Vv���Fu�V���9��6�U��c�E8-+��r�焅%��V4�9ϖJ��{����e��7���_ݝ7/+֕%ڼi�u��ͧ9��n +��kVl�Oϸ�{{�����b>g<��U-MY�{4?�����4Y�ռ�ZX��?��^�|қ7tN�Q�������T�IdsLL��r����6�ɬ� ���L��G�k�V�s属_�Um5�*�|�S��Ģb�I��ͣ���W�CL������Y�˥g����<3����5'��-M�r�I�rh,�ҝѲ�����/=��l/��LY)��\Uv�%�3��e�ٜ��Y�\�ñ�L�i�uc3ϟ�g딟'���Ḷ�Y4�<�:�șivf����f.s����\��6�gSn��eI�T��̖9��2�&2�4��%�c�gU���+�ۅF�̖���2Ye朽Ծ��L,���gf�4��������:+�//�I&D�>/]�z����Y�x��9��̞U/K���� ��)�H�Bc|�1�,���)�g-U���ZX:δ�ԝ��dM�11��ː���f�Yf4����\̜ԹL�R���;zZ=���V�9C-V[!�c=�l}��� 3m��3�!j���GK�g�ˍў�u��<�,%�k��q��U�fG�<��i��x��2�|�z�|vb=S�V�t��V6u3|1��y�{��FE5���g��Zx==]NU�j��*{fES�� ��F���[��hc�OtJ�i��n�����>!e�h��iy�r�V�rHt�#��Xz���e�R'CӉ. ��?4=�\Og2��/�,��t�`�&��Yn��D8E�STY2�Ts����2-23�m���Zɩs���2���Ӫ�-4�R�TR�6U{�Ц�-���~\��� ͽ�Z���6]�w�箯��)¾�+He��꽫z��R.��_�W-f�Z���Q���\} ����xF]$��sVF�o��7}����k��YU�IEΫ�o�\�魯b�y�.tUVFFe�9[� +��+ٺ:����Ԕ�%Oc4�[؞�4u/<ы��)�2T���E6��fJ]�R_��1���h��B�B��H�� ţ�m��{b8L2����q��Ae0343�B觺���_�� �.�����J�ȩ +��Gc6U0!qp����+q$�8�,����t\�A)e���/�L㐊�G.Z!�{�I.�^q"�&��}���smZ�ս|τG����Vr�� ��K�I��#t�2�~�Lr����+q�RF�h̵l���ޱUn�1�*DV�� �XR��y�w���j�ܼ�(w 4���~ט�{;�������lf�7�%4�q�$n�A� ��w�A�s����cv ���Pf�?�п;�(��%�k +{��x ܆�7NAqx9�^#�w�E{�*�'133䉣��x}b){��a���rf��Љo$�݉_ܮ$օ��4�ƅ�o�9΁<�[ ��c�x �������`����T؟���/VS���TQ���&��D��C�i�\B�~{ �Cvg�8k���M�:�LD����X��4N�Ǜw�R8C�d5!����9^%P�4����7|l:�3F��}��U���V�ƒ؎]���(d�5�]2�܇[@C�݉�v�^�t��uTsIs<�����^%8�^�q��%Li���y�|�W�̄'(�>�F�� �;4vۄvmL���HӘm��݄h�T�,�EqF�V�� T��R�M��x?�-�]��"g��^YQ/��g�:���V��o9�b��hiB�}�b���񭮻��_����)�%"Ν���,�p���LE�#�*w�u���)��9*���� �a�$0��T�;FZ����Q������9��wDž��;��۪��?�dWC�^e;ܢ��9ȸJÀ��ib��TQ�HB�n��Ml&c�� +�W@UG�a�h$���ѥ�16" *;�tz�@�T���%iw-�W-lH�����0p�C#j5�b�UE�I���;ȥr'(�(KAKj�z�P��+��i�w���^�~��*k�)�K i����Н�h#(�x`�'�NW�V������#�!�LJ�O�X�<�H�q�/��K֛�M�4� ~u5S|b} +Gg'M=�bbQ$�v}�Q4�%d�c[�.В��1@e�^_S^��9�w&�p����G���*W6����O�R�����3~U4J%Y��`����S2B@��5/�Nڅ��ZG��h�J�N�L��%���h�Gj�a�آn��j��v��OIZl�X5p�s65�B�g܉����͝���l��ݯbǏa�ѝYn���,�-�0���;B��T#� aՁC�����mf��'/#!ab��t�џϠep0�ՋE%�S��|��X!�������'��D������I�e�v�@$���t�붒fx6�:ʽe�Q�<����:wN�%���KDZ�HAn5�� �P +�S�Lq]u��D�c8� ls����K�D�q�~��io�~�W�/�\[]pZ�{В����+e�^-����A&)t��z����U��{|�V��7$�K�JW����-�i�c�0HJM�d�F�]����P�>���5��]��w�',O���i9�)��ck2�m�s �r����^dB/�cɵY\N��� +���Z� ���C�׳:���;\��_m^a�O���Ѝa\ƖK��D�섕��BO,��rA�؜�i�����n|�͕���T|�}>)U��w{d�\ �LL�\���a'as�v�G����"B1X�l�8r1� -��5�����&XC/�몥��lFf����X����3��e����:V|�N�C��,ӣSvf��گ��pܺx�r���ߋ��n]o��*���>/چ+J$�2I���Ӊ��n��fqbܡө�#�X���H\H�֡A�[L#�I<�?7��RqA$� +� +��6���t��6 +Fk#�*>�?��B�R�Ӱ�V� uĊJ5�~�5�pN#��=�P����8�:��eU��P�GZ � �� mpA�P x|����LA�Z�Y��o��I��� A��Q��-��:B%�Hn��v�ſ����/��:����Q\w��϶e�����UN( +r��u8��VS��V,D"�ÇKD}h��=@RO��5��q� ��HVLJR;�fj��uM CXs<�[���a' +9������v%������ +|`~ �~\?�ǚ�rl��ij�������B �|:N�>�NJ�\�)Lۨ Vm��Պ�7���Rx�WP�?��:S� +��4�8�p�S��+$Ϭ��*��;�qR�w����C�|f�YUd��/y��/K U8���ͼ;vfM�$�[nE��z���4U��[� �悷06!=<�*t�F&�Q#9Ld7K�7��_��)�!B����r�'#b���֣����*�)�Cq O�!�q�ÞRȝ�tl�p�S*�p�E�����>�1_0�'����G�� do�*�6μ��-$�������e��n��h���Nf���>�Ȼ裆/P< �y7Դ��fػ��@K�����g��V��\]�ƾk��� ����s=@�&;b�F{::��Hj�(,ȫW�妓@S�2�i������%��T9)^Z�@�J���qP�5�Ӯ� �o秗 �n�_x����I ��E|���p�<�B�A +��SN�#�M��9 hu&��iiq�Ŧ}���4 ��i�(�^ �/ +}��@�2,��@����@ܭ��Aށ�K�U;�҃���Z�;5��@Dx��־q�.�r<"��TZjy ~�2 <���Cw�@|�w�X�������?�W8uu�~��iv�%Yڕ +��XW38��"d�*g��2`��C��7�o�5,B>�� �7 +_��4 �Ћ0ݞ��{*����X�rőG���(� `�/���ݿ3�T� B%� ��\�.���˜� ��r��L �qB�K�h�:Z�̲\cI��&�����;崹vC��q���(\2Dv-1�%����(%I��(����) �`�A߾�b$~�u�u� �%�"2�Td&���r#D~��rۯ�1������bsT}\�qy>,4�L�_@D�+cL݃_]���v�Td�Y=!�����A �8�Q5D�oޯ�s!�„v�.�6 �S�&y!��GV��'<ݶ��#�Yd�A�$> Z���q��O�pJ�!��%t�%��#�KLC$O�b���L�2׮��+s �Xѓ#mFO��b�h�\A$���zp�� ��}�qd[x48+l�K���.#Qm�c�9�O"���+gIm�����8��M'~"����XCZ��~k���8�}���O,����bٙ�YҏƐo=̘�ղ������B�!^���&��D�|�%>��q� �7��{�+A�t����W���6Ή*��`*S� �R����:����T�_�� iXn���{V�Ӈ��r��4�3��| +^n�p�����2߃�"�V�`�3Fp�Ž��j�y>����۾f0ا�@�ӱ ��B����'�~�&�c)9��0�ێ7zO98Kr�,�|��m������4y�����b �Pc� +pm�R��T _��ϯ�U���W� �Ʌ؈+Y��� +0���?�0����{��8��Ҿ��I�^r�>�!�EfsP�F�V?q���Q�pWhʁrb�7o�ԩӤ�Aa+���V��VWqP��B(�U�s�YSk�I����AXS��t�i �<�G������%d7� -e���ev�$ʣ�(��Fz6� <�� ��Ǣ=`|��Z6�2�tw�l5�Z�-�{ �`��{K��."���jP"ÜO{E��R%���٨a��Y���5G��`�3)���u����٠�ʶ�����Ե�K�B��/tB�ρ���o��2�;���nQ�##81�^��w +`����`��Ӑ���%� +�wG쩢�`qLy�` %�?"��f+٦ u�p߭��A�0ɥ5��I� �p��� &��`� o�ϑAfI���C�U�*8�2���& pڠ�6==8A���i� ��-[���"$>�rt<�8�2���}G��$��B��Vcu�:�ǥ=]P�@�:T+�`Ft���!��p�H���l/� �-|����A��P#����b���4��`�_J]�g�s���P=w����Ot�7E|m\ʮM��?[ +�A5dH-����R|� '9>����QNU)L`ʤc`��ݫqQ�ձR�i�v]' M� �Z��׬�� AGxG̡v;��V����?i�dB�ׇ̱ ���_�pEּV��:���T�g��eh�47�8��'i� +����(��)�u�ΎNcP��VN�����DM�x�l�Z\�0�B8:�+��^�j1��ɓ����j'��C�P�~=|I�q� ��U�I"*�Bؚ�C�\�� +a�?4y��0���(Z̕��� uQ���/r0��w�"<��]�{|/p���]�;�f����SBF5�cCzi��� �(��;ŵ%�|�Wi���E�`C�ʋ���h�磽��h3WH�l�S�Oh�f�N!����{�B��������!����=��1�ˎ\�� +��{��l}����K�>;�n� �9��:2��#�.��IX�,�(P�=��J��h_>Nx�ב�ؚ��wX-�U�EG|�q�Jj�a p�$ħ������p��6�fekBA�� k*���{a�F�ui�6Mh�V�f߅�N�P�y��͎��r�-�ޞ~��{ޖ�ap�X�6�����MDa����=�r*����Bznje�����T\R��qv{`��G8���� �2x:ީdD�[B����{�z���!WDAV��A�s����V���D=M�l�áf�Zֆ���홣Z�B鱱|��-z���+�����*=��óM� �8|W�h��%jp�3���\���~������i�7�d��Ḍ�vy��0�k����I0�X����ҚX��iy�񭩶�����/+|<%}E�t<�W$��4���56�������Y�ų���(A�(�f hA%�����,w{���Æ�> ��Xt���:?Y�*�N�lC%�M�{7u,^�+o��a��R%�jI�U$����wD9�[Q3R����;�C����z�`2�0�z��Roxx�nG�3�;9�����+����� � X�^�n���׹������Ѱ��]�Xv�+���g����Hdc�:�c�qPy������G~E%c����]�v8 ~:ڈv�*��^}@oa��8���R�,4;[Q�CoI��e�Tĵ�ŝ�,()DL�]�ؑٵ�9ۻVm�2؅;�J�֟v��bUu;��J�\��%�0p�J�ΘKcX���{7R[>�.B��q��!$�ռ:B(X�HI#��6�/����5N��7��½�6��[f!��!<1��b>��D�&�H�-BR���l�|�k �/ߕE؟��Z��b��E8)�[cC%�|x-����+ֈ�� e��\�HN��#i��T��ma���fI� �gc� ������k��k!j%ڢE +��� ,Q��L�K+-��*n�%Ef��rQ)Q#Q�c���;ی4a��k�'.Q�hA]� �y^�b��@0�ϫr�eΒ�/Q�A]opD��P!��뙑ғ��6� �"�ޑL4F=wBQY�D�aJ�{KinCi�[���s�f +�%�&�o�3}�$�0�ً �Yp �D�>e���@�n����@F��v���C�:2�x��ؼ�ʄo��MY�w=<�X��"��W'!�{_�?�:A�u��+I@7+��u8���G�0�R��c�|M8�Zm&�m��K4vy�g�W���mD���~"@d�0 ��eM� �%�Uy�]�#���p��[j�3�̌EL��6v���$ІN @�6�<~�l���~m(]�dBp�r�O<�4��Qǁ��[��Y��dg +K�Ar���lj,Ǽ6�g�G�1k#�-xܷ5 O[� �P�T���ҞIyIۢ`%�i�1g1�d@ޓ6�'����OjsrGmImQ�L���ŕڔ\l�DLI [�Le��\- =L�|�[��/ڝN�a:�p�����K ��>��f[%AJ��.y计�~���/?gQ:�n2W���Y8$���ͷ�r;����L#�h��_y��-�!^�B���j���*-�Y:^靂7��.C'JyJj@Y�m&��P��� 3?�b�5��d +��a e�g��,f��[��p�X} [7�m�R<���O�(>�+~k��Ƹ�� ,���Kx���MF�`0{�NB T +=�*F��;�i� +�a��!�a�\!�ͽNc��1T���d5Ep ��C�s��P7��8��MN'  +��I8��*�(7 [�]� l���0�|.Z<���u�K�WO��Ṃh���ϤB���g��.06`�䞤���]`@v d��Pq����Q� ��:o�]$�a�'���vYe0��?��}qdz4�ݒ���#�c��}�Ǫq�qsS��%B0c,* ����.�Q��!�ŗZ��|"bIb_+�������]f�q�Sw�Ii���{�t��_@�G�Y��@���[��H��BX#}qT��.�a���;��?Ai��b��%��/^� /�(Utc�=(1@�p��U���������$�DP=DI�iů e�X�K���?���m'�R���-��T��gSq���v2Й�)$%�Y�K R�-�Y� ��/|��p�U�?� +��$mH$H��x闎�"��K6s���(���u� {{��ʘ4B�bJe9�+aa�C˸]2���i�N+�\w*jR�Щ�)��F�I��h���7��E��Aѡ�>�i��L#��9t"4RCI�8^��1�_�c9)��C�J����9 �H?8ْ��mci��~$�� Fo������� \��E@�V�?)���sr&���\0�95}�p.i�Y�^�_�n��ր����˾��L�����D�ۉa)E�W�S]��? 4�8̉^hX�y���loB0e�g�ɦ�~i�# ������m����s�eۓ��e+2������� (B]�����?ݻ�'�l�+>�댪_f�����m7t�~�֍�^�g..��4&�7�� �޵K�]��Nt�����t�������]o� T�= ����>���O��}�5�:8�\9&o�#e�%,G�ܺכb�"̫a��59��?���I��~pa\3f�"��Q��J�1S��i��f`g5Qb %�H��D�Sp���d�o�����u��{P8�/������u=�� zϓ̺Ǜ�K��1ѩ����c&��cZ������3G�$%7h��Lx+b +8m1 WC�!}ˍG2���1N0rl8t��\��9Vi;�����hm���gw��M;<��,L��\YJ��W2���=�ٍ!\ �� ���QX$� � k5QO_�~�n����u� �Ȏ+�dpKD� �D'�Tx*��`O�6����c�;)� +�4���()���$�?9���N�f›0�H^�1�=�o��5��t!�S�س8��5H�=�]Yi4���(� /�(D��!y��K���c$��BD���b�ą���޸�=��*�<�p�坎P��u�K,Ct�X9`�#q�Vo6~�a��U��kZ�����.�9���� =�\=�Gc֞�D�I�C�������(|xp)/��=�[�*,rے��L +�Ĩ�=q�R�P����tղr�� ��p�cZT�� L"�)���� B'�б )�i+��{xJ8��$�5��_.���&�Z��8F:B-x��G�����`�� +���,S��²sgx��@;�aPI�8* +�%�z3�)�$�u&Y�5�f��$��Y���ɼ�\�$���Kz��xtࡆ��{�xSV뢼\��=��o��Uf�,I��.��\�*E�WyuV���pe���� �C�ԙR.��r�߅P�+��F}��*����?�ѲuJA6�?b,9)� ̙L�߲ +��2����o1�ܝD�'�vK&X�eby��:���߲w �L��]u� +)�a��ݓdh�KG���%V�+��~0 �Y�QIv`zH8�A��2����h������� + vL�p1_������ +�*�j���ppI�lPmU%& {0��\�cDw���@ ��������]��g����@o��:/P-Z��I���T�H���d��ď|y��H�:k>��;����?l��}R��8)Q�+���ye*�03uL�T0�dr�������3�o�G���Qh��mqV5�C��K��/pHMK=/�Z;@�;N#*3�L��]*J=�6V�2�$�C� ��h��4O�݌��돍��-��3��#�����؏Ã�X�"�̂g���&�j�=��\B��O�QKS)@w�L��j.w��L�|�Z�δ�r�:Њ�S�ܼ8��[Da?��$���3&4�mb��F޿�߉�3c�A�M�$Q�vS�U�4M2 &�i�<�ԙO��Ǚ����?��6�8t|z�Y�J��=�X�`m�9/q�ش�c��wOu��LT���33��D� �A]�L��*{Mؒ;G��Q��v�3}�!�1� ; +>t�<3�4� �[z;��fmF������m�Ϝ�[3�%�y$۪ڳ�P����;�3�X�v4�8�d�6�o����e��oι��Ğ3�tx`zB� +���?�*0]u��qF3��1�i�:}��mh�L��F�p����~�AzC�6�J�N��s��� ?" y�CAp���@�Lܛ�s�?O�o���W�ŀ^)�uf���:�/֠yTI\�X.H753������j�oaN���S3e�@1�c�S��� ��f����X�?_BG�Lgf���wٝ�Ѐ�X�\���}��DQ���P�uf7�(ɬ:s�`������_!i:���U���ŵ�I���@�ՊU�1 ��&3G�i4�>df CSS�ԓ8E�l&۾G���Q��A�j�������{x"�h>��Y�a3]Z&�Xؒԙa���:.�V$=}���Ս\:Y&R�|Vg�F�a�w�ʀ�Y��?�cw��Ջ6�m<���W�>7�!��JGݱ��N]"�ެ@]�׉�b�c�NMy�8�>����MC'K��>��5�*�Q�N�}�m(��}w�˅���j��(�>*V��I=Y�e&:�GX��,a�wo�ړ#zŎ�U�cn2�/��p���������(�n�k��d������̹<�Ƚx[P.�U��p�V�G���өK_�E^�o6��9��o�./�f����r\3��� �������Yp"��L����虛b N�P#�{8oKG���S`g|s�\b��V��S��2���yq:���I;���9sү�8I���8�gC�ř�W���.�(�'�^���q�8�<�� �8gY�"��ٹ&P7-NԟzO�s�T�v��/"�*N�!3�8Mit�a8uUY���'Н��NGL��p������պ� ��k��g@�y���m��½�� �h�K�!4C��_�� 0t����m�� ��F��J�bZT�y?�-��i��^)��}5۔ +�g�%�l����0�Y6}\��nٲY �I6��KC�Z�ͨȔ@G��g��"�&'�e˶�y���mr����\m�=.[�,Ҭj6��W>�~66�g{W�����%�g���<�g�a���?��g�V���g;y�*�`FO��H�Y�g�nK�=c[���.��D�¶a>@f�o�O��1��V8�0�娾'�`�3v����3ȩA^�,�.��?B�pgWI�K�x����\�ڋ���ģ;�dWAoJ�3�=�SM�� +�i�)� J-�\f��sz!���q��h�9?A E�K��Rt��9u�(���<���!�t6�҇'�h��BD��q�.n��BG@Ҭ��;�p@Xj��xz��H!�[�ڸ�2-�����j>I��R`h���_ +bM��.��Q���&��#�rj~H@Y%⹼ܴ�k4�X�x�3)�M�Zџ�i&@b�7����ߺ�#263h÷������N2ݏ�� ֢��[��p��*!�E����(tSC�����uo� p�H��ϲ�w�}bЛw,>�Ll9��3kNHq9� �}M�2{�ߌ��0�a��Ǹؤ�a�qN��I���Pn6�b����oʀ�&������%K��p�H�T�Q� +Z�Po_�l���I�0M��O9 Mi����\GM�5k�Tf� �HFȣ��'��UręV����;�Vo��O搆1A���F�Ј�v�W��q�4 *��� +�r���{�"�hH��7����R�KޡXZ�Q�� N4�n��� �f:�8HeXG��~��f���z<��Z�'3N�L%c�˜����i���P` ?H�1v% ����t�۹�!�Z�6���L�"������e�M�-��ך��ރDi2s=�i �2Qj�i���I�0���N�,�E��rSګ����6|^��㲵���>��*�^�(0؋�t��oj*�}jH�PEk����vf�K�9(� (��B+�aG"��J֮+D�_n�Jk��|= ��P���q����)7�:�~!�(���)�VY;I�\P���y���(���=�<4�,zϢ��[�x�����y�mWc������M���kR1����YS/����]�;"]���=�㬵ҫ��vŃ�) 8-�+6��+,��(evzhFۺ�El(Fq���6�8�0�1nx_aY�e,��-�=�rх�C��K�"��r�v��覍�z��i�CA�;�ސ���E,-QUq���ߚr O޵V�q[P����岺���Oހ �+�؟.���`��ff=����5���W�дAB��>���Y��8X�j$!jED�k�����Q�B�*����qv�'*��X.�@�Ƽ��F]�-� ���9�,v��߹H���� +!��ܜQ�/�C�;�\w����y��n��5��L'�aQ7�c�3 ��)eo�Q�x�s�΂�8l=�#��v�A"m&`���H�����4�m���� c���Iz�<3�+���q#:%In���'D��L�A!u�E������Z�Q�����B:O�g 8A���؞�;�Q ��e�\��|ʥ*�x��&�!�T�|��P�Q �&��$ Z3��2 #D;c|vO4 +˭�2F��t��0ﳅ�,|�E;��v�8�xVF Q�s\�b���8>�DN1���~Ŷ�z_I�3ͪ#/aD>XjE�ڻ���~��;���@�5��'�95:,^�8�仑��j+\��z`�͏�O i�F/�Gz��%:� +� �)���B�͘L8�O�������a�4�L-D�@�#lI ���M���l �b��Cy+�A�:iL�AE�g!8�Z���$� (��DEO#��w���u��O� +`����o����vǙ�E�V���R��7Ug�� ��u�z����Jn�3xof��.�J���@�W��er!m������]yh�� ���:^pԉ� '���$�2U��o��o�W.@,�t�O�H��T���Ub���,�T� O�,++�����n�,#�k=��_��oCy9��}� D_�#��֟H(V�<��gz�����Oޱ�+ ��8�<�<��t�^G��.��{݇�x�ٔjYFyn{Eo��-���g] [�Q������~�M�P>�cL��ޕC�H��E�jYF�>(�E�ģv2�>��y㥬3�1�*n��~�U�2c,5 v^șU�` �d�]P�ə�0$ �42M��!���!Ͽ�"ېF��.M�����Ha����+d�Z�l��ٍU91��քN������5g.�;�d3O#�&�Nd���a�^I��f~�X;���b� z���x�,���#�Uo|�1��زA$t��>�(D�l��(UD7�e�H�;�K�k��0m{��edӐ�G��{���J-+Y��$ ��5Y3��������d�� �M� �����M�R,�� X�D�7��� +�p X��A� �78��o�$��!�� ��� +��i���L���� 1Ӿ`'�g�T{�D�����r/��5U^β�����Y�����'T`��v�B&C�ŵ +�ؤ��U0�QS�e�0�!������c\H-.�Ĵ�����f}�hZ������&�������Fgh��n&�/���簻���fJQ{��q2��W&/���w��փ����}��G�Jp�6��ͩ�>q�|j��rS�<.��}�5���k�� /MN�M��Sm��Ý���Y��`l�q:�j�B��/e����z)������?��>�Q�g~��P����v��#��SU�����n�*7"�������� �_��Do�C��m�J�)�2��� :�����~���u��*�%xr�6����_?���8*��t���ʛzػ�$�MT#�S��M�1�c���r J��DC2�d�ńe������D� �(I +Np�Q�.�1H���4���}������&0ސ$ef Nz2BƲ���p���T������䮬Dr72 �}��6�K�4r6Q���Aꃛ�ϸ���� +�Z�����e� +̸���-�����m��앨��R{���@9D![<�����&C�ѣq����4X�����$C�_����~.��b,��,o�*uN�+Ǭ��>��bAoBY����%�px���>b�+�>4�����>�X��0GE�׊Z��,� (��δ�bzl��6�̭(/��PWP�#mL�0Q�.k�� ��N���%NˋI����/�~�Е`��J���� �d�?�M%j�Z��<��j�֗.�h�p�L���EŪ3����I����ơ ��n:4��M�&N�qk��>7(�CŊ�=�Ք���&�) �u�Ɋ�*����?=�܍O*���1�{g� +(�����T�1iǂ�W��BGa�c:rDYf��Z�ﲗ��}�vPv�M�>�C=E��Ӯ�ZUZ�� +� q�2�mY�~R���x��<���G���y���Z��%6��T�a��C#����Y�'�8Ǥf���ݒV��T�\j�Z��y�f]xT&���V�ʯc�J�]�_�XΞ�E���n��'��`�J�H%�|�W�X2xl��j1h��5��"���e� r���i���{K3�~@Y�� +�z:f�h0J�"X�u����ƥ���;� l/#����FkCůY�����_FO��0��qSkl W�3 �Һ�\�5���: $�^���F3���v���{�W��:0�Ŕ�����&tr���t�b��8�$-��2��A��Ax�Ta��$mj�n*�?���p������%5�b���ծ6/�������W���uĺ���y���Ya�d��|I�0���z@��3a$�Tm��3���MLDd��r�Gl��� ŧ�����HT&ڴ=[�#.�f�ο��믐�)V( aК�p`L^`,�;3��L+�d7 +% �a.��� TDg3A� ������Ոr��E�ꦃL����NlW� ��q #���w!E� g�(� �63��L~�Zo�L�DuJ�^DnhU�D��U0�%���:��X� ݖA�����ײ+�xd���-�3A�YY@,����-��9�ZC��k�綴 A&;v�}�P�i�{���:<=(�����+D�Q����g�I�X��X$d�*�@>���Ǥ�t�Ϟ�u�f�Ώ(�������z���������>��E��I��� �����e��f����w������\��ƭ[�Tr��)�G3L�%�M��f� =��8'Z�p_�e&-��/��| +%��Dymo����DY���G +Ch���6ײ �O7ӶwA���^�O���(~�9So�= +����T��7Sm��:�EJ��\��A�o4���q�28/��tMo�h��e�ɏ�r��*�sB���9�C�F��ԙ8�-��Gl�צ4�(n�tH�K'���lY����{��KaDн�g���� <��$N�H�tWd����ܾ����!6�؀��5�:1Zmf�$��z`��m�8�|:�a/ᐥ\� �\|%�J|�^��-e���JcS�\�����_<�PN�nWB�C��8䅌Զɒ�VP ���Ì����F�����1Q��GN��Hd��� ��8E�^D�G͞K.l<���@V-�k�i�_�� � ���19�2�����4(=T�U���� �[0P��0����!���|2�@<(��G�-x���<����w|�w`�xY�ೢd�YP%i��7`I���� 8���^hQ0�O9n jD�x�ZUH�������N�^��$��-u�����V���f�VɰS��ɟH[�*��� +}� +��T`|�se-ĩQ�| YTw��T@>��l�( �/L �#}���TK�5Z�NظlY�\ �Z �`-$�3�%�~��s=�g(�� Lt�e���N����}���0�K�p~H�|>�! ��8!�B����,� ��� '�G{A:�>����/do'�JS�XhdK�%s�*z����j�uhI����<���P�W�-l�5MM,�`n\��GI���h��h$O��!R�P@+��2����:�v�'�M�A{^�H�,NRq��� q�f��" �ȶ��`ࢣ䇞�Ј&B��J��;~|;>�M��;6��`P�ZA���-��b��Dދ!���� ��! w5��f������Zҗn�u���Ùv]G�#%�����|��h�+9>��OM~�f`�ϒ�]̟ c�:P���T�Z�e=�c2%�޺^�����t_6�|�����W��PI +�K��x���D_�g$ʑH��D��AX9=�ZTÚ[��٣��8�DՆ�Nn�A�#jp�<E��7�\Up~�g}���K�xE��a�6��Gf}��0J#�,�[#��ۂ�Y�J|��y;T�6 �%�##�0�ϓ0�I��`{Mfχcu�o���g��X\f=�"n�� �J$k�����v�xz��㇇�L�#�?�� �ܤ�v� +򹏷�B��Q�eP��8K虡�iӪ��f=�:�^E�p�nF^%a��>!��:?�"*)��i����(�Q,�Vgo 8���qNJw"������L[@�oI4>c\���ɩ�@ݡi2��G�s�O�p�� ]�S�Y�Z��l��V3ex�DEU��8��W�U�ڏ�[�������0{�ƒ�h����P���(��Q� Ø��|��{,�5=h�<�e34�T,�[vt)c�� )�k��� �]�mnj�!�%�K +j� 6�J�l#r{ ��ػ.s�"��ؤ�-Zʞլ�BP����V�l�h6����0N|t�Z�(%;���5aK��GoYJ���b �����V{KnrGsH���O�]#F��/4���?�E���� �rnJW�uDz�X$�K�.�2m��0 ZZB'��X*|�B6 o�Z��o`f���>AՓQ`�<�@+q&�4�[_3�V~�ɠF��Q�{��K*�$��ϋX���E׍ՠX@2� �;Z�שT��{�` ����\4w�o}�E���=�v�d�|� })�n�b͝��u�&b�K���JXa��;� +RU(iemN���`�J-Kz����-�c���Yм��,����X�@.�B�|�}[��� #�q��.����"��av�����Y���)�� +NQ�G<���v����k�J�"��MD����G8�Rݟ"2��L�qa�v�p#�����4��N�U��†�� ���E�]<�T� �%�c���a=gf�����`�%�o�����L�� �@�~?j(:��Ae��f��ĵ�ڠl��#܁��dz���Բ�:SÌ��Y������8_U���`�!� =�xJᅇQ�V�jp����=���UbZ�0A�� +D���"�A�߳��ċ�� �b +kd�W� ��J �;�Kv���[�t�@D��j�h6���$��L���ݕCm_,SIX��>KW����#��\����F2%� �T��ܥ39��-�� x��] ��M�QYVwʦ���l�;��zQ�����������Hf�G�3!$=����P;oz�9�- ����}6p�����Q��3�N� ���i(�#�YOC�c����[ui� Ԉ�jIe !�=�nDϑ[n���VU��-=�Bj��l�@�~=8���Ks(�b��: ֫����Z�4c5��*Vf��І�կ�����n����� �4����Zqx����X��m�������� H���S��� {a�r���' �t,TL2�������'��+��.�n� 8���p{����xķ ��oׇ��}��$R�W�C���3�u��?a����F#��\3���5�w�H���Pr�*cK��˦:a�� 0�{�� +9��jI��$=� n��}���T"_���H�6�1�����C��%�S":�wQ��jG���M�}g�c4DU��8 +q��H���?`_�#:���X�'M������?{��T�N8 !wA�FkӼ��b�,�#uUJRʔ� �B�� ? 0 ��5 �r�kF��j�y��B�!�*G�<�k��l��X8B�U�G.ԌE�p�u#��*�4����;�EIC^�*��K��{C*��Ӟ���PVMHX)rsd��${|� ��KW��|���:� m�4�Ħ8-Zdz6��DH#�j$%ۆ&��"!�:B�d.J<^3hJbU:U�6�t҃&F���m�;�Zlx\����} #"� +S1��(3�xj<�<�y;_� +R�*"����yY��*HPE����ĨU�0D�Q5�.�!�� +���Q �A� "�ZJr���KT��C�ew<KLOI��I�ឮ ���'S떠�-�����t��}��c��y� � 4�F � � �@d�A`0 "��0� 0��!��� pA +F��`� ``� 6�h@h�� P�\0 h�� 0F�z`� d`��%�P�`Ѐ J�A#��� B��6��$H�"���h0t  p �`R%@��`0�3���jB�Jd,]��Q��~)�h NH�� ��D��Ucj���(_1㸷��j ,�Ă�e�V����b�y ����'�,�s���u1�ٱy�L��{01q���áH""S�:Y'MЮy��Ԫ���V�S����k�Q�$��a�X�P��N��aq� ��;s�T �nn�ZTj��»��|���k��24/q�G��Xb�ޓ�P�۲ ) +�̋��Tp��>hS�TH�+��*|Sr�|�$��MPԸBs`��y�!xf����)�A�,�A2����؏��C$�8qF�����I���P��C'�m�T���������4��u���!nBx&O�jP�����3��D�"'��t�]�VO) �T���'�q�^^d8cM=A%sW�Si%t��:G4@��Q��5$E�F�G,��?��S��~u���;�"�w��7"15�Z�۾Z4��`��$ W���A�\�P['��i=����l"R(u8���:��lW�)Vw 2�2N8n����s2���Uy/�!��8F��QG�i��tJn�Պ�qi��N�l������=`5�(R���^uJhܜ� EZ4�\j$y˴��sWNšZ�F�X}U1 +,�����:RGT��9�S�zF^ү͑�S-�܊Iτ�r���,N'����N�S�� ]2���B.��  ��H�b#t e#<��-{�F��6V��h2� +w +2r@��݅|R�-6�W���{�O-�I��.�ٽ5�g��C� <�Pѣ�ȗt� -�;={��V}�JC���+��S� �h*8����%k\�8N����%�0?h}��F +.���jpC26�M��Ec� +�~�ף$_�I�������g �A�L���Pm�S��:�4�\�:)T~����E|�4S�*����3J�v�&��^�F�����|35w��V�~H�C����.c��N� �Y��r���K5� � �� -��zQ�ħ�de�>�'�#]E�Xj�j㭨�WQ��Ѵ��3��j���p;GƖr3d�kᰎI��m�,q�e�!�7ښ�e� ED&&�Ja���@dIqFJ�L�����P`I˹ʋ�� +E�r��H,r�rZ��'��V�Z�4�R�65r�|4͒��ݞ��x5{$��+Ͼ�~��Bާ�Փ9� ھ��I +��ӌ1$��HF>d�%�8u��Ž��WMKP�#9�F/���K�T������EnO��X�����8Z�w)V8h��>ϐ��%㢐��e���G�A�F�3�$bd�OP�ߪ�6/w<�K�9 +�beH�T�5���'�0e�ۜ�LR�j�}0��c��2�B +�t�%� �P�<���ԕFq�Fy��оj4��d�IV�Y e-Ӣ�al4��I����a�B�J��'�^�{0�����0�pbԄ��1�4�2,U1>�"�G�T��=h� +�tX��`�a(�X��5T�R������ɜ����A�UT�洋�~C;oGń��� �Uhg� 5�$?e���t0��g;�W� 3���9A$��˃�B���9� ��yO���"ɳ+b��03!ꀺ*W�!�J�5 �)gf�x"φ�yQ�6��6�L�FB���"S2Q���� IM�U�4���*��*�A���,"u^Z��u�5)*[.!ޘil��#Q}����� g���%!����,%�y���"Ҕ����<_(��7� +kʝS�X�V I,��o_�ld�+r^���t���ړ���M�%N��N��B:(��ʥPU-s���mG�~��+�*���F%�S��z˜�U��x(�M����΋H�|N�w~��q���hZ*R��)6�UE*JQ���.!��ZE��ʮrM���L �F��1�<���œ3x@{�z˭y��I�J7z8V�'�u0>�%?�\�IO%�ѩF����&C�\�WQ�2�j�X�ܳdCdL�H2Ed�#V�fD�+��r8:g0*H��D�զ�Z�2�%t�b|e*���ڬ�!�&��e:m�)z}+VQ� ��gv�sF-�X����ݍ]R�G��YdOe�[�L�.�ť؊V�C5���V�Z[ ���; Gؔ�\#��\�܋���U���j��k�n�J~}R�Z+��u�/j��Ud�[֙q��'"�E�2un�x"�[J ^L �a�W �&��EUMΗ��� i���T�>�;�M�L�R�Şl�7��&����Q���l�`iy�N�?��D�d��0D%�o�C����*V�#��吹˩,DC⍞�P)�#�VTԩ�d�O�!�6Q5G_E�iVy�3V k�j�BE#&�B���B�'�<�#[l>a���,f�M�b^L�J���]$zL��i�,���h����(��Q�}�v-ʊ�!9h�d��"# ��!ʸ�J%;Z�P�*�=4�������§��Z�U���*�H#��L��O�RA#}�+U� 34:U�%/QDԡ��6JQ��M1RNg\*C.w��y�Q�3�S}v4� *Iy͐��MiL�MMcf�l�qjN��"ed-� {��3'�4Qr� �i*N��&O�D.GC��0UPxZ43H��i5�)k��ije�< Q��TS|8p0q�g�>T/�)V� �'0��J!I����%T�Ckd�r���4zJ�y^D��s���i���i�i�5=����E�i���B�����ѧt2]�����1��J#��=��b�(,��\Dq�^e]�C�1�m�nb����6����*�fD�(i;���Ǧ�����|�O�A����* +C���HU1��T�h�ff�I�x|+�' nryPU�$܃}Ew�~�U�=�Y�89� G� �bh�* �sS^ y�`��J���P:G=��.�z�� ��/q��1>r��5Q�KX���u���?� c��E�fV�8؜�j(e��碃�[����g}�TO����T�ּ�`U���%,f� )P�#�w*�Փ�ҁH��tʜ�5�:�:�uFD�y�t,��q޶BI���N'�Xt���#>�7�5��TE�Q��)z#J2#�V��cҩOȄ/v\�MeOHb�!�Q +R5��r�z��hZ�F�?�A�e��H��h���N�g��*�'�� �{������!"9qq� \d+~��Q�����)�po��{l�l�Gģ��5[�T+Z7R�jd���Z�[�s��Q�G\������IH'#��b���D0�԰R3&��o�"7W.x�'ؑn6Y�y�A���)��&)Cj�CJ�����[)�R�R���Sj�i�����H��_�����T6+�8O9G:TΨ��{HҶ�V+7ݘ�c�t‹�L�&+7Y���optG�� Y�m��ꤑ�e�W�"{�D� �}BS8�E(��A���R��j"rR�83�W�!��Fj�Lƫ� +"O�"]N���7ݎS�\_�"Kb�Y3tYeѣ�*>� q2���%�2^epE6�b��y��b]�!��C�'>E��9;%�O'rٻ�5"���-M��(����%�rJr�Visռ��^_�I�q� O�wH1멿�7b����M��EFC7Llb�XH��]��QG�z}yT>S!�����V6�T*B�~ie���MI֞?W�!�c�M�Y�V�7M��gĿ���<EfŇ�O,~��R��s�x�V�Y���{��U53kOݔ��c� Y��������6�3�B�wV���N�J4���O�=y�x�G����,�λ�����h��2� Y��*�p�Se� �6� G�^hr�iG3=�F��H�OF�I;r��a2�EF���/Μ��zv�Y7�I����f��M��Ic�}�=�yk�!O��x����W��<^E9x�ʎ��U�Z:�_��/#��D�M �~�w�6�Jp&��1^:"?Z[�6��7B�'�K��׉��I�F�+��h�a�ۻ�ŒE�q��6���/e5ʭ�blr9����";G9�q� �k՞7oq�-R�pJ��lK�����(�\r���D$�V"�Gt����D!qq"Ju���_����r�\�La��b1��I���>�(�)fIܦ�I�x��Y�pq2ō2>s�S�'�x�z�mtI�xM�Z��/&m�c"a����|���?% �'����S�+�1Fe~/�>B�TW�t���h����d��9�k�)+?9Be�4v;��kL(,"�3~��]3��(6^D/X�u�]�7w��+��*�pNq5A����SDrї����8y�#��]P��->S�6<�B6,�;��k��dfdfA�MQ�� u��U�rb�#8A�����EMi���>U�㉰(j ��!�-��%�#X ~j����{�l���W��b��F �F��h�o}��y�����D��:^uDj���M���j��x����f����j8���j�I�ToZ=����$�?ҩ�;��#1�11�Ra".z�vˢ��R}�9+�7�p�� �9.#�V\h2����!��J�m���DQ(Ƌ"?�xӂ'�>���V͹/� +�U3_P�Fy�`�9�Q�tÈ�*> 3�5� +Ƣ�)/S�<�������!4���a��tU�&QQU�3�f���؊��{�*���Ur&23b�ԟ*��N��D�&rZ �oXR�<�4ZD8�qR �yKrtn!��d��\��Ym��j-$�U^���N��.Nf1��ݱE�r�0Ns�h��̋�lP*��Ϥ��S*��}U4�M�"��|2������Pu��蟋���b��A�H� g�o�Ij�/�1��[�@j�ȏ� _3�tB���ݮ�֥�6�Ǎ͑kȒ]��U^q�C��Jp�QU���Jz�#�F^n���WQ)Eԅ+�$}p��ɂpw��b>�hGm� m�`i;��>�+���^�H��dP�|�+� F�\H����XQ�; +���� ��8z ��s���$���GBW=q�e2��9� Y�yu^�;sh ڔ�����B5#éEf��tbd>� � /�� /1���d�" �T�/�|��"��:a,mX��RB$��V=��f/4Վm�m�:YkZY���G�����~h�K��=�Z����6�4�7~�,�S�`��`��@(��  < (�Z�*ȸ�y!44��Qq��a�V�\hf\�3�M*Y�D. �ˮ��L�=��?���[l��, q��p��>�O�ƙר�Wj��4�aH"]f�� ��ViKc�Z"N�,-�t�r��VT�gi��*�������X�.��08��=@p��}� + +iU�#J%*� �� �D5}�V��-JT��;��Z�ti�SM�f}A�����*�fC���I�u"�)��~N׆%JT�D���S%*H�g�zp��N+�d_�D�ِ>�ͷ�|.��%�����P���'�N_������O�V�쿟��|���,N���@�OE������9�Ma�~����bD;B��0�B���s �Pa�d�B\��YD������B��s���~�^I]X*�)�n���[0$�����o�g8�S�B��%��C$�U�6���@����j�.�b��ܹ��#/ ���s��ݢ�&��H�Ǵ�"c{|gx��� +p��+$|*�S�AQ6+\�bbtK�R��x?� l�)T"(^}N��nubs#��B���0f�v�B���SC���l͵���:�4����$���+n}~,wS�.L� +|#�k\�PQxL� +�Rr����4��*�a� u�P�J�� +���a\%D� +��!E�M��4�8��G�w�E�bN�`BU�f[d�A'I�t�S��r�H�P�M$�>9�P-CF�Y�f/C�脊��\�.�dB��� �~���8� +�Tre��QO�ƛ;�h���<�R�*��79J��3e ��)�X,��Ф��� +�����*I��������Ce�#T����*������f��A��P�]͛3�\����x�0*�N�Z��%Tj�Z%�+V��*���|hu'TƦ��a�4�<���4�~�iE���4�W@�I��gW@�C0��o� +hBe|��c�F�-������ U�rg���aB�XG{��7�kBu߯���g +L����Q^D�'��J;��׵rf��&Tr�zj��yB��9�Ẅ́ +��ܦ�����5b�Q� @6�8;B�4�C&Tx��Ŗ�r���{4� +�Ի�Py*���njq�9 +�� �R��(T��I ��%XYZ +(TB'$���M�B%���NZ����BEs�?�� �88���7i*Tˋq�� +�D�r�b�P��dC p� +Ց�[��i�J��ga#__n�m�Bu���� YW +S����s +��,���ȋ�.*�j"BA��&TC�B���&�O�n���� ��)' +�W����̩��a'T�Y����՘k�4��od԰I���w'�'T�2o|�Ώ��) +��Ӫ� !�)Tm�^}yA�3��2�*�=�VS�]I�J�J��N ++T�$�+���]*��%�wZ�� ۂ2Y�\0� +\eLk��%>��O?�q�*��ӛ� +� �B�2��_c��%|���߀ÿ:A1�9�%�� +U&�f���P�#�FdJ����1ϔ@��n஦�*-��cG��H�\*%(T�o(�:��@=]��B�*pQ���; GW �-77�B����|g3�4%m�L�@/�T�*IzA^�g�'TYAS� ��ȴ���&T��? 0�9�� � ���h�aB�Inߙ�i:E��7—�P�D��d[���K�zh&T�;$�g���$��L��x�5�U�W�H1�y si��� +RHX(� +�_.1oq��}�\����' +����p=I.)T�� p�)T�C�f-���\ɖ��Q/�+�J�%ʄ�|�P!=�&��B����d8�(T|!u��k�B5Ž'Q_"���ޣq6��I��'��ʫe����řPY�n� U}�{��efB%��dV� +�Z+�E��^�"T/���%����ա5�E�K���#TM`_� �sp��7%e?�P=F�OLv T0u_Lh"T�A1�+�+cΖPņLK�$T���)pzBU �%)`�J���C±���)j���bBoy�p6#T����*tK� +�s yD���L�"TI����q� +�jR�������j�6~"T�Ԣ�n���W��#T�v%��4�D@�i[�F�Ġ$ ���bg�I���q}t�jݟ�����tLBe0+��@��j,aVD���9� ���0��*nF}�9�K0� �!�\��F��Q��;��jq�+�j"��PBe���(j���L��J��5��J����ښ@1%T�X* i*ŔI����ط;l��J�(�Ar�9B5�����V�Z[��y F��0{���$�f����s�҇��:A�*�mw���BX"Tk�G����7,O�*��z%gX"-^�Jz"�P��h\2y(~�?��IS��>��P��c��uBşn+�� ��s��'����4�T��u9k"�� ���!�"H��nN�_�_\�nW�;����� +"�B����v��\#��4�Pi��K�P��hf�c>�@)��s@c������;���P%%�C2"�&T�%r��bCPY��y��R�-to<0�:�$�zsQ�1��۱ 5�%p`L�^�Rp��:�ɄJ ��EמP�SW���r �|�Iq(КZ ƀu$ �Hv )���is>)���C!nH��M���Mp$T��x +� &` ��� +���m�XA*s�l ����DTB%I� ���&� 9�$TS�6���E��*�mB�a���'�9��%���B�Ӊ�K���^��T%T�Ѱ�l�$T�pNV|��� % ՁO|R�O ($joK��arb���q�˯/՗PE��� S@�P�Rlu�� ��k�@��$�*f^q[$*"�6���ꈙ��9'T�K0b�V8`�B�I�s�=S�85yM����=�F���'fL*l��v ��O�1A�*Y:��@��B5�����oO�:�J��?�j������B\M�J�(TZOеOtB�q0�B&T�ySv�P���am��kElf�P�Ol��(`I�*�A��[��ZT.�F�|�ģP�)���1��Ow(n���,T�w̍]��*F?���V�-T����s���[���(֋�*v�� a8z,T@��'� ���P�8�S-��l��B5����B��E�Z�2+H����J��g�l;�`�3�sg�4*<֥V�V( 3ô���B�n�,�h���T���PW*��P�@,T��i��� +Uˎ���B����8M9�<"�+&^�"#w�|�ʳk'T=R׵f�� �C����U�L��� �*;w�*�����P=� � �P&T�H�#�|�W;�"���rBU��z��G%_O�0f A�I7;���A2� +՚��Cp(o_�2 �WN=li+*{� ��Q�r�G� ,F��J�#�*�/;������j�-���B�ۍ�*NZ���;��Uj�B�Z��+� ����#vSnX(�p/\����8*M���o+T?� +]��vx�r�b�op-T��ɟ��g�kK�B5��?U��LSq�n�R +�kU�8� [�s� X����Q��7��H�D���>��M���ɎA�Pu^�@^��v㯌��q0*�3T����Gq-Tb�zm5�**p�@\ �y�iKg�Puw��λ�*u1TN�3��U`O;*�;���� Y�� �$A���l�8pc��P�U08� ]�� `Wt�A��*�7TQY*�$ލB^n�`�?�'��P��VB +?���w�P�-3B��zŽ�;TN��v�d_�JH��x^Q8�Ce@&ظ���v�fرsY�;��^��P�5�O\��J��� �s�� +5�`�;�QD�S�R�� +D�'�Z�&�����\\2�Fxf���P���<�����Bg_�r݇*�n��3���?79 +�0 �\?uKT�@Zr�Օ� +���n�j7�r��2�cr3�NET�� [��b +�͆���UA��뵟�����jL�� Q � |Y>QA�ΒԜ ET��,K�酨j�pu3J̘2��J��Y<;U!�� +�������j�Q��wY���63Q�(�n6hʁ�ԋ��IӼdԮ��dg�����G<8;��@T��Qq��7 *�=\3��!�eK�H'y�� ,���!D�` eN#��\�\G�Ǝ�i�� +�vq�CTML�@TraS* s�e6�9�=T��c�lI"�\Z���m햣lU��s�"�=������ �T�2�d��>����6\�G��F����R��*� i}���Ͳ�2�`��r衯-5", *�ve �BTmK�E�� Q��t6f��8} �l'D%�@��(�- +���R��)�CT&�LJ�@�>f�j���c��v!�R��&�!��Ōu��rj;�>�&#�)d"���T#l��$�� J���NV#�$��W����]x���((���h9L�ac��-�ŭ���X��UCT� sr���RBT�H� �^�N� Q���z�G��:�~&_/��RW�>U�j�F�V7!)MBT]��1�g� �Ҁ������\^��pn�q�CT<�]�9݈��wU ���~�����ϯ��������BT D�,���P%��Z��?6���k4���r�*Q��[,������|���p�ˇ���{�u��-Ǩ'_����q��#��/�QF�q�%��4�����P��T�=T�����u�c�b2�Fi;�,˧��]��]����[�mӡ�����l���<���e�/���C�l�d��̡�}$AqF�j����ءB�|�ݹ: J����CdjgKq��jN�qNt��̙�gW����H��o����T�u ���oَH`� ��W�% a� +)���i4$�-�g�y�-9���G�W��|��ְ�zpWw���P�r��3&s��f`�UД�׺��O�D��/���i�S2X'�^(��M�ob~y>[,̋���0��>���!SK�r�L�����OY�2>Gơ�۳�Cuٽz�d�Zp�F��i�L���Q���Կ��%5D��W�>#—Usm �ηQ]�P\�#+D%��vQ  �&x��b� �3 Qɲ]��=�.e>�� IP�tC�!�wJu~�E@Tr��H����쁨�C��t�0�� �U��M� ��Tv�P�Ѳ�� +�O0���e]U��T��a��6�y���S.�vF>f<1���B�w,�s`~���P=�O�� N�XK(q톥�����v #DU�W_��z�D!@���B���?x�,�ᇨ@�es!{?{"*�T��%���D7�%QL~y,@"��d�5`���M7D%7vŸ(�41D�C�iqy��A��Py�v� +տ��h �@@T���Fg���bԇ�T��%jy��;��R�C�Je6�PA"������R��{����)�*?�>�C��k �u0܈��:��M˕1�Q �/�!*?�ɤ�3 �Bx��=n ��I�o�܀D���ۮ�hR��)�*vDT(Չ<*Q�����0�����:�y� �C���_��3͇*wA��Is@T�� +Ԍ����� ��ܸ�Zֱ�q� +R >H�x�� ���( �ɼo"b�F +YhV�9 Qu�?6����E�.o��T��"'�[�B��՟AdQ���q�l���2���2"_$>D�(͜� 9CT���A�5��m>3 �Q +�E��H!*�|f>P��[�} �@R j�4��aE��jI��G��G�D��q�T$��`(�:!���x n����97�QŠ ��,�k�#*�B�u�^#�6|^? �-b�����p�d�Y���GT�, L���t��[�F0�T �<�� +!$�!�Y� Qc�dT��R�S��~�l�� � ASUe��%��$�k����C�&QEh!�q�HTf��SHT+KP�:�(���c,�a\U@�m� ��D�*!�@x�t���P�iG=t�Ns���)��������۪��c�.�:�#*R׉)<4���v�#*�%�i�PO�SQY�Z�-�EQ��r�왠�xQ�2��w�V�L#*�N�\��K��s TE��UI8�~D���f�"*���̫��p�-����ΡRy��$oN`J��"1��"�4���S�k�S&�l(#�q���A{E�����6 s�&��9��#��9� 4�` +큉i��N�q��Y���a�����д\ka�~g� T��zmfȔo]����/�N�nwnz�/'&����,~ �c��]'!��ʭ� ��9ȝ�U��^��+��ѿ���xآV� ����~".ퟔ�q���0���MS� ���;��s�2K->'��y#ϡ��zH�@>�;��m,��G[l6x^ ~B� �lS�3�4-�-s�!�E����.�X��[�2ƻ�H�&��4���v�%��> Omի���5�=$٪7:�9Uшf� +)�<�c̡_N\��|�7w=�a:���.�}��]��]3����I�Q��ϒ��~f�9S�(�N�EgSs!�Q7��:91���p5yJ�G�Z���g���P��9ܬ'>�pJ0�G)&��_F���+���x9Ȇ����ѕ��p��ぼ�k� N�jo�U7!% +��k�WYF^�4�7���z9�埍���f��)ܟ+I� �� +E=���<� ےl�?�2�jl��N��@c�9^ +a�����0������,Ӆ�kg�i1� +hf�Ԃh�QW?>�=��.~��&$E��p��+}�#{�gr/�r��5)r�X'�j FV�~N���3�L�w�J��-r��2�����ܮ{^`刯X���J��[xEQ�����B�\:�%{T��Hl4�L��S4�9�� �-hD��jx�g��;Ƌ�27�}�(�?nʷ�:z�A %���dN��mE�$�0���4�Q��[�-��As�M�F*�G���f��x�1�BhFˢS� J"��D���R�$�H�����5C���b0���������68p`í7���L9����;C�DJ����On(��Ţ������Ҽذ_���~�ŏxi�Gq̙���s��wG9�W�b1n��\S%3��=?)�ެs�O@ �3!�����Ԯџ�W� �n�P$ƕu�=,d~�����W���&�dg-p�Nҋ�'A�k V����ص�Z�'��Y��1g���:�+GL�>$F0M�m܎\�r@�t� +ԝ|��@�N���ʲ��nh����e�����Lk�y. %cAE;S]a��d��|���Xr&���wTrJ�`�*�a��� a\R��H����D� ��ψ�j���(gɢ"Ŋ����zd��o��i\��E����#�WB�DϪ �G���ȟ�ws�8�]��OpM� +�%��r�w� +��,���;���7��}O#�Kz-oe�^�ɟ�Wa�w�� +>w��S��{{��<�4�o�"z�ر/����@�& 0�VO��1,�����"�A��&�w�����ᵎ=���"�N�S���p O�I�QcŒ{z�iA*$�ݵ6h�M�gFdr'�������X�������W�e��t�Ϊ�N���a_��9�fcK�[�z���%t�� �j�ze����K��o Ɋ�.�r�9�͊2���یR�̛�[�v�RoQ�,�B�2_é0�hq�n�e[3�̤�PE7��U�ϓ2������Ù:�J��9 +�2aU���]�����B�����a���r�I�e]��85�T�B��+�x2��]�8�A�H�&�^�x8�Jy ��:�U��w��*�p��.���ê�}( Lw|���J( +��Dǥ.Z�W�d���'�c�k�xq�aZ��ƨ�QZ܌��ӖŻ�H����T]��V�����U:z>�� ��)��=b�i���L�uD 횥%���ᒨ��Dֆ�X�" J��g�����D�y����t;G�� +�S�Y}D��ڛ^@�dR#9��S���bX�C#6�1��3�N��D GVz_�Y�F�[R�X5sr��t��@.#�J�Lz(� q$�81��Z�7Л��d8���_����=#"VN�p\� ���h_d� + +5�K��^L^�K��I�=~*��}ʂ�������.%�y���m���lĻ�v�ϢLLʋ�=�R9y��2���b�$������ ñ��t#J��/L�3�CYチ��C)n��)S�N���̲`\���*Q�#��L��x��v� +4��kG�$ߚU�l� ]�E�n�VŁ�ao�4m�~��9�Jm �� �50\�v�D��\ؾb���}��8F�W6�M����� ���Wó����b�.8ՋDl��:hj�P�i4o�( �.)�W���%8�J�Ӵ�A��R��6��F�$"m ���!F~WZ[`�K����QV-S�Ӎk�ƥm��c[�tk!�� !��Vgq�B�j�K{���y�Z]�JB3FcLg�Nb��i"H,��u,������ z�i r�w��R�$��{�r� ��Y�IzW�����܇��KT�3$ z�U6�s�0��������l���?��?�m����R��@�xY�0��3Ռ3�}U �X 7��W'���ഛ��{ ,���Ke|������8�D���'s�V���� 2���]S�m��tЕ.$�>��5�X���"�@�N��nJ�}�����f�]�B��ƹb_'!d0>~B>38&�1R����H������޼b�մ>�s���aq3�{��Q�M����F��}��\|��BiB,˶QCуǾ�n�� �7��� �o$����9c��Ds~����*N�h��~�����?�U�h��9���(i���[r���3�[���V�C=a��G7��e�H��.�ߡ|?�����N�LC��.� +�����e�HAɺ��ؤS��WF�4|�9�G1�?��T��P`5�q �oS�f��6�-�,�2��!���Y��k(3���h�հ� ��֚7��9C7�O�T㖆ՙ��3��͖�E�~ޕo��<���ijӎd|�ЋR[*�I`��I���J�6-��G$�� �D�0�=�(=���P�ldYW�*�y8� ��<¢�똻!�cO �!� *�/��|B:$ܸt���S �M�}x՟����HB��[��kZ�e� Lȶեpѽ�� ��ʲ��V��p{"��l�ʇMR�� ���0�*-׊�b�'bx;�{8�5R H�έډ������,'��_�t�Ψ,΁'\��Ӽĝ��R��4�L��ˬ8��5IF��H��Yn�ڲ�N@����ϥK�/7,��԰��$=J(^�}x�}Q�9U�8�?J�1���:B�!�+����!�Q-��Xa(�qo�ZL��ʼn�i:����vy�.������쳦�#�m�8��Vm�v �k�|��; ��)h�F�P�[��4��)G���5��ڼd�1�F��\c��(����/%�i���׆ql �xE�Ă��*�H���O��ž�&��Qϕ���|�BwN�Q��~5�yv�+�8���w@���)�S�� �W���֥j���{xvc�̎L��Ai����lXB���} +#�W��f��Ian�$��f��Et���>�*;M�?7=�$h�b� +H��� ��&�:���D� �"OΤ�Iz ����ގ��f�x?�%1P�/���|+Uϭ�xs6�]�*�$-D?]��jd�#��6zj�V%zMQc�KE����=�� �;-��Y�h^�� |� Q�.F��UY��aƙ�;G��x�Z���ujr�D#�uQՑ�3�a��o����j���8� / l]�f;��4i�G�ꪊ�G��憏�2�( �![�e��hFC)b>�Xk!�W�QM��d�fF��t�K�tD�[6�K4��~ü߯tgZ��w��U4G���l���wu/�4�i��i��F<�.�̺�V��x����m2L8�ci `�$o/>ڗ���܈�aqL�\��\��;����J�!"꽱vN �*h���]�7YV�DV�D�h�$m�Q_2P�Y��ieO9� nf�ˊW����a5��IfgǏ��ߙ�ف "�;��׾γ,��+'~��C'�%�;A6�.! +���/'�$t����q} �(� P�d�ot���8���=�&�!��9�,�g��l�=J�A,��~s�GǦ�(=� 4_���.�t� �ˊ3�`�' ��<s���"�6k�Qgr�"��K��"� f<��O���y)�N#�< K�umk�?��+�˭��a޳ �(_W�-yFU��is�K6٧�N�&MuCy%O�&�rZ�6�6��Vj���d�"��U�^�A&AE�#�;�sɬ����P�9o��`� ,�6��I/%���Dg���� +�A��ku��1�P�[J7�R�د83�uāO ���+'F��7�仧�Ak�D)��8_Q�������P��J�lA�51��a[h9 +�:+�ۺձ����X��9ٗ�Y���#��/��YԆ,���G�R|"�ٮ�!.PX|�a��� �{��݃�4O���$���֣ۤ9�Ơ�Sd��j)S�Y� ������Met��|�e}[�����6!EOɾL"A�פ��w/�� +M���a�O4ưㆈ ̋e<J +�$ԥ+%lJ]�6�>2�j���V�|�W�ShQ5���U >�K���DZq�&�S��cm6ak���i�hg�ى[u�L���@eL���P;��ҹ��F�I��2dnӰ��WԎ��_�L��: �3��T!�]����:�6Z;��˭{!d�KZ��F�\�Y�� R�U�!�{�����߬,��^=��q,�1fɖ�����/fC�Ir!�qX����6.��E��r��F���eI9c/��r��1� f�P�'z��}eю��������� ,HM�)V��Q��F��K���� +|}�M����0�5��빣�+����� d�r;%8�8,^��x�ȃ��� +m;�C&���N�6�:�}Ik8�:���<�E_�cq� +�FN��i�)*��ʉ��Sif} +�KG)O�%�av�lƘ)�7�3���S/dȈ�5��l�A�ڻ'��B/�� ��m�Rž����Ȋ3J~Yj���ߔ5U��K']���5��u���S#V��؅���z6�c@*a +�*��F���g3;���EIuS ��4h�j#�@��!3��l2���g��E/��7�w~��&�g��A���-�i�6��Ёa��0k@��ںlC���+0�z�HU�D:�E�J9I�|k��r1U��A�cr|J���}�����^��/K��R��!���' ��� ����,@n�'X�h�~�{�H�z +<'��jRӎD��Q�F����7�Z� ��֖U�#�7,v���IJ�&:�ͳ�g0czԮ�̆����;�͓@E�O�0����F/hw������Y����pՀ�p^X7�R����ז�������3d��� ��!��c �U}��Ԣ�^� + a\1�¸�=�k�2K�[��Bg�8��+�EfJ�8�8�4*���[��ej�7 �X��v�)Eo,@�K�"�F��T+ +����d���PjDz�`l‹ȵd��Q�hn���g}N�2U����n8�G�vy^i� +H*;xsm;�#G�=�3VM.i}X[n an�g� h�^kp���U�f+�E���]#�7}��Sv��$Wl'��/�g��xk���/e�Ғ́�]xѤp�����_��������Ѩ?�4�lu�hRU�,G��Ѡ����y�Է���jx��{���|��� (�*i�:0��P[�@5�_ #=���Ҝ�t���qo8 �`�����M{��{��_�� �,�a�� X�%���\�@>(�)Ъ8�����BO`3� ��x�3su�� L��1�Y�l���+6.��S��/Z6]���r��BRc6�4��o�:�I�q� 01oU� u������4�������M�s^�/ �X<6�7����Il���{����k� ӫ��b�)�;Z��w𳱸���wM1��M��HO�,CKO:�"=��}�n��G`�N�r����m�9y�{� �-��i�T��! +"�>,���n����s_�������uK���4ZNrE^�����/N����H�lv�2���r9��B�sʘbDF�jh��A��JcĻ(, 5?�R+ͻ����K�8O�m��9�H�~�i�j�@��\�3 �C��*>h-H�?|� >��%���7�`����d�k�p��渋� ��s@�h�4ę6x-4��hS��K��*ڼ�Z� �aK�+��(INv�0"q1���e?��C\� ���O[�~��*�����?���,�Y��0��s�_&@W��!�&E���A�73i�I}!y^e��rѼ\I� ^�~� �m_|�;�tj2= �$�?%NAJ��+�,�;��Mf��)C��A���.�� 6���/��4P��8�I]*���O W���C[�T_Q��>,�9[Fl#H�� +��"08�3���$�A������J �ₔi��2b��N'uJh�� ��h>����JI9 �e[WlsL��%L8�!ֳ�l&V��n��1#@F�G�I�D�#��0 +��*�� ���&��xMl�Mb�Y��՘��/�}� ��^��w7 pC���"��Ap�u��~���dEφ�*=+ r(_I��(�[nLA�I����K03ܛЍ�C�'�e�F��"�6p������U�B���ܞ7��=#D�(��1Y +�wHi�� S-�:3h��9�;�{����b*s���Μ�ox�i��l��{�"U�#��%xu�R4���&oo̿���/ G�U����G��O���'�[�Q4x�S�)B&#� �w�7����s O;,��߹ .�|�4dw{( ��]��GS#!��6+���Ԁ�A˽G�uMi5�LpU�� �f�CSHd~[#3�T�ѥ��u�]��PcLO��&���e�m zXω�������tg*]~��'� 2��ra2^�H����]L��� Q0�伐 + y!��7�XZ�&�ܼ!X�z��ڗ��_:�O��,1k���s)쌤�lR�RY���^�@K:֝�������~�IgY��)���Al,V����l�asR�J��@�HT��e�zy��! _�O1��g�����r���Pl{d*�'�wr��R����3n��jE!t � �L���āo��:1�⭟(m�.�<8�Sx1_���z��o�͟3J�Y�t�����YTo�LԞ��w���BD�ra`�6�g�^u�S�� ��va�eSf�X2�h���յ�݈.��j�� ��:�fL��0ְ>+%��<[�+AW�z N�K Ș����\(sspQ�� �n:� +�����0�0_侑� �� \�Z����i ��M�ȗ��,���_BWBq��o�SJE����#��h����?�r}��p��AF��E��W�����;#s<�gj��ڜ�rb! � �]�争$z:}TUʹ����,�ܙ=���#�n�W�`M �rж��U��C��"��J�D��(����b�@������03��3ypY�Y<��d,e�(��II���g�a��S� ��W:�N!܈�|o�l��k��Ε3��@�-��}$���c� .����n���n�p+�C��v�zk��]n��NK��ƒ�0�(�� +; �D����В��u' $]jX:����8*pM�i����Ħ_�1���p� �}��b�����B�ΝڼE��#��~9o��}�5eZ��Ox�����}�\�\����Y����]W�O�8B��i1n��d��v��}��:��/�\����\�)��&a�^�s:���k�A[������co@yR��%�c<�^l�ӥf&��I�Le�S� As���l8�/�uڒys�v +Q�qRA ��[�� �Squ�{1v\lߌ��=:]��TX"�t��P-�V�,M�����T�(~ �~� �A��-q/#�8����Zߠ~�uI>nw}P�2%�p�s������C[�+waVF�ZKx]OI� �H�)xp�_ +���� +1�/&�.��]:-��ȚU +4�m7u�X��oL�~؅��[I���er��Е&� �����́���_����6J�ʑ�K}���S|��C�WZ"`O��8݆Lђ*���`ĵ}�N�z�(�^�]�qB@]E C�|(����;�������4�s�0RT4�W� +�F.�!(��&��*�f+��sQx�c0���S�>�Y�$i����\ނaf?u�� i���naX"���I� (��pT������[uF�0�����&��Z������I;}nxB��O�hYh�ή5��l'چT5D_�C��� ��BIq?�URf)dNE�� ����if��N|4���q"�}�T��n��r�h�������� v�_�U1���z��S���A� �e^ d�͍�9H�r;y��5��%��h]U&`��3M��@����iYߏ��Shr��Kיe���6[�/�f��Kz�Dqd���Ya���°�jX2sS�_;��}���7�lߠq1�ɿ�>ZzH���]�'�����ҹ�9��IJ���*V�xR�f�M�����|����+0�B�Z�q���l�#5@� � B�S�XX�OTYrs��\�2+P�� �T�R�uH� +o�)*�:|�U86��=4R;�F��L�- #��x�K7\l�� Rvo��� \ �.����\�=#h��a���m�!j����[�'� 6fr�%o߸�z��D�VT �E&�<}w�QJ�#��+����'u�?/ �H��}�Nz��z��SI�'�3K�5_��3�H�y��g�!�f�o����u'"3'�㣺2+ra� +�h�8ɑ]Px���74(�BBW��8U�I��Y��t�#j*�g�mh �H[R7r�L�ZpD����5��bР����tEVq��NP���y�3���,�>_5=�i�X�U+�.i [do��n}��~F]#R4|�"[kr�D5�L�;�bɓ�!Xr~`Uw?uq�vs���!��8�̥���/���B߬���t�H1���e�%����~�����C��m�M��I�oi�~b5IR����CbNK/U��q%g��[�w� +��V_�8Xqh���LZ{j!O.�+Ew���=�z�8�J[���4"" ���C@�Y�t��o����I���ǩ�~D�������£�%��46'3�E,6ǀ�1�(�������R���S�ŹyF�����G���Dd_�Au��J � P� ���l�݊�p�����f2��O�������0PCd��S + g4�a��ܲ��a�;�$7��2޻�d){��E=� q�[�k��M�y�� ���o�K������P�&��VD'�v�yf�)>,;�Y`T�(o�����K��r/,m�M���=6�v�����Ҥ��uz�q� Ӈ(����!�P �I���UA��#gf�)�G�k٬QQ��|�����y� �t3��t���&�� +N�����0�����z�c6��9ErDvwu��)�����*I��]@{ �u�Y��zX�9����"K����-��1�8c䞏 +w���0��A� +�:]��&��J(�� �*rC�e�(V[.>� wȂ%����#�Um����L���0��Cy؉��*�CF�\i a�Feo?��F�z�U(� �������*t�Ȉ�~ȡ٤���Cy��z���W\�f�'�#�QJ�1Ρ���;H��%�p5��HM���x�����b9j�w~N��:���^�HP�g��qnF�W£�f{��B�&'��7�#�̾Y �z��'��A����v �'���ld���q�*��l"gyO�2�:ECS`YO9�R0 �_P���^�5�t�Ҡ�.���) &��'�������gX�=� �=�["펡p�!�����4qC QI� T�93�.O�y�L��B����&g )�xo�2�h�0��\����հ ���d"��7B4����@��K;��v�l�8�X�ht���K@˄\�^a�eX@x3�(�+k�Z�f+0�Nb�A����AΊ�p>��撌h:?MM�k�'4)WJ����L�d�k]�y�!ݣ/����y��@���o�Eg�M�U)`�� H�"��F���x����T��!)��G���e�f��U���a�u�s��mP�r�R��=?�i���(���|5(l!���e� &A�E�~�\�.c�����QhtTC�٪���S+�舏TR'��uJ��5\/�<'�eV-/�607�f������d m*�fYENJ@zo1[�*[�R��p�]�)��}H�5e ��z7�^�ɴ|4V���¸��5RQ 2�,� +��DqW�¼J z��G� �{�ٙ��D.��,х��W��\�Ã�uZ��UV����M�슞��ɲ`�J �� |��I��BK���H) EX�ǚ��r0dA-�kr��q��������j�HۦՃ�0��BM�bψ�����\�@���}C�vW\m,G7+O� ���U��|�� +N/���kt怚)PNvM�q��/}ڷ�� ~lC�"��Mn5�Dn!?������Sq��j��`�����oQPwZ�4͑B0Ó��6��Py�M���PD^��FՇ�"k3�nHNt�>�EH��na �A������= Eq1�%�\O���J�i K�H�?ل��I�b�����3�� +� 4&���Obx~�?�'K��яwy�R�k�Ye�sYWb�z���\�� +��|�%B��Uj��[>�]I�U��q�x-МfKS��&�6��DB>� ����v�ZV]���y�[x^6&�&_���� =E)p���e�� +��@R>`����(��$����V�N ����aT(Xe��XU +��Yqs����O�w,��lfY�e��b���S�D))�c�g�'�ܡ�_� ��B{�*�y&�f3"��D��ߐY��,��� R�)H���j�L� `DŽ2��d\��L�Ԑ1�h�D�]`ſ�&ı �R4�D���fg��h����^Rz�a�ܾT��O�Usb�"�7Ȕi!R0���=���|�2��WAO&R�l;�����:TlͰbkV�� +�+���DAR��b�ԋ�'�� C��~_��hW>�bK�fc �}N³�U +R�*�' ��VP�޳���Id{�O�����H�d �HJ��@�K��I�J�s�Mپ� +������a��ʖ)��6��le{��/ĕ�Ҭ�NܐY@/l,[.�4P�S^ʊ��:�V��y��8� ��K�S�S�oɧ��T� ��O�/X�8U�C���z���0���"q��U��r���]�>�x�5��� 6�*A1�����z&]Y�I�UU�!q�NU��)��h�Ox�s�ӕSU�D“r�~��[���tŒ?tC�b����+ŮK]z��ޔ����!+%A��H��+§N��]��E��N��Q1��A�*��Z��~.(7�f�J1�s��$5���XZv��4�)�+�/>Kd�������=s�+����0���吹rY���,Q�1�ݤ�Γ�H�)�:��RR/��u��w��Z�vz���s�8�|�7���)���uR�:?E��8�k.�*�+/P�O��#_S.���5�܀?��o��(c����;`mA} �$�+��w@2�Sf;9�:�/�ĂP��&�ty������s� �.H�%�-/�CGl ��v�u�gi!D���h�-����uKg� +��Ì�'��q�f�<�����A$��i�q�bX�_�[�6�:�r����Z�^~p����?0%�\�,��|�k��ӿ�Z�Ę0�\��|cWp[�k���[�(�\�3�V� [��M>w���R������h� `̄J� �o��'~����P��@���٭���O���ї���#�礯̬o;0�z��-�>��V�(����>IJe�M�Y��X�g��@r�F/�ɳV�$�4���-+[(L� �~��|���O�7+͝� ���%�gg�,����Pn7 +ARSWS/ ��Yp8�?2�������"+W �����0VY�l��l�N`]���a�2�8������q���K@R̈�m���� 4�U1mۈh*r%sy\��g�i��\h"~�[�@����+ +I�<���J�Y&�r9�<�|ɷ���Q�:I나+9�Z�-݉� Y{+T-S]����j�SM�O|=wr4�X�z�T�n��G�jzƸ�1Ө�|� ِ5y�8��J���q�x'(�� d&m�~��~��*�𣦊X�� ��j�&C"� !�@��X�~�)��$� +ϒ�+`b��)4N��aGMU\6�2:׎��� +4�^�� n^�?Zy�y����W�~a�q%�.W���h\!ց�?_��h�qI�r�ʧ,�Ҳ����8�9r��^r�qA������m�^=g-��yw*"�B���~���'|��9R�:����+���a2.c �;ܸj���)pA�g��[���� ���q���6.��Dl\?��,�2_s�*������Đĸp��u�Ǹ�Q-ON��� 0�=^)���o���C`��o P�ގ�� 9�:T�^�����q��_Աb\�Qk�^?��G%�6��8$ۘ�s�)�j#l_t�2.P*t�`�>׉��w����5̠�c�|���+�2M�fDޙ�E׏G&t)��-=|+���~�,<@� ���dS �7K��]� endstream endobj 19 0 obj <>stream +aS�0yC�C!���G�e���]��\�Y�G +�T/������r=�I��b�\?�)�E���6a��V�L��֩���tH�����ׅJ0<����P�Ί+ ��y*J�[,�"J� X���!v�h���j��8Q|7=�w�H�����^v!�[+�w�����|/L<����w�d��XECt�!�tT�*J B�-�Q6��#�yr� k�8-n��$ ��I�1�`nH���f��H�p��\�IB��S^[?,��ag��}OС��)��j ��9��;Z�C5# 0���~0��],Z�r�4�g�n� +M�F�k U"�q�L�gF��e43�mZ����~gG��O�<W��L抓l����c�S� OX�{a�]"�`#[g}d�ò��Xo�v�f����b:��Q3I��j +ovi�5��K��} +R�RP��Vl�)���H��ɉ>ꉳ+���8:��hn��h�h6�Gb��#צOo�}��3�2w ��J��x�����F����d)������x��4���:���c�~��жl��cm��.�2{*`rae~p>����On�V!w�gԍT�@��qP%�aJ � �S`1�Dz��)F�$K�F�kby�*A~�XE ��9�(|{@�V�̸�"���@p����&�'���R�/���1�R�9$�{ ��rF7���O*��@^�]p�}�_)��/�����g�� 76m�V��&G %Qu�(Y��;�Ga�\��R�* +&���@����T%��Jē!��׋zG��xÖ��-�g�/q�n�� $�����[ "����^j���Z�(b��KHJ�^a���N��;�A:ږ�d�(IZe��C �����g�� t";������s'Á��_e$�I���I�;g)q�=2:�E� ���O��/f� +��a5`*q�!y\B�u��*¯"�]�U$�`D���D�ORD�AH狐��E�@��,= �^=gK�i�tt*����Ƕ��U��I���������i�^I�x3*����g�*�г��!e~YBym�⻑("���g�#C�W�~��d̥@ȗ ˕7�Ԁ ����0}F +tf�l-�Q��N� ��'wP���b�P�MY����b3iI���`l_>�"Du�F<��m%� +�X>W E���k��( �m�����+�8�� �(I�K*�� �Z��?�!�#�s�=gj�l��� ��(mS�V�j��1�����A��T����L��"��yl�y�92��� -�$��� [���)`��9{T>L�Ll2 �}|��+|���>}&���v[��[�����t��X�Ly@�JWAJ[Ղ��)���Oo�_������D1 ^�<�%F�Q���9|��3G����@�S#b����T�ݹ}Z�L�����|� ��b�€�����ԯQ  ��7H���J=�J���r�>sU8��uq�ꓛT�˄��[����L��s!E��(*=:H��l�� h~Ca2����+�^�� ��0=�<8��Hp�L@�.#�h��kg��VL��X��Y���A�� ӱia3t�B���j*Ƹ(w��BO/|��ʠB8�H���uj@��R^Z+ h�2/�%����f*��.�M��X��2����]����Ry��H� ��K8��f>���\^�Ar��2�b:$,� ȈV�G�A���btT� 1-1F��i��0� ��70�4��`yh���ܯ��Ξ�TF����Q�4 8O\�e;���W��?1�>`b�����������K��M0��1rX"�g,�� +*��p�Z�_��Ƽ4f*.�v��0i +���(.�΍#;�C�@84���`iaY1R�`�}v*Ve�dDL�p�9� ?� C\��$†��� y�M�㭘�9���n�:nh(�e�) ���?`��k�P9��rB<�Jtp0d�x�c�@�DD�'lH���H���"��b���ϐ�ZK&V:�M�j�X9n��/L���|5�kq��d�F�Y#��"����X��ܾJB��ЦJ�TI� i�(_�+���0�%�E��cT=�1%�gD&y��oŽ�|�S�a>�1�6�n!<�i���8��ϪU�U�[$��^�B&vy�*9�����P�{�8x�"���a�مC ��� �Q!,��g�݂NO�I�Tv�= +1,�)$�ڻ��nu:̽�iR� fAW�TI����e5!���g���)���P���Dr�7i�!�"^�X �=BA2b�����O�NnP��ܝ��4ra���뽢��5�'��b��:m�6ݎ��鍽���^1���Y+_I��lWt�Y#3 +�E~ +/ �[�@w`2��5�@�^����w���V A�W���$����+�R�g�dm�H(�5mSx� +��ܤ{ܱ���n� ��@s?�����$�N�0�ή���.��N�w:t�W蘇IA Ȯp�VM�X��r�h;y0�� �[��H� ���>�.)�����N�݃�ey��� +I�}�0eWP���Sv�{)��Ŗ#��]Bj�N�]<1�t}CG��3��E�IW!�!Di�(�f$�ʚPb�/��m���=� c߈���b�h2v��2v���`���r�2)����}fX]�N� �x)W���8�B���Lq���HeG�"B̸x�C�SL•�vg�����{ +�+1�|���*��B��nqt�?�.v�ި� �fJ {����-l��˶�F�o����T���8���WQ���������Y�7�{I��� `�= �T1�7� v�ݝ{,[��� BkX�_�>���r�Z-���(N�B7כ�g�a2[�&�;&�L<+5s��Z�ڿ�b��׎���v~��_w_G���D��K��u����c�������JY|�T _�`��}�K�������*�x=�b������|�[�ݷ���c�r����"�C�k�[ ����>���9K�� N���H�uS�x��B�=�^<��89�^h8�. ^K�o��0���+�^_�\]W bu��-Y |�c8��\�k���{٬C닸m�� $T��FM�� ���������:�t��xt �t�#�t]��t]�5]o᙮{�L�}6Ia��X`��zL��ϥ�����^��zA��zm��:][%�vJhoZ�P�19�T_�<�"@� cmZ7DE����4a�����������x�S���e�e��: ����P\Ǩ\\?p.�������N��L�]���uU���Xq�k#v�%J����3�]�u��-�о�.P��0���I��]<��I�е"�DX;���)?��'�:����wj�3+)l|n�t,��� +��r\�i�^OX�L0׽ �z�Ep��� ���j�8�k���j@뢍���qPe�I8|{5�g%:(G*|�#I4�g:y����g*�eE|U��0,Ej�i����*� `��@�;��\Oiw�y-t�� �� ���|� "� �G����G! ��2j��g�S��!2_���:�7'�NN�N.���,P�J�]i�=Q#���)qQ�U3�%�9@@� H��6$�T<(��i �'�g�#�i'�жE��0����!� �"�Y-A@_���� [[ ���+��yL��"eC8V��8����xN�U�v�B�g�^x,��}(���,�$�\n�Zqe;X#�1R�gxFs��� v +�@��k\!9.�GLD����(�%����]J�b�@�|� 1�m�x|`5�x@�2�~B8�r�$����.��� {�� y���}�b��4���� �}P�/nXr ~H�ZD�7=���L�̅��v��soE!W�ZZ֠�MҺ�0 +H��Ke�����kr +�KyN ��. LN�p�@�'n�|��.U���أg��|րQ�w� \;g��X 9�r�&���<��F-�\D\z, r�D͝�42a�� _�5 �|JuA8�e�0��g5�#�6��u3>ʝ�q;o�0q�F(w �<�TC{܊�}+Gl17��I݀ � ��DS����p1���P`5� ��Q�Us7��eY���eDs�%F�K!�NX)b�^!p���c"���n-ui+J�V�!Ag�7�c�bod�>(�r�� '��؎�~�[G��<Ĕ��8��U&�a.�������7�"�@W�ݶ:J@�C�MD�+Oyg�d*��?�p���>��w1�4$G�Z�"1WV��p1���dIyzh� �eѡ��A�� �H�KX�.U iE|y*�X*=T#�"F� +CD�>{����KOhp|aL����@<|�t���@h ��)��#0|f�\���Ղ�Y[�Y�-�T�$����Ʒ�ckC�0ɦQ��64=0�¼���ȉ���< +#�M?t��z������~�g��c����%��H��(iX�R��V :�$����i���O�I�$6���`=^�%!�m�X�T�K*My4)/`a��@rCf�b���T�yKH/�QA�!An`��@��@�BY�Z�%� :-�|��!0�Z�h��T7|Rc�����$l(�D���xl�*;-�>��p ���m�>^Z*EgR� � �/JK�mE틮&� z���XS7I0�0W�?j)T�˂N-��*�����j߃��L�� ˘Tl� �V="�"�[�N��Gű����xhE��d�U`Q�<ć�'A}#�0XD�> � t +��A��� �D:�L�y`��{���Cu�6&U�D�h���������H���ű�n�ٸ�Z{`�o�36�شi�kQN�q� (wA �.t��@�7����P�t 9�ZJr��=Q�:��!<�LX��L��͈�i���g���o�XMa�[ �փ*�60H�����b����}o���#Wy �h�!pGF�Tt�`����U���W����tpݘkk_�U��E�XkҦ�V��qK�;�q���$;+C��׿0���"<�S�t`�Z"�IFR&��!�w2"��@vB�2��C�^��zb���b��2�Qr˒��{l��Έ�������T��C�z��ф2B\J�C�V�H8Q�4��_E�o�̹q#0�'օ����SƋ����V��-�RU��|磱�=L �'���=2(L,�҉�ބ F��!�k%����F�:�(-� tc���>�C�Xu��Z��ɼP��PnY" <��lj,���υt0���H�a�DJ ����%���"H\ �KX#JOP&9�7��+>�D��f&M>�îTq��b0��,�f�G��{H��8h@0����!6�ث�s ���D�%$Q+��L�yܴ�#>(�G$Vf��� gY����}Qb��j1�R� �Ľ �^ +�L2�F�^QR�3�(�DJGiBrӝX��LF�\���W�/ �Ӂ[�f��K�� f[W�Lw#x�++�+��a�ܢ�g���R>�$����4�x�fJ�ǡIKVI����4��B���g�Y�7&�b�؞�����G6���L� �5B����8���MI��Qi�0P�V���&Ui��D�����Ŗ�^��3mZ�"a[`�M���������V b@nB�=���t��#�I��쥹�+�h�գC�,���ۄ����U�|�7h��/�5Qp���Q��X�}6Á JM5��b<�V� ŽW3�`b1-F[xp.� �.�^��ۼ@���9��3�x+�,���H�����S`{J��.�ckW��ڷ�����gZ}�'��T.}ZH396 �;l5@�I�0Sń��Р�$�A� �A�`נo\M��@���U�ʋ%8�gb��"�������䆔a��d9�L:�b�,��*謎 �>��^A������@!A�ǐ�,A�A/�@�-���$QB�`�P�A>��ҡ�!I,�lS�����s��u:;��=� +�ޱ@����+���+�v#�v�EBgWq ��̊$��� ���JN��%�f%-����Yju�+�`��$ʾ啲[lN� �Q�_!U�9X�eDgv�]��sK��+��Uv�)��Ö�.�� E>#�$����mD�� �1��c�uG����l�d �c�e쐐h�f)5v�ݨ|�-� {�����1w$;*%�����^����ea쉴�����Xc��-0�k�3�&:Be0�\aa.(7(B+��v<�����i���=�ǰR�^L��;��1x�N�0��bg5bb�hb��,Һb���(�i���尋����a����j?��;9�������ȹ��%,� �;W������6�Q��_ �7v;��}��Ž���w�Sɇ�� �Nsd��-��+H�`79�� �^���g1W��m��4.�l�_��g�g֋�+��4�e<�>��9���g�nN-�=�\Ɛ�@_���Y��� ���k`�L�N2:�sT��$C������ ��������>������@�u��X@������4�F�i���A �@P��c�~�g�(( ���;�tҢg��:�XЇ��������y��~�_$��ߏ�:�jY�z�Ӿ�z_���|�<_�Z,�o�׷����`+D��l^��J]QL_)�����.4���PH�p�Qg�z]�^G{����z�t��"Z�{��+����^�N����� ����oy�� +x@�M��I �TO�y��|�ǫG�1���7 nq ;�2�R�<[�0pc�ŧ������ *��6����zɩt�d�t}���ފ�����5]_��8��k0��h���@b��x�,��\�vj����2f�[��7��a a��T'�$:}6�$Û�� +���s=����ZP�B�6�I@0��� +w���eWW��\3��z��'|����3\��/8Zy�\^�;=�́ v渄������o���}�)���omE�� �NS#eȘK� ���d]Z)�_(|b. +���,�֠*��:�a�h���v���r���6E�ŷ�Ť��^��PP�S�"\�Bo�A+�~?��5��K���'��}$���'��:�s ^���^7~Ѥ���U��F!�pR�ΓT*iĦ�0Q� +*b)��5��5L�~�%�(��q.��[>�����5�R��,&�v('� "�ϴũ4��)�гp%Ë� �������Gx1D�� + ��R!��~<��.ܡ������u*91�ᥒ@M�T�B��C��Ay� +kByC�4�x�"��ia]G��%B�p�=�p�� +�mB&��US����:��j!�o�|> Cr'h�:�G!L�L�3������������r�����=� �W�I�_9umޡ�Gp�����&��6T�����?6��&M��y� �g�Rz�Յ�� �:}�� U���U��RE=4�D&��V�*B����h�u�q]��QpkrĤ)�'f���T��l� ��ħ���)*[ D�\���]�!&.�,�)����\�El�u��ڀ6�yA @�|���`y��<��!�AY�vCu��g_r�E+Ə�#����e&e��& �Q���T��7�g,!�"���/�Ag�8��h�D��"qO �������g�׆��Ip��;{(�*� Or + L�`tnp�Ds�p��Z,X^�8����[�L�$��%�G� ��� Q�#3�D��go�8�H�C-��W |�lx� l +I.�Dp���L�iV���_��M�)J�m��R��'��F;3��>c���7��(Zq�qw"��eyR�R����J�D&�+�N�9/ �����-@@�ho��4��`�*)8ɴRMѥ�m�z2�Z�j0�������k!U�ȬZ��$ M��~Lh�X +MX)��Np����(=mt�&�(4�� ��N���9��?�>��H RM@�M`��,!�%�%��� ��*����$�{� +�@�ҿ$����9�y)� I���aYL9m#�g��(Ҫ�t1�Q��ѰGCأ��`D��ZqPL���)P����"��X5]�JZ�G��3�%� 8J *[ Q#,�I��Lr��26�\�FZ�̞���!$R\ߚ}��ؠq�.�Pp�J^��f#�c)i�����Y� V |�J��9�%B�S�*�3D�`���G��G�5)=�͠& �zb�5���4�1�/�6>�L�Q���X�5�ՠ�0볾��,�Him��ش%�)ւR�u9"�bDo-P�D]��m`h�ڐiV��< @�� �#2���b&!���~|AeH�� ��` X���-.�E�.�m��ւ]KkWr�E���U�Z(U��u���h×���Z��{0�k:��Ԋ�`�� %#�3c�r�`�‰��'�8�1�B�QiF��M M �"'�tӀ��`<҂6l�m�b��B�2t&�ʰB����5�Kc�ǁ�ZL�70����@Gc��(.�F8��d;8}�"�E��n��9y<����<0���)��VV �Mb +�� �W��/�E������j W4n*. v�%1i����(8�scJ ��>�|�u��h�bK��e�X.TD�[>��1*"���h�������!&��!#���|�:�E�J�@�Q�L�&���B,�"�������Ҍ�A�b@�Q��eL��*%:P�c�a���y0@�������"�ǻ�@�M,"�-f�Y<��1�҉K�(=x8n�tK%� ,L�m�G����g��\/���xZ����N�n����4�">�g�p��@(�|`aI�-�dl��+�P:����3>(+�l�ܙO��2��q����e� �˩�b*�s�F�#db"�a�U����x��֓rЎ��J�jNe�-G�pi���FU �g��JZc�%t3���`�CF���옅�>���N`"y@��C̣�k5�85i�J�c ��#YiF��$�R�9����^Ĩ�����>�#�pç����)V"Gy�G��5�|OZ +S��PR�߅��R �{5���� R���08l�m^��C>3�Li�yJ�����SA&Ӝ5�ו�C���!��0��S�J�Ja���r�Lt� +UHnb�AuZ���'w4�sWnG~�����:��ye�����Z�V$$�p���\>K�D�U�0��j�6���i��+�p�3�Sb��5��z�vd���B�v�#f;L�lI'�_���$S0�j��V�q�0N����B�k�$EN��1D���P��s��(j�5Z�m����Q{�`��3��� �U{cc�ғ�E���P�����x ]J]�a�'>�C9��>�2���n4Y� +���ߧ�@��b��o���;4����t��+�߿ ��V�/���A�Ki��db��g0�0�e�/&����Xq��Bݏ��}^z0Bx_������We����Ď��Ơ�#~�>���_�6� X���K�}��*�������}'�¸r 30Э �������#���+t_�����w�}����ރ�}������x�s����� ����c��ڼ��Q�WX,�G=��G��(��6��3���|U���ey�3^���(���E��38A�y�}�t0u������~N x��!��Q���I�w���S�}���}�v�~��� ���:������t߂x_�0��ICU(y�������� @؂�6���Z8�o�t ��̟P�|����:\��B�Ed���FP�H�f\��l5 +��� b���/J�86(������n�*\ �6HQU�JI��`b�P}� ���W� ��*΀qQze�Y) e��3(BtI3J��N?�v+Mx��U�6�HQ E-(�.����D�*�Y+�����r@�W�nl�I��,�0�� �e��u�.�{��ȀqO��H�8x0ok2㖻!G@\.��,������"6��g�03���R��R��j�ڨ�"�He�JP}�����i'�� �u�DZ�%6�賹��:��P�R6�/��!��FS|�� +SC�pC$�R�&�bT��ua�F����X<9�|�R(#�����A��$Aq��%a�r����V����B����[HQ�:T };�|X�.w/�R)D^���J�}C�㠒 �,�|��44 +X�i-T��l�–�|\A��Ie�T�V&e����>1,�:�m�r�����RJl���+�FV����3A2��#[���S 6�0X,�L��a�Y��K;$փgc��'���R#�jp -��%A�\X}6�K��S�g��;��P0X� ��O�Wm(����QʰL�a+߹a�c���YBpQ�#-|`j�<<�Wb���l811� +C�Aj�0j�O V��D�ܠJ��W ʒzl.&�}vx�Ц�@�7�i�Z�����O�O�N��!����ժj�j��e�*�%��T�gAy2T ��!M6x��D"/H��6ZΣ!�b����[-�0mX��l>B��W*h��Rd\I�^���U0��� �� +$�T8� ��h̑B����SD +��VD���r^�ϡr�8��Dc���b�����yR���‡�B�d/(�jl������*��|_)�RJ������a1��I'� /w�Y���^��/�*H���*Bw��!87�MUH �x���,� ���"�Mi����Of� ʂ�3r-P��W-R.T'tR�|f�J�W�R�r��lR������� �C^�@U��ad �r(b���ÝNI+|� �Ǣ�QIJ�Mm5�<"9i��Ce��. p0�.����iy" �b� ը�3.̟��dy4��Y�M�B��@��Vb��_0g�� |rh%J��Z��b�2�E�8j��P��d"����F`�8^���t:0,�lWU�����J#����n���C~r#?�*�/�L�ɋ�`2.|�z�)f5-3���%иH��cZ<����86�@075�����VmM�k3���ƱᰞX�8D<֞LU]�b��B���⡔�gp'A������/�0��6<��6N���N.xH���}���"V�@|��'@�54��vf��d �#��G�%<\iᡀ�b@*�H��"�E�#~V��ـ��j�5ZKk�l �ip���l^ +���>�I��� �,�tJ���%���'ku�/���&B���Hb��*�����z���PZS�PD*I]��� �hb91"R��T[�S��+V�_�����������.���� �k�"�֡"-�ӘG��N�+r!u�Q&�l�i�l��!�K�I���Pr� W�+�q��^�K-�S�����uN����"H +~��pP�bpPb�LB��,�&���0���ٴ7&���� ��L��s�/����)�94u�"^9�w~�|���I�B,��B�AV�<�Sl��y���.�grz���]�r��oU1/�k`�dʼagӊi.�T)^yP,�"��IZLP�˪�'}[,I�]�J(���!�D�{��υ.���*�?���:8�!�?��x%�tVuC#�-���t8&# ��2 +�6�Yr9V��>�]8��H�PK���J��J��LuRǂ�4-� +�ի�r� +�O4�񷠎��� Jb?����3C����˱����4�Њ��r�6�m�"眙 �Az�x�z����:@�b��b��Ǎzĺ�mHZ�+Qq��e1�ܣ"�/��%��W!~��7����n�"������`�����$RٍG"�9J�}�>�ِ��&S�#o�w�T!H�YqH�ʀ��Ys _;PzAlP�3VQ����$�'M���� +���������O�2�gB���n� ��a��t�?��������Eo�$���Qٖ�8�̠��)�"_N��9]��oh��x��� �>:*|��%���ˑ���`�s��*�?|��W���[,�R2�K����B��&�g>�Y'��)[U_U�¬8�1hi�^�cm7H����)W���������������ͅ���� ���Kr� � +�=��;��a���G��K�x���o��Ӆ|�,����o �}��Xc��-R MQ�8E1&@��U���+)�Y����|�Mj +���Gl����q?-�2tT���p؍�c���3�煀:K*a_�SYG!��,o�L�Z��xpA��)H~�t�nVi=������=�W�Ɲ�PK$��<"������͎�u�ە4�.� ���9�{4~�e��\�t��>����0�O���Y�f�"��J�և��Z"A�2�IFX%��x�Zo��cGfm�Hk1mb�N /ƕ m]Ht��3�!��FS \ �@���@�I,"��L�H#�~�<���% :�L�շ� +h��,#@q,�0�x�6���-|�V�x�55��/n]�.yj�)��!E��o(c���u���D<�2���|��3cU0QR�-6(Qe|Vw�ݩeT�L��d6�%��,�mW'P�5�����n�R� �O �E2��b: 2�A�>\��21ū�� ��{4J����`��� �B{��Ҟ�JSՃ���(�Ru��m����o@Kx54-�a�Z�2_ܘ�@(�<�Ԑ +u+C)%�/ǣqꐅ���V�a: ���`bQ�lo�ã`C�g=ęL\���L炱| jÆЃ�����j�"JԪ�1�d����m-�i������i�˙PJA�C. �J�hJQaC6���.mf(��<���� +f�r8�p�$jmBxa�Ǫ��kP��/|�<��L*�Yٞ��2Q�um[��K{�y�vU�%7פЁ����Nj#��U���e�>�>xl!�Lc���@~D��<�fl��dF M���~�r� �̢�?���bޑ�U���Y$u����܈�Bq[��rI�+)l��4�N��{b=BQ=�6h�(4XjqQ9Q��n`�bBM ��S/��q� ��L�Ha>/�a^$��^x> fR��5(�7��z���8J���08 +�Ұ~H��¶� �4�x��!n���E�� +�\� ��56�� ���YR�D���(�Yq�B�Q��-�Q*)�0U��i�k~�b!���O�a߲ ߂�zUC��6{�V� ���Nh( +kY�f�H9����E=�m�l� foX�Cd)2�g�PH�NKcZ/�+0�|��/Ưy>�O���[���� -`��IG.��&-�Tbh���Y*́�&AdE88$���QPP^���͌�o�C�ح�'P��7 n��W)����KR��+���p ��%���c~�$+�q8lleXF�&�,��[C� �Ë.�PH"�|�I�-�Va���R��M�E36����F��S��rxP���-.�q,��E.J���6`�� ��l���<�q�x�.|Z�"�b�'��S��~ P�䬯e�oӑ�������:}8�?��d���ayZ���8�Bj������$~���\L �O � �B�yB�$6������፞ �������C)���r ���oh`�u����g�&gxP�sܙ�"Uj̈~�$*K�L6J&�lT�P����&��*���@@R��&���@��~@*>���޾�� UH��x�d!�� #��L�S �ק�W�}�q�ͩ�h��S�k�Na�#�Ұ�O��Vv)gT�#��r�)���8��_�hZD\\�9�k���wΖ� �a���b^+>�#���@T�b(��`5�<`�8�P`�A�8����Zv*fP�D�oH��#Ay[�P�Z�j�.��0�*�Q��B���}����{ ��V�ȭ�m�<"f����C2ljÁ� +u'� ��3D��<M��MB�z0��N��� +�g����C�F����p"���T�Wh��� �i�\*����p10���e$�BS�P4�jju>ڡ�ԫ�����/�0�8Q�RmF +Nl))45�z�a�"�ϳ +kI��\��D�@$�p�� H�_���d��]�Hjßo2�O)�,B3w��g�5��d���hj�:'Q��hF�ss!]X m�k���(����*h��u`Z�]\��z�2.����(LA~�������/�����b��?? +�hu2_����Dj�8"ܽ�Q��2m��d��&��&��KA:7�j4NK1�Z+(5q���~���= ���$�Y�0m����HY�?��&�@e[ +���P�L ��q�n�7P��)�3�FtW��hb[�8��Zx6��� -��2�ԗ�}�!�_�6�//��^��-[ 4�_������� A��} ���g)�2� ��]r�����U� ����f� +�Z� 9�V�u +~���K-��K?񫼈�1/�����G�;�[�����`���\)�'����q<�?"�qʄrXB��9�Fd���تV� k�0Z��|&w� +���v�И�1��ۄ���oAď����.�ߗZ��� ��h�0��3���K��~�JK� +����>���Ҝ �V�����p�ɉ�/�|6-1gc+���?�$������)X�{�C�&�)~��ֵ��|�u��_���g>��G[GTI�n�g�*ϡ�WK���Y��8�lU8�d@A�dyv���b��������c(���Є�a��L��Ih*��:���ߵ�w���8�� 4�V���V��õ`²qA$� R��@� �f�&B0t�,�� �JU �&�g*�� �Yʹc-,b� .�<�26�`сzѪl��%I�3��4,� "2����j� ��VLj�� 7*� %Q2"��Էrbe�b4�NV!�Bb������� l$0��b�@%1�� �R��Ȕ�=�ĉ ���L^ ���9&�#�-���WY��ˉc���*C�Y����֒ +Ŧ��O��R�_��]��� &2O 6�B_K�a:�$���y3r*+P.�`���`��J)��E���ML��̗ �R�T|[R&޴6k3ƥ$:�)ւ\�����S�A�WBar�h�|F��^���P������b-�B��J �_� ���/��åC��$}�c��\�(\',9ˠ1rl�`��b5�=T�6���̑J�8܋%�X�Q�\�i��������X���? � C^X�o+a�^�� �q0y<��Q>�gu���5�jTH���3p����n�dp�oq���8�� +]��|��ʯɒ��l}U7�Zp7�ta �PC����K`<�%�X�"NY许G�%6�l #��Rc�� >�dVI#6KDJv,�A%И�óQ�f5� ��@}q�������p�>[�*��R-]|I!<ԧ���ȷsN���Z�����{sE�CY-Z���@dtZ��( Qj��^ MJ�X9�>o��U�H�ɚu���_�K�t�D��}l�?���t +��4�Jl�Iy2l" x���A�,f�d��؊a �!�L��Ja���D��tc�:��b��.P��I,N�E�@IJ��� ����I2�����(���xR��f��UF���$j��_� ���+~0���he>�2�����8ԩ|0����p}:͕��I$ X촱1�j�A\\������D�q���⇐�3Z]���N��(x��, Ě:��X�)�� ��S T��%��� �� g.��� �,�D�j-t*�@���3�|�b��g�N���Z���x%�� � +�უ�&�u� �9�J���%��3�dN"�RD泵t�)50��]q(Z%l�)�$)xCĬr�/��)d� �Q~8�? >[x'*n�Rg<��J�AB�Ã?����Hn�r*�I`6��q4�E��@"i�3�s�7'p˫x�1�w"�]���1��o+?�q��#U��� 1do�`��Q2���*�h;����b��Y/�N"�ǩԖ���/�lѢ�ͼإW�5�{8K%�:5] + ~\<2�� ��tN��X:�#�<.�$S( ���͔�3r�beN�M \.ќ�_�4�D�Q��%��� 2A�^(�� +��"�l�h:�R�h2�:Aӊ眏 �;ydٖ��|*3 M?�eS��)�c$-To,�a��6�a�b��x��T��> O���CK�I�1~B\�r�1�s��\�WG�YZ�}�"�݆[��/d�H#h9� �-����]`ȩC8����O� |T��C���&�I��?#���<�G~��~�QB��XH$�f�MB�c2T�J�{��f�}D�6갨Kʜ��Ty���`��܀)T>���z2�e�(g��)�sX\�����*B�R��L�Ư@>������Zj{@ ����^�U�hF��ے<�6'iN�dY����!'T�Z�b�L�0�ͯ� ɏ�b�oB �# �{���>#6�p����.ӆ�%_¯��NOG|5>�J� �N� )����LL>� �t��[b ũǫ�QɧWÂ�Vg��%�(�_q:�1�����Ob�� �w��.4� ?G��3���@!�� b�,J� +#���"Qv�:P[�R��JEP�j`.K�YZ�0q�Le������ ��W��`��o���Am��Q)~�)~N��*�ﳐd��+�Ub���F!�;��%R�V�IY*BE��U�UnV���Zp\u �pה��P�*�ZI��?��v�����= [�>c�w����g>��|&bY\��'���d�J�Wy4��J#�Vu)`XM`\lhVC�֭ص���[J\m����n� Q����}�/Qm�_+�����=���L�Q� ~߈�����oq�{೔���)WjȤ>ԏ�bR9#�HȀ2������� +��xe�%��7!�uAv��`�����w-Fp�n�kB��� �'��2*>�� ��@�:���WZ��ı�8¬��6�q#�����a�M�3V�kQ��uE�M�n>m]�?*m���A�x�D�$`�Cθ�F�!��&�WԤX�c.]�u.�B�Eߖ‚b-��\�"0n���� �����SC��+���y���Ó�X�_ ���*>1 ���F�050��`@(MV��uu攒��hP��a&����T +�|VJe���S���W� G��4�� �|���Xt�#@�h��F��8a��Y�����X���7}��bw�yO���7XI���gԨ���b����HT�Vf��7�F�%��q�<���W�K�l3;4&�b�#�b$���؆� �@�ߘ���ej!���dž.p�"`�v�|)pz�V.Z��@�^�3�Cⴁ2��C�.F��G����am���њL�QQx����H�l:W�=�R� +!ZPs��|�BH��?~3�N +"GC �+_�R�� �X�Cn�@�f�%Z��*X��.�h�~�`��BD#T!��1��bh��� @���[�V!��M���@ +���3B�K +�(N>�d�Z ҫ���c �I�ď�j����� .j��� d�Ё l�*+Ul��z����BO��X��J7kb�H���E���W�I~����g �4 JJi 9�d�>�����t���'��,��!w����Rk_�ҙ +�%�P�6�<�~<�H@�nE�ge�D�c4 �B���K��4���Ga����9,��%� +�k����3Q[t����SQp½��� ��1k�A�>T���9��Y�t�b�0�am�{pz�V\�_.�Cb~�"j�����Y��Xs`�GiQ���(�&�b=UU�z%F�=yZv.�moI`3�+> ���B�c�B-��H)J+�T�'�|R��Bÿ�S�Ah��B~�%��ﳉ�M�� �D+�#���� �)PX +!��AbҨ��I29*I�E�����a�ze����7��?��;J,�tI�� �j,hN.�s�X8���Hx�B�Y������,�1Ϭ��l�,�,Pa���uڎ��OWB A*_� cnp#��Ϙ_�j����H?h��g�K�@�����΅Ø`.C�02C�BҼ��� ����&qO�Q�b)�Չ1/xÞ� ���'������%~�A�1�dwX,�1�,�R�@�ǩ���os�G��ِht �8J@�G+Xl��-&��ŗ���@(1����AY��n��,�ѵ+� 18�G&h*�@,X�h]�Xe~i���@�a���+�����}9U"�9S�DhI �(p��H"GaO>�K�*A Z�_���8��j̯:��.�W����fPJ�T&�М�Bҹ�F���eRքZ":��H�0f ��D&֎�(P��;�,�X�Ekc��V��Z�����&���R~)��c^-��d��B܆E� ʚ +E�&V�G 3�P�%�ᰘA�oF0�����Q~[� ��ǎ�}6׫N��6C����҈��? � �2�P��dt۹ +�粸���m� 6AթHRŀ~h� �,��OR�f#2�������s<�� +N��"h ���c��%�� fN��uC�����!&��@��F���6.H�8`+gp>��W-�T��������0^��̕ � �����̖?.�(cD,K۸l��V�V�)u@> F��ǯ<'н����2]R2EiEV,�V�1��N͏�S�J�a)�7-�����ϕ���� +��t���!�:����Oi�x|��aq&�PHs@F��nK�Hg�j։���*@KQ��/4d��g8���Q��s!�%?\B�8�8�؜/�ª�]��:��D�( ���Bz�uj��0��o���|�3���g%X�#��JI�"&���'{�DN>��p���Ԅ�ܧ|�J�z���8,E�j�+s�t����G��6@~T������h-�B ����H�gnƫ7�� +=@���8��a�uaVua��"����{[��ش�ȋq}6a���D� 1�a:� �p-‚��+��"� xP��i[4[���#��b�¯O�5��벨�UQ����Z8Kn]E��u�԰}*+���wuz����;k<�2(/;&U;OV��g��p)5�s#�H�'T������N�P2����J&�ze�YĂ���3��آ*� �t(��b� .q��Wѽ8a����b;������0�($�#v�O��F�F1O+����kP^>�9��a��*�}�#o�����%r@�4<���� 8��A\�Bw4�d�bb�!�b� ���dm��"kIh҈Vj1, Zr"2W���� �ր��M�}�W���X�� +�xh�6�J0�[rz�����%W����"4Z+ �"�=��{d:%�lB(�Q�=��`����|��4�Y�����2��߻�۠u(�+)�!G`>������ha�>��Xb��b���j#BdU�� I�>��H�&�!d"P�CX=2j|�.�ͺ3�����Z�}z�d�U9. �_�(����}F�2�װ�{�;�Zs!Ցрp!���c�qAd~����1��h9���)�MD4Z?����p�ͱ:�)�5� ������Z[�� �]�᳋�12g�`@���XJ�c�--�<P���-)pb���.�Va��k��c�dđE�רF7��M���^�v9Ԙ�9�O�N�Q +�wX��wP(���6ɦ��.���d��a�F%Zݍ�Y(�j]-�"�'���ѿ0���?)y��Y��gIIC,  ����|�f���v��9�>oDcڐ�R%���ƃ܅W<�}6��?S�Nd�'���\0~�^��B*�s�)��ݝ�}@$Lob� ESQ�5F H.�j8����$��L.�H"�(N� ��j� ˕׌���$��C����h���*�dH.��H���g��8Tw�E� �L�b٤�ܜ�c1:C���H�Gh���L����E�y�� +}V ���6z3�(��F�!�0C4 +%��S�&~X��a]g���Xc~���R�� ���d��_�m�r�Q���t�n%��T��Ӡ@Qgs�Gmu�ОQჀB2�B俘<��L]N��Zt��u���S�w~<1)�E��f0|v�I�Z�rYu'G����Ѽ\X���V�m�?-�SЏM~cȖkϨ�L>�ЁG��Ho+� �W����DŽ���E���a�� }�1��eC0�.�g\��sRc���#��l^)�M����qj�CҼn�)SǢjҢ7�x<����?�&�o������>;%�RZ0��G�el��ӈB7�Q�MZ��>t��tJ�(��P��=��,0�U�� +�yc��i�s0%��D��;^~QP���������Q�g��o6!K�sX���1���#���0��؝H�F����,y7UB�����g �|� ���;���"�T~�S�p�����L�_���9��D���Fm��2 ��!�@uP�6Ҩ�N�xH�T�8�DI�D��)ȋ�X +����F��Zb-?�|�?� ��.�F���#V e��3���g>��|V2ɥ�Kr"T�wD��Cy�w3ڨ�K�dk�b�e�J�$ +�q� �B�x� V��Z���~������'$\�;���!�d��B��#~n�_�(6��Ŧ L>�֜x�'�N8��18��#n]� ^xA��^��71 G��u��(�ۤT��N֒¥�����ď��|��3J�P&�B]�4~jp4V��h�+�b��/b��o!1�_���RFQ� �;q4�K��85g�T(����%���5�!�r6F�ŊX �Dj&�������w���G��ӡ�C�D���Hʈ:@�`�q������cY1Nv�ֆx.R:���|ug�:����] B���������O/K�O��T�q�!�qʜ"D��J����PP|-���+ ���r�ŏ��̊9��� +� ��|kdz;�d:��)BR/�ף��g +�x�9��U�?�t0 �����I� W�r��8%��g������J5��Y �m�����X,�1C���!k0�����Kċ�JZ�^Kɾ �n���SC�dD:'��=���0)�?H_�5b!����Aq�p�����k�4k��Vh�y�Ncbp���� Ą ��g�� �2�q�R RIL�4q�^(�KY^`�z���(�WE��>Cg�'�q@��;_�Jt� ���Z|��HG��dz^Gi�riTLܲ|�F;�B��6��F�������v�g��<�����М�'X��C�Y����Y�R>#Ȃ|�P>I����,5�&�i��X��ArC��G� +�H����#�[��Qyq?d~P�P�E�#�J8������ .�(x�S-3��X�� +1�5D� �|%�*i��l��l�a8�� ~aT�D!V�cx⶜�#-�����_D`>qT��Q?"c�XD�\�)� _�����H���(�M�e�@������:� M%ⴴ��Ӌ�U�%οe��k�z��PX�! +ň�'�w�T�}X�Q��+<$���Q6|�x:%*#�K�6AZw��3���T� �[\�;�@����ֈ���qN��˓:u�(�m��:� �`9���"�B�������P*���_���R@�LgI͛*�[R��$ z%4��ˑ^Hb5(ˀ�Y\�|��p�SW�Z +��>;���s���P�C� +��%l�Oa�t<�9r���g�����:w����!�>J���� ���Z)��k�+D>۰`Q�9����P�&7��S�u�&KnbP�&ҬTM��vV��#�R�*c2�T��f�p�)F���_�5�� #��1�Q~ %}���I�?�ѬZ"��q�'�s�HtBW���5�4�Hf ���Nr���ߎ��/t��@D�50���U(�R��@��0����gDAA@$1��B���L����0�U�\�8����������ϴ`�W4�O?��}���\��z��,�)"6x8���� �1�����H[y҇3�O6Bl�hN%�#6��}����9 �������ˏA�lnMY|��j�Rr$�L����b��N��<_ (q(��A��,q|���W����V��ԋ��h� �d�M4~��.'�}<��J�p9(֯;��5�?�Eⱹ0�� b�g�S�F1�)e$ +��� +�@�.w���'��<�_9��<�_4���(�g#��lJ����&�o��\̏�� NC��U�2]�@�T��nh w�9CP�.�6�?�����ͯJ�wY"�\�W� ���g>��|�3���jU:�7��Q���������J2�g�6�6*FB����f}���РO lLIp��8K�5H����h��� B�q����#�4�_�g��3�Y� A/��O �s� �Y� ꉣ�@���Y8��p��Ű�\5GS��a!��ʆ������'��K$�њ%��1�:�t~7�t~1.Uy�]��@� ���I��H�c�x;�€Y1q������w"1.����--z�n ����,�䍑�TpT&uJ�I�@:� Ĩ���� +�3�\– �b�)��r��O�#��H�P��>��h�%�9�f�I�^�"��2�,��}�� ��!��T��J�)Ϩ+P�HFq�\��~&ū�(42�A��:��B{�vq����`g�U2�hX�Be%��8���3�A|��-���X��ɹ��@���˝�z"7\�y��,.ל����:������TO��̢�$4�P. ����Lq6�?�D,Vp`؈�_�.��,|�/#���Fo$�.f�D��0�d.cg��W$��dD����5��5�ꥉ9��*«����xh0@3����Cf:�@���6#I�"��ZF���H�<4 A�17-�bA>� �Ȗ�8�IRdp�꛿^��_[�}�������:[s�Yt� C��1:$Hद$��Sya5�(8 �^���H,�l�h�TnƠ����j� �SN�*�}f��Ĩ1( +128��J��c~'{�,�&s �> +��׋�C��� z��( �7��i����s���`~:��Q:��g�C+����@}�k����Pa�c��5�"�ݙZ5x4�1��ߩ��+��y +nIn�p���]��!���!���U8ǭv>줍��9�+D�(p��.����R��F�f�,u��T��V��]4���'(2���� >k���BA�F ����F�?2e�e��#�J����RF2��K�I����R���Z{6�|�k�}�o���O'Uc!��.��G�5(��� +m/��R.��mJ���a៮���T]kB�A=v���Is�Ip��M����y���g������ ��e'��gS8Gm}�)sr���#��ȸ��V��j;���(w�>�*�M��I���&�/�����H"-L 2���hrR��ʉD�-�h�Ȭ<��qm��g0��1r2� ��qU�O1|])�KC���=��M�{���g�U%�����H߷]�N��P4Z}ʔ�G� +hĸX�[�x�u~H 3��FK��%ȇ��z|8�%f6�i��&���Re�G�� U&H�XA�(}���^�k�=�[���s�����g' GC�Q�Rs"n��FH��千�*��)�[�r�N/�M���PP��cћ��RM����?d���F���C�0I��g��U�0������d<�qJ%�b�3�����P��= 2���N$�X�� S�;P���By��������2���-�}�3���g>��|�3��,��;M�R�S�Nh|_��L=ď|-�( �hEo�� W�� �$V,�Q�2�:^m!k�zԦ�*Q�cs ��ܒ�>��&YL-�ccJ�>�>F%�&H��������D�0/��Ҵ�\�R-^��������A|� ��d#}��]�FW�9>���$�E�:`�F���#�n~��^�'z*���2R �jА�H�9��@��2��D�qĽ ��I�O�t�D��pJO(y�3oNZ���?"!�_+�* +�i ��X ��߸*Z���ʮ��H�&�)�ԭ�B5�X�?j+�}c�(f����p�<��!Q��HP���6���&'#���e��!��疬���, �3F)�u P@o�)r��B,m �4V���̡��B��>/dA���\z`�@� I���zX ��n��DCK@��d��b�Է6��j��_qCT9��0��:�� �P~�Hf�������< %R@������_(#D��E-��_�S,ר��Y�����CΰB����4���j��fL�c�Ē ��8�b�|b�H�����,��3�p+9����ˠ*(;�P^�F�q75��r"ؠ�8G���| ��cB�N>�0ӌ�V�2�6��}��w峒�C�%���W?�Ƚ�ĺ�n.� )�7���pV�'c�`v4�6��4M��[0�����7�Ǭ9>�)��sgT�-�xn�s�<���>5���AgaĊ��$hu��HA�n@k��H�[�C��*%�Ϡ��C����Lw����/HH��Yǣ�q�� :#MIwFª�);{6�;(���I�ϖ���D�B����Ly�}�3ҤmM�8H��� ���P-��r.� +�2+�N�Z��/�{�������o��ֱ�����*���81>!�8��,��)C+@�'�C���Ґ�F����Ѫ@�$���HaV�� +ʔ72���3P$ +Cq�$"eq� *����q�b� ،�b����HQ)�����>c�v��,�W-)�dk�!8lG���2*͙��ޘ��d J��b�.��2���(Ͻ��C�g�g�I}�KA��0U/+��VY$S����)U��m7.s��u@�q~�9�7���U�����}J>�~ ��_`��W ����}v�B���,P+T�p؜�_���njN��ZdT��Z9�-=Ak�Ò���'�`:I��ci����B�O��Y�~rȄ��K��'��;����}[Dq_��p�N�B!�U�@En�^2*�D�U+�j]�Ӳ��������b�Bm�es�K���W"��W kty�D�����\e��?`��"+��˩�������?�0�����߀<�� Ne�zv�����8sK�q��j�� �� �M8>�F�{�^ ��s���~��J��3Sշ�U����~��z�۷/��)�v�q,�}�Ʋ��=m���'� �cb���n���o�������}v�b�ȥ�;ߋ��/��p9�Y�o�<��qڟ��7�� ^ ���=�����h_���?�l��Ql�/G��{�*���T0]�h�=� V�Þk\;h����|;Ӄ�m�[� s�O3�^�Ա�� ���� �.��ZZy�{�.����Ʀ'E��Mc�I��-AR9�`uE�Ktejl�#�#���9C&p�L>�p#���O�#-8#�gҍ����E��}oi�|�ʁST������cH�J�c_b�5��q� 3�b�+�������e6�"�X9�vG��!H�P�}v���*�&s��n�S�|�����+�̈́� "V (x�r��5�M#<$� +Z�Їy�<�I�t.���2*}ƨ% �<��]�bh�{����5T���H��$���6mHc�KQ J$����P�u+�R�`J�YW�IF�<>0�<�#���s���f���>H��v��eٺ>ӣ+�̽�}���-y� x9A��ZiJ�:����XX���!ؖs��>K]�f��[J�>�&��)��`��V�[u���J/ZCUllß���OJ,��xN�󳔈�v:g�� ��"d@�Z(6 �^�p�F.I�D 28��)�!A��$VZrⰏ��u��*L�� +�b��Z�C���j� v%��B��Hj��l��c��u��?�@ec���۹N -Ш�@�x����ďA�AȪ8�m��E�5�g(�� �\���gU�����4F���M��O��W����xUR<�C҂�q$�EcQS� �X;\���Ð�g����5$Ř6$�=-H +^X�t���s�4e�&s�����z$�#<�6�Q\�eTL.T�� Q�'�Ö_ +w�P-D:F1|�m +��O�H7� �w�zcWe��)@G �Q��>�V��ΤPE[��N�S��h��F��2���]8�������[]%gy�����ZLX����7��j?����b�vd9�<���B@:���ˠ=,������x��m��#r97�*���V�PXE`Ŝ%A���+���6�ɬ����ʳo��T���4��)zA��E��>˻��Pщ�B��"9�yR�#�RNγѠ +��d5c����Hk^6�����yLm�p�>��nA��n}��p��W6�k�G���5�l����� V:��� ���&�O�RN�i���ƍ(��"�4Y�j_!� ��g"��`JZ�uN�q�JC��F���<�R!D�� +# +N2�2�&F��RU�rO��Gd��B�� ���M��Ρ�Y[X�E���������nq����>Z���,y��D[%�X,/ JaNxnP[�t�K�A 7(BK���n6g�r����s�l� �yEU�bT� �F�;��B�݀Q�ӽ����W@,b�>�R��=*N'��a�2�RV0��|��F`��$Y�J���_Wr0��KQ�Q5z�!��*�F(�6R�F"(FG@�9������������qN��X��+~����G;���!�� ���<1. �@�����@p���[�Q�@I*h��h�ݮ.�c�qh�M��ҏ� +% +Ծވ���z�E)Y��pG��1�U4 ��1�$8�Qv��A�� "ǰ^��|�`N�R%*�Z�>{�D�Ţ�p2����V��j�cAЮp���$4�"s�������LG�Ap$a^���B��HT�R+Q�N�H,pɓ��_���>���dI)&�GlsȈ"R�I�#%I�nN�@�B��c���@�+Ț�9����-/�g��`����a$�;�:�9R�bg Zզ��E� +�?C�����u����d� hL�>�=)��F� �x�!�cvY�7!< %Pr�*.�Ӓ2y��pJ�^�h\�RhP%G ��|�pK7�~aZx�j�� ��7ț�8��qh�a��Bc48r��<�5����7g�6����4��rX:��g�7# Un� +��M����,�k+hb9O� �u���&���N��n#K^��4�U��y�Â������ ��}��ڃ�!Rp���3x��S���T�(\��EL��Qj�@�\�zun��S�"�� J"<���C+�b��z�TP�@a�i|& +��}h�6B�ͫ�:�y���eZ/��sb�O���?PHsߐ��4#(�t� +�B5M奀B��)RJ���c�p� �є��R ���,@ V�P�N��D5��l��A�;��l7:�����H)SF��P�+�>�90�OP��'p��]s���t�>�-�)$*�Ⓞ� +c�tT8�Y4��䩓��~ @�FDK�B�gZ�k���H +��( e�xش]����'�p�P�b���Q*�W*��N�H�9 �g��� ���;q�g� m�M�@�8# ͂��T�t �9�BW)Ф'�� �E�i@�r�����.Q� ��~J���B~�ϒ:�&��g�Մ�Ѹ:`a�/���1zf�Z��'�Ԝ�it\�h� ,"�-B(�����q��֝�B(���BEa��/R�����b� � �|��g�*G�6^��}?ia��ɽ�Xź�x��������������/eo����b�*&��gT�1�*�R;�bTQ9���g�#-��I��M+Jz:�X'�渷'U߿�rZB��Q���9xz���<�?:��׎�� �������E��@ X�u�� �� �C�ei��F�����tj�H�"�*5X�T�S�Z(�~7 �p)�u�����0�*oaV��be���@�+j�|੼�[���A���4ڽ����6��-D�? �q����� ��R7��8z�L!�S:ms,BሊOy� @Eq����T�-��Z{%����I��n��*��Q����! `^Q��#Z���L� ��ﯼ���J������=�S)�W���n+�Rn�#"R���I�QA�M,� +f�QX>#TU+�qN<��Ap�C���bE���j\�+�p_д>� +��G���us�0�"�����vq��z:�����S�e��k%&(*���-)�HZ���c�������'��rJy�g��X�gU��?��ه���t�G�%�7��}�&�}���?�.���O��3���9��xSyB�ؾw*O�g` +���9�d�GP��op�r@`���H�}�)ھ���~LIm����?��GT������:���<���R���������61�}�-�I_�}���~ą��H-���<��;S���B� �����F޾���矼���ؾ�, c��b���b��)������0����Y��C-��-�����_5 ��d�\��/Z����.;��7������`�>+�?���ם�}�%�~� ���퓨���I`����}����}�H�} +"�}E̲�s�~�n�����Om���2�����}�J�>��vi_�7إ�w��=2i$��_o&�ǐ��]������}��Ҿ�`i�%��G�bڷ/��i�}�f�/x@��G��S�i�>�Ț�u@������T�o8���0�}@d l8+�[�Ř���3���xxa�W܌8��]@{q��J�b{�8o>�,]�k�5��@�I��#�2�Q�n�d=�uk�`Ex��[S�@�`E]H�n�rO��+l�ҩ1��Ѐ��Ԁ���9�������z�~���)�!�-.B[`L�b%���X��g��w��X'0�r���F�” ^ɃY����|$+G��yT-��>^%J���Z&<�&<��&�-*��JTs.0�v�s�A�U.Q�3G w� +�}j"��+ +L`�9�� +�J�T,dD0@>�eO�u kJ��q�&-�3HV-\�`{�$"�I:���2c) r���daF% �?�� ���P@��'L�J�56��݀�>� +�.x�2�t��&4����6k�\w��ᑢ���Ű���ύ0`����"*"\��&�g 8vZ�g���AM��� V�0�1d�m�%ۗ�hL ��+�@<�I +C4t�B`�z&,%5\�" ���8|谩Mκ$M%0��S���2�x��U*(d�VY�x�!o���Y�Q�C�+�L8��S$A@��y�e N�K`�=,���� +����J]���H�i��$5"QńXr�ׂd����mC �v7�Up�R�ՎbD��9 M��bz!�2#Égg���"�-��Q���Y�p ��s >Ma#őҠ��c�����8q�v NX�4�C���<'��:TX�w��>C��e�I!���7�!�a�G؅sň4� '&jHX r�T.�A�?&&D�����B�漽�L ���|�A,L��^G�gG�>HM�r�J~eG��H6ᾀ6�'���u$T����r��i0� �U%q�Ln‹IJ k9N �d�p��3����H$s$i�Di��Ŵ.'\ i�&�Q/7 n J�X9�aY� ����jV���Ç�>+1�f�X,{���~Ė���f�0#&%��(@��E��o��,���9˯-���* -���H1��4q��p���H����F5T��� ��qd�+�c�vDw;6�fE�t����jS7�rAw<0�R�N��sxTb.쳅��CÔ�[P ��98��J��B%�?���.��M�L�2`lފ��yQ}�y)C�.�_Z�d�rt��Y�k������8 +v�q4%⒝�rc����ڐD������Xƀ���tHZ���3(���:�Xg�T*Dr J��a->;��3�Y��S�WG�Nry^[#Y1�� |�/�q$SCtb5q1�*E:6U� �lp$� +bH�{&x��6]���VÒ(��wl�8� .�)�py>��r�hQǴ|VT��[���@�®��®�e��9$�r;�[gs�H��pݥ>�&+�i3�8��FH�4$Qp�,bT�:�D�#���"09�%�Q�?��b����}CD�9i~``���n���O >S�T�K��5��#��&  R��L�DKE��5�"��c؟ٖ3'�uT,�c8R���E�s�$�W��܍!/h�?�}�Z�f��~�t�b��TIP"�8p}�%\��_a~��1��xɩRl��P +�x:�,F��9b��4��%s�yh��8�\�M)�:C�����E�D��*7ݧ�H��7.���͇*�3Z�>��Z?����(��'h��>�[3؏��i��w8�Ъ�!��SFX�5EL�� ��jP'�\6F��ŵ�����CD>0I�x)S*U(���Ϫ���C��Q~����Ay���X;���g�I_$Aq�d�@ ��@LP�CI +�x�q\�f�`K9�IX0� ��)p�R%G�|�2����M� ?�ÿ�(g���莊ih�cZ��B](,�F[L)���/��NZ�s�Nj����p�W�C�# ~ڜ&��l6%�v<��l4��Ұ?�=�%XC?�U]��@*Q�$��������Ҫ| ��}���V��5i�YB�:����̧��@,3B%/p�K��D�S,%2�b�h� +C��-�VLj�F��Sj72�g R�i�[�����B)T�c ��"y��� ���!|p����9.ܸ 1�ۊ0>3�O"�y� �Þ fa�h ��Ax�ߴ��� �/Vg\�*�� P� A�c� �<��8��2 �Kd� ��� iZx�ƥ\t)��3QC��{�a�t��F,��ͅM��,'E�.�r�8�s :� h�/���<�ɓ0S��gW[������ +sTf� ��{=��Y�K�ש6�HgM��36��Վ`�A�����?��ߧ����}D���n�auD�%e�a��Q���^��'T�1� ;���2A�D���1&��Jt�}�)�@���rX��f~R0� +��YJ��@���'��%w�B/����x��}�����T�p�Af +� V���A���=��h5)�@P���Q���ݕ�ݐ@ �+`S浯T�����bme�����E:�ץG�� y��.<������}f�0ޟh��˱���S���k�@�W����8&!���#�k�?7*�:)-c*�GuY�"l��D���Je���˪�������+P"�\ LBz��S('�ޯdD�O$`�x��7���f��q�ޗ܃�3,�ߐ�� Z��fC�K���J@^U"�c��z��B��@���Ӎ�K���eS&���_�9z� �� (`�O��/ף�> eLݟD�#<��O������'�}MJ���>c���z�>�b9�����+,Dץ��X�Z>3�>!%�Ң�7A>�]�����-���9%r?Τ�/@�G� �9���-��'av?��J�IF��0_�>iB񙄆p�5�����jd +G԰�+�r-^��S�Q����-��f����������A2�Sp�׃��2�( ���,��93�w�n��"J�~^R�?j}�1+� +�����> D�ʢ��y���I�p���r����ߋ[���?�H��1�GR�� ��C��?=k��W��X�����~�r�g��������*(���1��������g�RA�Ы�H��-A���������~��r����;������������[��P����I���"��@��Oc�;��~ �ྈSp�R{���R�4H�Ucm�W�����j�+\��Ϋ�>�Uۗ9���>#��M@�?���w%J�I!�K��L����F��9�� +��Zyܿ�*�!����Rپ���un�<!s��A�N Έ�n�]œ�$���ɯ��)^w�;xS��Q��� ā` �us�(�%��'�ᩄOp��.~k��_��g�� �ƃY��]@C�z]�a�x� +R�S��-�X�/[�>�F]p�#�4Q9�}�_�o � ���D�͹G{�>��&K˨����dBV�th�]��<�P�A�V��}�2A=G�f���deHM���&�U��tȱ� �.���!. '��c��{DY6���Y{����0��Jb�#�OO@ihL�ؠ� �˭�0H}j|t`g҇�9AF�J¬$��c��%Y�1��ߔJ� 2N�4��dQFNd�>�������>!�EU�c�~@S ����#ԭ�D��nF�JS +;H��T?�J$h!2^?�,��\������ +U;#�TjFJ�� +�`%��� ���: ��h�>���{�I�x�N �4� ؗ46�]J��� G��"u�H\pR&��� +$�挷â�2T�.��+1T��&C�]V;�'�2���¥ �'ͭ����c����-줅��G ��D<�8���#�|L�",4L2�3�K���P sObū� qc07��2,Jo��>���@JԸBE�궚�ö���CH���� CU����aZw6N>�3y��*)p���B*I�<��e0���,(�U�xv;��*̠| +�NM�D� Cc)5 �;��|`���`�@U ���,��/V�v��-s�4�UҬ1 +���saC�Ric���]���P�Y��u9��n��k�<�� 9b�>;�YMK@2����@2���d0�[�@D���<��J-�V��0��]��.����`��8j�(m�7|[f��f�ЊLB�48 B'�;�����(jA1a�F��<��d~� �X͑�@f��c���l�J`�||F��)4��&=F� +d��a!��%2`��\D��= +��p�1�) ��TM��j+�8� +v���-���l� �vZt�F��pZ�A�F�H�ԕ&����ϙbDJ���i$f����u"L>ä�Ǩ�N�g~�)H�'���}���s�u��F�@�~^�h� ���3��� �@�¹cPI�P�QSd�X,��w�� :r ��[�g -�BRC�NgR�*�0F���l �pR�XK5"E��?x�0l�k���T���Y��r z�� ��2\�����b��X0T��7N`� �i��NB�Q.0*��VLa�������P��2m�� ����.��tjLh�1��w�Y��pVtPl��J�&��x�(ГU}XnE����-'��B�6|��$�#�bX��:͢Nģ=�����I� erʚ��@^#���*ʧ�x�aJ�W̰� ��� ����}V? �`,zb ���k�R��W���S���1H\�d��m`�^ �&�žs2sQ��gs?W� N���)�$3u�o�F v�cih��!��}\u�c+�Ap4^�("/�$��ʅ�`Ą��,�4�6�:‰���Z#���]R�O���h�Yӡ�w�Y �x�R8�I��D�)�`�R��?��:E�-�������1��[G��5�/0Qh`f�!_Ҏ�D����h� �%əQ��8���Z��M:����6���ƨ�ό�7�?by�U��?�U�}���Z�a=8�zxp�h���i���à ��aHe�I� ��onc�l�(#�|4wC$�$|]L +עL��`p��Eڂ��#R�"� +tܛ�kx��V�G���S�-ƹ� ��8���hN+�1D�%K O�҆>�ħ�rlPs8+e(L �U���6�T xH�Cv�9�,�x�j�'Cu�_��[��|�[���+�"��>�\��;Fr�[6�xK>��������lOP���ѐ�FNq_F f|��, �)p`H�n���ZW ��"����Dݑ�˳R�8.�P�/���K�A�+�����}�}-tC*tC��OK!KC9EB� �8jU(8dR7p:bA���m#�Z�9��b���p?��{[����t��e6��Gͨ�K�P�l�ҽ%�s���-���_p~OA?���~3v?�+��W�EfR� � $Zy�.�r�$!�gQ)�LD�O�Q����5��p��@��!1���R'�����Iu�h<7V]_j�񭏼9�nw�[� +���Y�޺Ov��4��%����JdژtИ� G�.��(5`9O�š��V�� +���@y2,��F�Y��h#ӏ�~Wr�V�0�s��h�0�����1��Y9�wR���i�w��))�}yvq�q��w�hV�g6.�d� 0V���;�5���i���IN��,���HQ��gF ��E2V*ӺL(3�S�<��a[&���6�����a��O0��w��U!���}�#*Jg�Q�:�˓�a�5~D�P;p�Њ_q�#�������aSViC���6P�XY� z��ڧ� +V�"��h $�Ni�Q �� ����ge��������\�� H@ ��p С���C�(b�j��F�J�K*O��c��\`|�V9���}�����ܕ����B�X>�Us�� +R�e6<�˧>�j��7�o � ,/�5���&�ِ=�w.̨P��g1�K���q��7�)�N5P.��Pj1+��W�f �,�C�P*�j� +��4R��"�O��E�xR#�b��8��d��)��0��}�����1�� �} ����}� [����P�2�!�A����S%��|�fA�H�=q�hF|�|�AT� ����F/�Kǹg�B�ep�cCu���ord�����E��� ���a�~�������I(���������>Åp�gp�S�EDS9B��j�|Ei�Ɯ7�i��"_����a� �U��Gs����> ��_���ٚ�t_l������ޏ44�/�"��_d��$ ����~����X܇C��*��U��p��"1�jE�t�"K�(�O�����ܠ�}�J�� Cs�o�����V�O��� g�=A���ow߶��w���Y���aD�}��/V�E�Ȫ�`��ʹ�<&-���&�႔� �฿h9�_���Mr_ ����p�T����2�+���k���G��@B�}.���"���,�g�*�'hJ����J��Zbj|�����%J.G���� ��?��g��s��<�S���!z�~f�?��g� �/X�?� �}�D�Wq>�3�����������>K�vT��oٰ�yr�`�%�d _�H�r�1�ﳅ�?L��_(A�������&~�G�N�{���������Wx4����r�Zp�Ԑp�������9�=����7N�_��I��R�l�k_˜l�Sw� ��rp�b���� D��Y����g��M��aL�¬�J�*��l��#����)���@%%̗�cOHw]�@����ǰ6�k�G Q÷z�`D�g�N8�Ȃ��J|�.0��=��ƒ�6_,c�zT�46Sw�&�U��t>7�)�U��r��@rP��=<#���N�U�xjP� Ӂ�h +��2�����3�?o�PB*����3 Bl�6Bl�N��3'���l� �|�Y����P@� +DXx�f�<;�8x�-72"�ǒ@�M��غ��D�Wv1| ��3����6 ��Pf���D!S_�r�0��H7�I7�ndL��Gy��U�s.�G/��01t���y0��R�_�H���#B�:@k/l���M��غ�},�IB�wM����F$L �腀2)��@�@Ӻ0fhӖ0(�g晠SM�i`�R�,��=`cy��wŤ�:� /F�[o ZC��f3���҄S�2� �pP�+C[*M�TMp��sic�}.��[>���h��LޙLTXL�_8�ش�9X\�ᴐ� +3�����(��2|�� "BSJ�����À6fHa��p��bl��|� �q��� O����P�u%�H9@BU�"yu-I�T��� ������A�Y=>Kp߈�� 7��bBbDŽ�XDŽ<��M&�^��Ʈ)V�-Ow�r���.`X���3�����k�K��Ldf(&�0| 72h��I�����/�)�@���0T�n��QԠK��3���g� rVC�ᬄsX=E�W�rX'��*`� K@y,-Y�P\�z� +�4^�l�'�$B��wTŰt��c�myD�Z�t�A!j�����y��鼌�C���+ + I0 C���n�����|�6�|9�zZ �9���[&��09�3����2�r�vT��a��H�p���H��Al�|�~`g�Z"�t�4T�P��G S汐�-B��ÉP!M�yH���S�>~�m *��d�,�g$�N��}y"J�At��W$��$��N2�Z���w�N�M��I�F���TE��F ���S9�D +pEbQ]��ll +��}XA(�%L�Q ��>-~lL�bU���|o�� �j ���(tP�T���A��U�>����� �I�q,�y>{-Q���<�Sr2� + +He�X,Tj���Y_8 ��w�A��ͤ�ΆjlO�f���4~�_�:��Z(᡾�AD���eP��r�y#��?(6��3��|�J��w"����GS���<���t*v(ԥ�Ua8�A��0�簸�D� ����B�N����V�����[J���̇�A���XC/(�d���� ��&\�,Q�%�\��N�h��Y��c{a�HOs��g?0x+-BfpA% ͧN�R��"�Az�Z�c�v����y�k ���/c�ug�V�>3+�OP�4��hh@!�F3>py���N|RN�T�x�H"fP���A��h^���a�@0�[�<���AbfJ�H�gt�\�V~���5:��Cр�y�Kҏ�%��Tq�b$5ya*���b�0H�H B[�Y�R�#�uLXe˨�K��W��:(� �#QF0 +J�\�*�X1x��!�h/Ə�^������}�q�DG�H��Z y<�Y%y�3O��,"ˊ[ _)������L��<6<�H��������X�����K~p "�)���Ha_Dz8|&���A�bna �)�8*�Cy<�O1xJ�*L h>B��횎Fq�>�(��N�O�0�hF��j�4���Zl����ʍ��s��'��/'��+B)A� �Ȉ#�PH3#�w����C0#�¢�V=@����> �м��R����m6)�0�P����*�E�C-*gQ����"�Ԉ����ߧ[��>G�S$Iƙܤ���M��O�hF��X��ݤҭqE.eA,X+���D]XAD����&���]� +��Ͼ.����bjٚ2�r�� �:��r��w A��-~ �}�𾘞@�2������g1��%�{i�:'��%?�U~������R� +�� 4$Be��i ����#���9.�K�����8�Y�6� ��(L��9�F��Đ�A�@�����T�kx��Q�����;��vG��� �)����{�����)����ԩ`E-l"-/�,Ą���7� �p"4��k�l8� �N��3����o�#R.B�s\�D����g�B �#Xhݓ��A1�ߠ��2��("�7���{_�28.�*İ"¼�Tب�e�p�Y��`B�s��-�(��DP�<|��a�"g�%9� +ˤ�h�v_�Buz��K��fΙ��gh��S7?���g�����I�����>��x [��{`8_9�H�!6~Α q�&���'���8"S�ӌ|&R5/R�COL��@��L9J�muh��`$U���/֧��������wu~�����>-���3נ�8� �ՉK��i��'�v����A���� J `0i$ 9�޸�Ra:��$B>)P��V�)��굕p�X� +琗Ͼ���������+�9�h� ���H�������D����A� �t�>������g�(�6��wT�)���T��rT�=(��7�,���b�$�V�CJW8�]n���|Ŵ��Ʌ�E�-�~8������L��@���t_vO����2���H5�`�8%F|��F��8Vւ� Zm�QZ�g +�� �5�=]>sF��~?��{1�1�������%�3;�'�H�_�_ ��0�����b�c8������ D�D�d� `oM�b�6RL��8��Ȯ�<��5Q�k�H/�y�aB9,Fz�6���9ާ��}�u������n~��*��!��?�����}Q��wq^�ݟ�o|� NY$�U]<��2�i�B{n�g\!�&A�&���9���b�����b��n��Z�� S�0Y�7]��?&�����~$��>{�|�+��o 2�MHݷ�'��LbyT%��{����vڪЉ����� +(w����@�Q�����ݏ}s�U�K�}6��������nox ������۠�� ��}�y~�Ӥ����A4�Y��?�o�}&�|E1�Ey�I���������"����e���ݻ_�`�����s�����`"ݷğ�3@T����}��z_7�ߤT����Py_����1�_���?)�}���EV8mMf�Kl�t��+�fH�?�3����u�?0��/�,����<����]�ݧ]E�����}/��� +x?�ax?>�OE��6��J����|q��lNQ|ިP���J� |y�A�~À�~up��U����3�����}���Ȏq��������+�?�@�ϱ����� D���K�/Є���V�S�F�=�'��3�L��9h�!h��cZ�sU��<�L�$G&������Z���% Ӓ��I�����q��O���IE�c���æ5�xj��#��س�{^T�qBwa�5'#��C���Ą1��[�\�(�g��Al��w���}�ld�/�1H1TcĘ@���W�� V��*Eq�{0J�D�gl�VN̽mf�օ��� +���P�h���~��oNL��P���)�@�|Q�<_�c=6(lc��+Yt#W�6�� +*�@��Nc�f��!v�!W� +N+�`�P� +~��̏���F(�T+�eBq�4�ⴹSFI��χb��.-2I;�ӹɬ��k�*n�� �@�)��R����ι�bRU�L}��Ù�j��8v�DZ��<���mr�5��!����y&@pz��7���[���9�K�8��D2����Qp��Err�>1xtVV �*����)bZP/ e��X_� ICt:�.�D��D��ѱܙ�r�083���ԓ�搂A�x �+@��b��̠Xm�ʳ��6 ��}���K-�%�U���|��CV�U� qT�gc����z�bH�V��&�6'����l�!�'�L)u:�o��$vn(��O��������g1�Ya�zcM���n��N6�oc:u�� $`�F���=��!�5 ]�rу�i�d�[� ��̓�|���`Q�� �q���O�g���2_ +&y%oe�)�c��6L[x;�uk�,��X��c'Ϋ]HrA��D >S]xx0��n0��7�����2i�����eJƔ�Y +�*þB�+��Ti����H���B���O�}F�TZ�򩴇�_[VB~6fyז��͔΁錁��y +�<���F��&�V�[C�`���cʌ` ��L��ҙ|"�� �:�"�p���D��v��v+�� ������$�����U���Y'9 ��E ��dP0^������qI<+Ul�QS�����lk`��D�NeB����H���1:�S?�۷X4�Ͼ|%?�n��N�o�V�w��WE�dC�a��62\bu�F��}X8.�^�BR��ԓ��88LG�� 91�NeS�RL�� Ǵ�|υ��ƤkNGˡ��ǺV�[~����_������|��z*�ۇ9�)=u�o�AH8���9U��L�0��On{�u�����"93o�B����ya���f�LuB��(�����`- +��"\N�����H�9��� �$�V@M Z� ��d���Y����$()�R<��b�=�@�&@\�p�� �S�ŭQ�`����p������$E.�S�U�� y�CB*?�� �_[����? +������mƛ� (� �R��׈���?��Wp�!W� ��9��Mg��%!��h���#kP����M@���!�T����i�����(ʯ<�k`E�&� +����>"�<� �@�1+y0X�s���e��@���#1��1t�Ģ�ZÞW�r� � �5��Z}Џ}+��^�IE�6���挗��i�?y�2���d�e�(K�r�)��@��#�e#�|$�3�!seԾ�d�j��WdocY|���F&���s`E����Gh�����PHn�_C+ ���Z~Y� ���?f��O����ʷ"���V +20gd3��&�!� ��@42�&���7j!��dn�S��&��3Tb�]ɋ���G~0~} �h�_�"|�u�9���Y�mP�҆�L-��k�<�ݳȡE ˧�_@�3�Pe��r Cq�>���q����.�J���=�+ +"�TZ�nZ*�f��.�_��Y~R��� ���ϸA7AE� ��=a��K���SN��P����QGp�xB��PP��]5� +J��&��z 0ݨ!j_&D���p,��.�ʂF��ْ_a`�����_4D���Yz!]�Z��w�+MI׫0[@.S^�f���}�;��R�ـֿv:8+�h:7 �)��-�R$�P�A+R�lhu +K�Ţ(���K5�Ġ��\�$���)q�W}&�Y�Z��P^�)b��'#� +��Ɇ��������z��}�Z�3��$Ч��6&F�(6(j�H���p`��v�?Ʀz� +��cb%��~W��w�����q!H����``'��Yt `3?$/�a|�:�m����F<�9*}r�Kj�0�(�j6�S��F����D)K��l��Ŧ�+��Ɵ +��["��&��EV$�������~�{��r��g�|6� ��q��V�Ң���x!C�{B�s�h�0�"� IS�Z���O.�ktߞ�P�B5���ɼ�� ��eX�gx�*i�[[�>{iN�� ?N��Ra�����?�% g�����!���0���:�WK�S+1%B��gljn�&�����Iy��V�� +g=>���*��*ףL˼5X��q'�*��)�*~ +�'Y��e������\@����ʨċ�'b�bp ��p( +EA��,���t82���ɲ���^J6+�A`) � +@�A"@,��Ag�ƒ��N�a�v���2ݔ�$?\�mČ6O��t���;�h���3�ߵ{쏍�x����]�z*��Y�xVp�4b��U%���7'� 9A^V�Q�L������i��L�I�� r���^�f +� +'��;���B1,����tށE=J� +7��Z�0�o��!�J�%��4�5qYB��-d�B���<�v*IR�zH����[����Re+ +2���T5��G� �9N����$?��� �9c��� Z��ڰmP4ҙZV��Mgj��x� m��2&R����I����~t���X�����t��c����lvBM]?a��AA�Af�����āw˂��B�>�=�%J��Qa�dF���,R�;�r$5G� �)���ťX*� �0��q�bHP-�VYa����}!����:S���3#��)u����%R����t�v�fj-T��� �BgjoB,��Ȼ0�F��ՁA��� �&`F��Q8v�4�?�5-B@�Ş�C.>�r����ki��M���X �1/m�d�M`�d�&]p$�$Z)�] ��#k\v#z�,���Xg)��@�Z���`M�w�/� @A�A�$�W��1 ��fdB��X��9t�V<�Dn����d�� +o�IC�:S{3��8��S����[�K�m w+u�Aec�0RrGgj/��H���-�q���C�kL}��~�*� L�5�ft�T� ��v�NY�1�dB� �Vmú�ʡr�6c @ ����a���] � (�����_!���xb�o�;6u�����M�� b ���?��ϩ�P���/�9�} +� ^:S��y|��6���3�#�/������>�fjV���ǗA��@x�ð��>���Zw�i�#���R����|����mp�w@�/r�lK��b*�m���id �-���_n5�6H�T %���Uɟo�aEEZ,��*J�4V���Y!R�60;tazO�d�/�Ro���p�N����&�n�m��Q9�@_o���9 P�^Z|u��0qR9;S{i.5�Y��ƹ�qr�A*h�EOd+���t��{���&��֙Zgr�X%����S� �j �"b�-7��¦�':�a��t��6�t8 (�sT�E��2���"ݬ���VD��OY���5;�̰��*�6Ȭ�T�(�9Ǻ���wL=��zM����`�EY�p:[՟�� �r�z;�Aέ˵9�~!_H��UfuЇU��X��LMŏ: �3�89�,��T9#�}gj.#��+Vxt#)�;Sk�R�$��\JD�#��L���4��' ,|��G�6B�e'�X����� r񤧬re�I�l1JV����wEqJ��r} _b�$����S���s?*X,��0�Ь�k���cՕ)��ף��K���]�DKH��=Lt��8x9/�)��K��+��HHl��GĀ�"s��D������5��� �� �ML<�35>` V�(#��٬�0U���X��� i�:S����,oUL�Vx�3�`[�pʎ��|��'�l���cQv�k�`�T�"k����h3YOq�1�)!��sN��H�XL1�며��q���a �U�Q��<ʶ��,�U`[n|�R8�!*�4�������!���=CAl����p��H���u1�C��ݍmҿm����q����2o�P�"����mA� +^m����VA�u� �����5SI��kh3� I2�b�v������U ���^�������t��S���Ƙ�^� �VT���T��ҳT�rN���n�{�jq�L�&�V}�ɓ��Q�"�Z�6=9�J,���e���Px�G�� +�bkp+�C�T,�Y�˳�!��u�?��hT�� H7��jB�����CB�'�m� ]c �['/U"<.����ln���^s5����[2g���:�օ��]����E�)@�b��EL��+|ˈ�ʟ̊tRj��k�$\~��fJD���\������Ć�΄�R�*�9�V�����)�B�uճ�4�6իd��<����@kN �M�Zt�R�*6n�Q�>��Y3�󏪼�RP�t���8�pNO�U��F�kjGu��J������*k �"�rol����SEx)�ԋ�?'c����kK���)�M�2+U���+����5��h^ⷝd#����@SÑ1��qhj:0�@Su�fyx�riy�vm�X3/���~�8���4�v��rK���>NM Ǚ��hj!Ц���>��A� ��sM��;'�����%b��3�w���=�M �� 45]��22��&��t��-��*�lq��,Fk$Ֆ��E��r�ۈ��n��F�ƒn�1W�q��o뇩�$��{[�k% +X��w�N�����%�����Q�����E%��U@i �n1�4��e/�؀��_����Z�Ul�`��E����|Q�'Q%�ua?z +Ц�\�WM9�J��!~��0Up��Ł�$���'�3���f�Z�������Թ��l�����`7"BEMX��a۶ �d�c[���?n�r��9\�l6�a{g2�]8�c}11䖏�ЗE�b�(ΞbLr+_A�@J��X��9� ��XS�N/访��|�ppf"�B�v��J���y�%�� �kj�W���C��p[��\j�Ȍ�c�S�ѡ�b@�n�R;�!�-�d��@�l!�9Кo���nҁ-�P��LM�"j0�xN��-W�?��5�Fu|�JY��XK�U}�X���c��8⽹$�cL�`g��7��ot.t긾dĬ�6c竾u�NN���~��3� ���]y�p};Kv_�ܽ�G���oН��0>a�"�wc�)3�Ae��Q\c��a�X�P�Iy�>RT�gj+ ��)iIb��Mj��RM����"[.�R��ܟ@��[�9� �I�{m�-�C��^��.Z���7���U�����.*5�߅y٩#[�(���F������}zŬ�Ey�����.M� ��~�تv]r�;�B�:�+ݨ����~�� �ǩB],�R� +�t�"29T Дo $�U��f6� �}[ZŗM���t_u�VC�i +:H��ؖ�e���^��o��eb+{�nʔf�55Ε���0��H�Fg��ʭ��EՔ<zqӞ�CT�[�>�zޠ�w%�\^ �; *p�rXճ�t/����t7��X`�nr\�)�P��� 7�ks�y���/**�z�ʟZR A�KFc��q�@@sϗJ +#��9e����IP��7;b5��CS����[F4��*�х ڠ~o��o�wxj�ʉ߲��Z� �� +��Ex�j(S���~�~�_�D�攇���ⵤ��j����r�^�� ���-�����^+��uǾ��_ +-@�n$$�ki��pQ����E��\CƿN��_!qnlIՀ�Z�$��D���E���3� �9���c�`|-.����D�PX��OC�PIWQh���:'���끹$�vLJ���A ;�,t�m�pd-dp�H`m�6�h��a*���m-pB� r�P�R�����?���H`T��!�2ӊM�:^1�SQ�[�F��eR�C�a{J�Y��N�2�]��Iy:��;�Kk9n�~fD&��j��0\QM�W-�������I�S�0Ƕ��%j�JbT L��.���a�����BSK((��E5 c���M�H��6��V���j�X�F��Y� ���Ԡ��%k��Nq{e�l�!Q���|�JbYrh$�T�ݠRӡ��J�>z��醱�d!XH+�|�Sb�ej��D0Y�?�ThX����\5���J߫�����@��7D��U���-��rt����Z��yҸ�X "e��$PnU��џy%�(�y-����'�m��%��qWI�XJ�/f���4���-�� 캰�KK@�������vG�� �[��?r N�\��}�::N��d,]H�qD1�2��n��W�{ �"����5��5����jq���gI��>�=}�nPY�,�<� �h�zas�*yʲO���vQ�4�W�){W��@L�h�.�I���B�C.n���*'{����.G�z.�T�oO +��7���vhj��=�%W��^oASC9@���`�:�d����o��������˔�O��n�<��=I� m�[�!�U�����ҭ�D��-��ڠR�ߴ� +�D�Z**{+N�15�c 8�P��\e�܈r��]����TB%��O�a�U#a� �#0������Z�uyb�,X,�� F&��&ѕ�R�j�TR����ڎ� �ҕ�����ߊ��5�S�����������.&h�Y�@=�U*/_T�$�s�l�k��"�bx�I�R���f �<_HhQIK�2�V[`�jS[�'�Q���B������x\��6���9.|!a'�����2|p�ߎ�n��{z3��<甄=_� +;��N�����c�L,�4�e�it����A%ƲM���z�Z��{�nīcM�3����/V-���R'���f(58��";-�*# V�2�$ +����&d[��D�\��sW���"r�Qpm1 ���G����'F���xu �J�r}���^TӇ.Z&?��������J��J�Y���ej=���UP���N{��Z���7����8���X�J�"y�zqɺ5Bv�绅DL �Y(��]b��a. |gT�������2_V�7e ܲ�I*H����{��45Q�a{��? +� +*� 8�Ol��O�=��*�O���PTG�b��?�VV�e�/��r>�w���GOH?!���MS�l_E(��*�$5�S�t;RY(QQh+aP����?DPI9� ��䭺��׫j�� Nf�0Y;�i'֭���-���XH�ܦ c�������:� ��g�(�-�ؖ��̠�n��~"!��PԂ���QW5TgAM��>�$8��Ȅ��N�a]I��%�L�*�ܢO�а�E��r8�A��yEe��I��z�����+����:�gBG% +үT<��{0���3)�+��H���#�N�ťMhԺ:�t~� t �Is��鉕�`�nRp�z9lϬ<N��8�pT�xTp���u����a: ��\rT�Y�?bS/S�4����G:�y$���H�\(}ZAfʄ�4��� �V:��?��!����2�Zc�L\��D]���L���T���X�wV��頂}3B{�� ���E�D� �L�*"���G� �!I%f*�� ��\-w��h ���z��zQ'ԉm4R"�TJu��Bu����u�&�p�'r���{������K������Y�s������T�k�V� �~�EjB�ɳx���*�pR�i���{��o�:(�w]�Ի�"Ի��]p9v�q�����u�s�:Bs��+Sv��L��=ߥ��ե�����t�O��z�6�\�E�K� +�\jX��jy���G�>� ]WK ] ]�n�u݃���T]�Dt=�������:��z��u��uv麸�v3��� +'�� �v]C�]�&���k��VU�u2R��..�:���o�Y�'+���@#'躁Īu��9麧b���'s���9���=-��?���MK��X��*�I���y9a?ޤ�E��Q(����6Wi�wG��J�?�RF�4>iװ�A9q)� ���1޻�B�7e�=K +a���&{����P��0�^�R�����^�C�����5/�zL�Y�J�P Lvk�h�w�{"G�& �a�.�A�T6�A`4Y��ep�.����d�o��Eؼ+�l&�-�2�e��%W�����,]�9*�wk$�+]��U�Iy��S�I}cI� r�jH�^7� �xP���a���B�(p�]�LR�(�I�U6�ԋlVܛ��sq(�����c� +�� ���|�;�N�9,(�`D�� h�� :b+��ql��13G��dbRe��\��U��\�*�]*�h|éIA6x�t�TNDH���0��^���)��2��c9�*_�� +G�ljP�Q墩9�',$@�xȏ��(���+shGi�.��5�Ӑ/Dyy�&��8��U�F����� �'��| |���l���"��E�K�̓��BTs��(���⼉��劌�29E2j,L��C�x2��<28z�k��R0����HN$�gJ’�-���8h�M�Bf�����#�c����١�K���3*<��Dtk2: nԨ�@��Ÿ�ku��2L�@��(��(�R$�Hsg…*����J�Oi��S$�&N� ��0p��0ɳ���JP�J(À8H�'�HI�щ�� |� �-Y05�q��������x�t�Z� �5@�xp`^]�珽��G.[.?@�����N�~p��a�:xC�2x=��&�!hNDCН�N������B����ʃy�O�R@LV7����C�U���/�*��7��p���Na ��4��c�&�� +|�V����S� ׅ��bD9 ��l#(�:�����M�!ם�C�='�\c��f\RXMzL�v��WM�;C��dSZ%�J1c�{�bX���ac� ��y����I��~���$bAB���3n#1� ���@8*�9tJe c��F�D$W@�}a�>X%���<�1�y�c��h�� ���#����t��X��EQ� �5-*2���hs�a�1�1�n�v��@�N~���;�B� i�%@nb����  + �\�4�A�����h�����E.����tb�>{bdxR��JF�(E��:2&A����uC�%��T�F{}�k  cy����/Nп��ݷ��o����ؔs �H��L���T���j(��Be�{�9 ���/�A�k�xH����� 5��>R]��@��s� +�MZh��Tȿ�5:<̉^y`&�z�\) .RQVHFĪ ���id*e^s +��p�E��T֓ԥ(���T8�������"��jhB��X�<���C� (�H�p��K���>��U��l/��l�6\4*u���� +�@)~�p+,2�J����S(A�!�(�"&� j�P6� �!* +�X!�e�S_��R�!�K��h�h�̜ꔻ>��py<��@�E�P��LN�:���E%<�M�,�K�L(!�8�PPRْT IH"=��y�b�Y�.��\��JD��F��"�l�K4�1?P��g&�)2�k��M/{#�Z4���Nɂ������"�%�2ݜהO߯���� �����O��� ���)a_*'�UIa:ز +(�T��^<�P�y�ڝ�#S���BÙp��X�F��t����p>'}�dJ�3) .ǩ�|�88*4`h!�T϶�Ɲ�oa�S_�%X���X$��� �v�S��& �&lO����&GM�2ivS]oJ���,�L�,���V��C�ɧs_+H�NT �\���M�(��D�V��4��+M +�o� .����SA�W(#M����Zg�����g� �}�ba��" l/= �^:�;+]=� <{��x^���Pc��T �(g�����q�!�zl(�&Wf +/.��QX@���hը�47$�Ѽ�(�|�)ˁ-U�F%�ZD� �b�$��H����b�Kp��S���R�a;)> ��쯵$���G? P�� C�/Ѥ�S +�k�L�� \���(*���Q�WĞ���2��J���H�k2\�#�J��4���[˃��nAM�?\��m����Y~/MU�k�Z�듇`'��`'��^Jk�nA��Q@s? +�f@��Þ8�9q�vu�0) +��9S�#��� ��X �Ú%��z�LKE��N��X]��/�t��t"|�.|�Q�����Ϧ奯�������*S�wS��{�3��`�F~O}D�r%T\��T]8�V��~V:x���v�v����_���Q�u�"��t����ץ� �N� .]�)�t�\p�v���x$r��B��9u��]�祣L�K7�f�+�w}�{c6���oy�IhuEEwD�^z�v}"�v]��:�u���ɁvT�v}˜v�+N��*O�>R�z���`� Ӯ����` Y��@\�*O���~�(��b�~2i~�4sGaw�/�]o�쮏:�O�u��ƨ��]_9u�KU��%����w}G�]G��� vv��ûN����-e��g����S���O ��O�i���8u:/�����Z������^�@a_0Qؿ� ��s¾�=���l��˧b�k;3N_��U�咹�A���`��TM�75E*Ͱ�^�<�G�BiI���ЛO��\a/2Tػ���D +{ ���X���"���^���ܒ��)�2�� �5�3l���~�d��+9�?Pz���jݷ�%&ym���9D\�!Q!�F �z=��z��|��F]�������{����P��$�XA60s���8�"���2ӔI ſ �mRk1������r�9�-���Rs/{�cح�L�;r�(�ƮL��,$/L�u"a������?�Zy��S���ARJ�N�~Ʌ����@h�����ǣ���m,<��D�(�0)O���w � �����@���� X�6��/ˠ��}���H�55���f��-lP��ۖ��� ��<6/�$@e,J_���� �xq?�Lo�KDJ�C��x�"���+�Ԑ�&�����MPDy4@L�h���"*���.���U��i���{�������h�z0E^����e���x�P )-�����1�����ZPJ��4��H�1x�<��x�Si�P���prJ�"=���L�QD%2���ǐ��K�S� ��e�I�f��́�,�ܼ� z0&lc�5A:� !���l����]䘗�ܤ �a�c�b��4�h�#��͌��$ e ��[ �I�감�������U�/"b�ݖ���9��RBY�V��>�O�L��(+cdp��G�̢�8Æ��O(�%b�`��BQwbN�̛r���9���i�%� +kU�4�� +������M�}H�DJ�0V�hP�ل *��I��"G0L^?^����S�B��|;S>zZ�E�Ӏ8m�!v�!ݖ����s@��ґm.�VX���֤�(����A]�GD��Ċ��ݑ�@:��B�QI梪�A$���Z���Bq0i�R�u5��j.� v��<��ع�d"3k��Z0 f2��b�$���BW]hw�p�R��Z1�����H��7$&r�� � +U�1�Ɩ�`���I)&�R7R.SɠRuJ��nbo,p�( ����<�AgJ�(% � �ۥޘ�m�U�t�G$���'���^�!��%҉� e�1m2����t���Ü^;��)����4������C�3If+tW��}��Q)������� � �&l�J�\�����V:g�Q� &�8~ ^p��b#�L;%��`Sr����������R����A�;+�v���*�P� B�-�kշl�3 -�A�NVg�V�p����Ȝߪ�ɷc~nU��GY/,�'rو�u��c4z��`A(oD�b?�s���s��Ed"� �0-��]0� l�������a �e��>�gD;Ng +,��ԙ�.�!A+�G�X��"P;�%��U� ��p�GC @��b�p,��B���B�•d���+�������x�����.ꋥbD��p�ב�V�ԴJ��D'6�������3�$�c�Y>�挄 +�K$��{0���:�*�\�Kj5���3��wC(�[����\6�'�t���y**FL�)L��2)�5�XX+�F�H=�<8u8-�(t~������� L�y���Qm�D +u<�" L�"&�fb��?; U�Z�U!$8���B��]G �������io�E��R�5"�!M��(��Q�< �Â$�yRhxȐWL|�&����Q��j҇K��v�h&��1�&� ��&4��V��+�UB�f1H�F7lT��9�߳&��r���oa;�d��0�L>b��Q���2sR�P���e7D�@�H���8�q6�H�|1����<9��L�tf�����6ќR/H�P�$ �j�A}X��OnlgTL�>�l_96���.x�뿄�-�Y�`?!,�b"�ҚB���NS2`f���IA�lܑ��f��}��Z�Bq�t�N�� +(�z+ �|�%&��� ��0 +v���PB�� �`W�� ���r�von`���b�~r�]qخO,��TYf�V���X���\��L��֝5I�]f���VG�5-ʈ��%"���AF��������Qr�����[���0�c �?����O&�߇,���"���"�_��`w}N�}�X��H�:J�T�*�X�W-��Ts�Y?P���Ł�EGE/�.^��x� [�����⥻��K?������.p�/=%�_�g�_z��y� ���q�w�c�=D����#�{#�z<�:�3�gZ���������ұ�ǥ�b�K�t:.�Q���q��K��W�q驁��E���9ɥ�0$�~�\z�5r��ʥ'����/�K75�����K�����^�ݥ��~X�@�.}c�b�K=P��.�r�.�A�.`�tYb����}]:�r]��.]G�.�Ĺ.]�i]�@�KG�".���\�X�^��:^��������Y��������߹��`a?Y��?�@�x���_�r���}�ς�\���Z6��-]F���Ѹ��tb�9�t�6~V�A �~�1�<�M����wa�ZدD,�3 ����~%���\�,R +���lO�bOwf� ǔA0�����Cm���4��l4Z� ����a�\�'��E�n��tQ�-���M�6)���9�� +"%(4�>:\3�b?�9p,��8�&J(l;�g��wf)q�S��������f[@�+v�mŲ4���ur��Z�W� �yVߍ�(p��F82$ �PR��-JsBcKh�"0���E� Q4e������*�@�U�m_�p�S�ʪ=l�,�l�@�9��..E�����tr#���כx_GY?l%���(�,p�:)�̊�I�odt�8���������R:�x�֐�R�b�����Bi���,�j��i��CTI�1�~[��/ci�C�&��гԷ�� ~��K^I���b.\,g�S@7��Eg��F��XC���T�JL .i�U"��k4����uB}�� �9��Y�oWr��%,$Uml(�^j< �#į��~񈭖Ǎ�0���0z�fTy�'9���$ ��f��.����B�> �%90��:!���P<��,�[��]��݃�7M�(,r�?�ǦH$9#S���r�Q�V0���"7����~KG��p���)������a6����D�kB �:J]1U���O�h,&:���-^-)�u���#/�mW�́(�:p5^X�����/.�6rlL�A�LL .����U*9ڭ9�-gwa�+���q� +�$E�D" 51�D�!*.~n�K�T���s�&ak�_T�?�A �@u�b,�'�C ��?�\�PנKv�h�^�I�U�3�N�x�RJ2�4��T�Y �}4ZJ�n��pi�:ٞ�҉(=U�N�rG=��y��_f'���F��.� +�7l'�:�ŀ�� �:���(O� �iK���PP0�@ �S�r� 8�{�r�+$�{��R-'�r[��٤��d��ZQ+H�VD�!��$ˬ{���㶟�Y��p�}|�V H���H��08� +���ƾ��V��Q�ti�����`C�L�!BYFN*!�<�D:3`2*�…$�#�R��xXuGQ��[Ī�� ��Qކ�qgmҶj���P]�8_ѿI8�E�A��t�`���Ʈ��^bP��8�@x�ED��>5k3���q��0n4,ݓӁ�`P.\�t@��0$R���A�[��l��F��9Ӌe���#�C���6_��i�ݛa]���St�Fth��1��z�DE� �nx*Ӂ�56�46�co�xI*��&v465��1߀S�<�M�XP@�Ts%䈆�U�'���ȅ�.�z�.W?��d!��� +q�m&�����/W�e��! x��E� �Қ#�050B�y@d=��vN����WB��V��Z�+�r�N���J�b2�ND?X>�˅I�Ӧ�n��j�(J� +���c����o��Țmd�E��ob��N&��# � +�XHfP�)d*�����Í�v�ڸjzG?@~<��&�j� �58)G)��%0TW:�ÀaD3 $:���jeT�穷��+j�c���T��]֝��`�<$�0���0�*��?ʦ)�����M�(,06B��3�,�F�l������ �7r� �ģ5̬�Kǵ��9��f�Q�@S�V�C8qpۻ��d�&#�� ��{QP�U�J ���/�c8���lğJ�^K��1��[�W/^��b g�X> �#� ��vH'��R`�A����������wr��':�t�y�4xG�f�Eǃac+��� vי� f�b{�����@�2�"]�PN\�B��L�ծ��+9�T���h�⎨�q������hb��O�갵� Œ{@�N�Q8�Ԥn@�$ȯC ��1 k�Y�$Q-"��_���#�9$aQ�Tv9��$"��ewH!���& +��V� �۞�m���e��i�G.4��*�=/(�9b`��e�!�Jl��pu$�5��Q����^}_,����*��]�/�vp�Ha�M���!�|M +-�*�CrnJ��6t��`� ��0 �S!�:I���#����R��O�=���D ���W���*�O) +�ӹP5$��8��/�P�5! nmp�T�c�-�2'�He��0X�)�el4�W�f�4�.��kvVvR0Bٚ(���#լ&�V�a����=[V�(OR�03��AZ���G J b7~Q�@������f +�nd���x���q�+��$6$�(�LP�D+ea�|���]��C�2d�Rp�C5t�)"һ�cԚiE�Un�w˶�5�vM���X���a�ZG�)ic;�8<àqh<��h���1 \/������� +ҹxD�!w��`R��"�� +���`� +e��X1�blQ����b(��Z!OkkS��P"G�R'Kj��t۷���Z��{y [��h���uns�m9���� +="�6sŦ�r�RHX���4�H�E��犎�0� D�,���l,&<3Q 47q)�~�O�P�J��T�eN.�wZɗ�����q��v�ܴ��ο���(I��B�~�B�r-��m�D���֓���(������es��?�l2X,�(|/�պ|�I�u�#�OC�BW��(aq6�晄���*�g-Q*�F�i�x�ꐇ=��mW�p�E�B���<�,�l')2�3g*-@F`qC endstream endobj 20 0 obj <>stream +�%f}�Z��N�Z�Sa.+�8�v�ԭ C3���m�� �!8�e���&�|�+ >���J�m򘍑d�t:�CP�'��J1 +qت/��l��P��ߺ�}S���lg[\F3?�^.��@��L��մ�Mi�<��� ���X +���[��,ڹ�9�$�h% �P��x�H��y��~ +Lb.8} � �i�w����N��{�br�}�;�~�~x������1(~�Î�K���3�/�q� ���`3(�N�/���&�sc��_�vL� +v��4-��e���A����B��Ζ2��3륳>��.�W/=��^��z���z�u�z��z�l(��K����z��H��.b�~���7J�"* +v2�;8�;���7Ղ=�`���5^�@�x����=���W��K���������{~�v~�l~�᥯��K����엮��/�^^�Duz���8u��v���*�A��^ vm� +�,�������Zؗ,�1 ��b�}�Ra�T���%G +�M�¾�t����wA(�6pL�AX|;�C ᠀4z�l?pH94ܼ�^����!ࠚڐ�H$��Lw��J>����'5�R��E� W�Q(]��߅}X��w r�=T������Ŵ����qg۶���gF_��Zi�w[h�w��(-p�U)w0A�*)��x�AH=���#���(l"ݝ*$�L�xN��$�ȅ :��T �~`h�_���k���#T�觡�ְr�5R�*��6�j��f�Z���)w����~@��t�k ��ppw`g�ڸ �a����H���� &6e�mOç�P���u�g�,C.X>� ���ŧ�9F���nwj�taK�t+W�t������D�Խ���~!9[}�?��4C�dS +Y!� �ID�#=旘�"0Y�h1M�79�������Ђԫ -�MÌ87�BE�i 4�`��g�!��8�UJ +;�,�Q���3�B�AN +�Y�?����ol�Z��@6�"{�&;r��fo��M5e�O1�P�m38ӝҒjI��MX��@X�I�6 +4)���K�҂4�������m�oj &����� +��wU3���R�e��a%��ƥ��\����uZ��Q������v�H��W�:�Oߊ��� +�2�}�\��D���Z\��b��}�2�.��)�@`*��CS�;J4�I�QIR���*h���I���Ȳ2U�ien�������<��k�B����֭X������\7v!sYk(d�}�nwO����>.Ed�X�-��E=��t/ 盈�#mi����.��\ U߲�r�B �h���2b�.��AG�/UeXΝ�z�ՠ��.��[��.��.���5�l����,AA���Rّe����Œ1,:brv��Z���p�m�m:�&/h�C�:�"tn�;� �(*dV @���/ZW�=�WC�nxҢ�p,�P��P6BA�1sg���pR��!!T�g �!q mZ玌!֎#%�LR��va�w�i� +���R�������/xq�+���[�l�Cc���-l,�o[�<���1}[,ԄM�D1�xxc +�#��o��-�&ce L&zm�v �q!� 2���Z14m�t{�Ŭw/�5C;���x�u��ȅ���R]��U�A`!��U��f��j� �I��6� ����)�*3�¶ +�{��@�R�=`��܄����Zi#��Cu�����DQ�$fuRV�V��=?�5pj���7�6(�����A��#� Y# �#��1P������ :���R+�� +�LRm��0�̪B�?0I���(mv��^Q����Q�[�w���.@rs� +.)�D��آ��J?��d� ��ZD�`�<�.��ğ����f� ��� _ΉӖ##���B��N�Y��*� +�yi ��1@�l��{�MHY Ih +*�q�bd�0��V��cbZG�%Eb]0+ՔnX�ϳ��=��e��^��*����Mf8Sq�wX� +%���#P@8�� +�EI��F)hk�a� p鐺�>iEjOz�ؙ��JL\zd�;ʻ���s �v�=�ŝs�v����f�y����8�r>�əi;F�@��l�+������A�)���5,@� �;@:��j�A*:��9���r���&4<,�&�D4m+�xK�dV)�:P1�IE4ރ�A��x��€#�I���d�&��l� ��=��ŖI�؞+4f�.T��L�Vs^��~���+������0�����П$2�l��1�" +�Z���&�1+48�J�>|!��\tE���M�"7Զ������'� �1�(�U+��a�$���E�p����Ua� *���O Uo�#58����hI\ G�@/d��y��iO��m��Hk4XR#otsҖ��]^A�8Mkq�~�6EI���G/�˶��\�Ar�!k�c�� ��ޔ��E����X�8��bI0 �)6 +���ƀs�)���ypN%q� � ���OC"/ e3�t*4�� �j �&vXT�A������ ���Ԇ���4������t�܄Q�܇Uq(čn>�� +���!�#"�G�s1��g�-M���4�kE)�=1a�jM15�f���Wx]0��*��,�I��g0�Z�[�lS���AC2Y�Q��7��L��6m/p�~�l���0N���@{��B +>"��[R��Hq�� �8�u���Œ$�W�&���P6���@���� �$�RMg�G�<�a�C�X�%�9%L �� ��Z��_���gtp�T���Hb=���3�\�]f^���ł �G����i�84 M�5'��� ��(�ł�J��8 +$�^�2�Õ��E��x6���(�Azl@����)��G�El�v��v�����,����;J��e�2u�FJ?P �Ci[����f9}���)%� �s�G��(D�G�p򘚁k4nV�rȁ�u:������ +�ЭD�X��q�(�dM&n_�4�r�F2Hm��m��,F�ɥ�!M.P�_������̈!�Wk�4��Sl<��q.;��@R��`��� ���|Z9�AfNJE ����h=Skgd'�����j�Xq,!�>�=n_�m������,�}t=U�lW,���1Q���Sl ��h� 8�:7tb�A�|����R���)�H@����4i� +��E9D�Z1"��Ds�ҠT��b'��(LbJU,�#Y� �sj¶K�Ķ'4������M���wP���(�Ǒ���S�H6��Sa�X #|Ҝ��F��(�������B���J=�@�� V����^��J���q‚މ�ݢ@a{Da�����/��k ٮ�y��(�l����o/�;���}]U�n�L��1ۿ��핵D�~����ԅ�0U�`�0�MC�����RyAD�v-�iz�i�f>�g��v]�@b;�b;�b{n�خ@��N�cl?��7V�`�`;H&����}�d�"�͒��b������`��e >,L�õ4��i]�AF�����-��VC�w��`w} �~*1{(��Z"�+�D�;V�`G�`�a�`'w�`�*lG�(�w<�sO�k� ���������8`��]�dOT�A��*�n!?�.�`g`<�^x�==u�]�;��R��n�p��s�;�����&��M� +�`w=R���Q�{�,�M>"�3��`��>����� �����q��f ~ �C~��0~x0~�����'��w�����<�.:<��~��~�;�'��g��+������3�}����. �`�E�`7�P�.�خf^l7&��&H�z*�]*��������~W؟���S�'�V�`�!��w6�������ߴ[��{�Q��M��IL!�E4:� 錃�C�62�=BВV���djD~/.��rF@� �?�P �����X�xf�O����L�L��‘ߎ7�����( HQ�����W�ܽN�W��B���<��T� �Q1X�˜4�I%4e�{^f�FPF W|x��9U����g�Q�I<{ �F�\:�ລ�ͶK�L�8�#�pg*w���lo�����TP�dg�B.�P�LF�遀ƐtwHϏ03�>/�5f-�b_���w���m�r��e?N�O�[�ZT��|"F� #F9��(��q��>cD�r��qڐ�h �H�)u��b���=7/�uVbP +��ב���P �X�Mg[�������PN�>�L�aS�Zэq-L�)|�J�W�%є(� +��ix㫼I�U&��k�@ �QL�z)fGl�cBb���W��r=P�#1Ӗ������Z+��:"��EX/w0i��l��@Sl�j�(d��fPbf>�h��)�����a9Z��! ��L$q�� +�D̉����4J +�HdjդT����2��^~X�ے[���L��oA!0� �2!�_j��? +;]1�6 +ց��=�C��`8R'3���ɾ5�K�A����@S���ԧ6P��O���UЋ�>��t[V�3����q�������� R|�&��H��h(.������42]�0�Y d�.� �K�s)@X�J��ϒ��&kI��;h$���lCpg,C��XB�n��0gXAxa�F���"Rߺ�|oK��n$� �^/c�23��To�#�`�˗p �:(�\�cu�%N\,2��b�b�@�J~`OՊ���3���ܜO�d@�hC0���P%X��Y�V�&o�y�� ����$To�v����� ������I…���2pV�MW<�~��&�Q�� ��;4_��%Hx�ʹ� [7�ڞ�%U#Ӄ�h|[ ���x�w~���*W��K m�7��0����)$���� +5�=�iV.=�P%:��j�5 J�?���' �#-yYd�����jP�[�.Ise4�@v�Kc}�Shj��&;J�ߥً 8������g,:&8X��t�J�s�TCF[;'*Q��&̖I|Hs���:��f�D�k ��a%�*1)��c�!� �����6y8 �����ɋp���<0�!���NlReM�x,�̐Hb���oH� &�F�#��� �Q�f��@�R�BT 8lrH&��,��$�1�I)=om�nA�k�u�-6�7�̠���H-����~��n��^�r�’�0ŝ����k�o�Z:�&�9��C]�a�1�Ul1"�|R�����F���#T�^�Q%9��DI,:��Ki] �pH�b{DpԀ��B5���pnN��z<��7@ $H�N|��VW���O�i�}[�Xiu )Y@l�IxL� +ɡ- M�gd OmR� y�W�@���B���( �,��G%n_I{��AI16��v��6��qn�{Pi�kNi���Օ� �� + �,iEN��I��`S�h.?��>��P��#ҀT z ���j�;��v�3���S�GZD�����$nV�e�'Nlg(��&�����L��HJX)��M +�r{ȶՒȫ!��*PPH) ���t�L$f��Z�O�(� W#v�%ERWu��x��U�m;��LDK�9*�8�H�#��b:�H�~��dB��$�)1�Z�:<�#@$�t0�d�i�;H΂RK [�4�9�0�VB�����c�HT����>���]Ģ��Df��&Q#�_E#A���=�F+�h��⾈�A%�� ��Qr��FZ�"�ϖ�%#�R�TթJ)���}+3b] F�>?�p��q @�H�qU������������i(���s����"��G%����)�q���Ƒ�/�q�Y����[R �C��"�9 � ��KD�v�PP63[DN���r�g\�`s��O��.��(Q^�tQ�R+ ����(ӹp�)h�D� Hɸ 2�%��#�@�УF�ќ��.�#�P6��J��( =�*��B�j�����0���jBe�`���D 2�J�fD�i͵�M5�N�]�K�Q�GE?` V�8�H["y{a�Y�+��bBv�mT������d^8�T��zxZ/��|����DS�b��5��Ic�:�?��Cp���b�4Z�Fp��r�����Ds�����py ՃE�'ܔ� (S%"�}r �;��P d)e!���ˆ��J�7����@ �H�γ����u��c70D���a��������ܢ���}��8H���ȼn�#7�(�����*$��aU�P��D�^��$�3l$.M�LT�Y��4��Y�K�az��aLT߹��թxn�3�U"�N�/�u +ո�I^!�z��"t���� )-���ea��y�"�G��F�௬�,�W<���kB�Z/�� :e�μrb��2v"��i�%� +#�K�t�Tɚ7? Z/�f��Je`Q��F���rX.XCJu6�i�#��Y�FbJ7����� �[^�R�R(a�Vt���i+qKh��M�6],�#؀6i�m �U��� �M��N��G�6&h �Q�ӷFZE�ҩeIO�]tX�����T��� +��h'��SQ!F�a�3.��4�f�6��j6��9.���Y}JJ��!���^y>������1'' +(�|ig�����h 5T��fXt+��T���&Ů������2O)�xb={���!�w�f�f ���,$B=�F"�SC=S\�<ū�m���<, Ԥ��h1Q#��Hub������Xhf�i����ukw}�Ѐ f�n��=��3Z�$)��Xi��RJBzM �HJNzz��I!��(�@���w�4��]Z: ��$*�����IUٍ�L.c�н)і� C��6֊ؠ����B���0A��-L�6�kRTE�;��$���,��2|�Ż˺nV�T��"D�5��D͚_�Za?�V�k謩^_ʉ�k��u���0e��#�`���#��a���F�DL�Hb��*?�pE\�D\� �W����-�p��D�®'ئ�Gϩ�^|��TA[Z�� +B����`�I&��j��`JkH��@��3���[�_*�g��zVYoRS����n�d��c��M� ��8���2�.-"\Y�(�J&�(D����~4��~Q�/�Գ4���L��KS��H)��k�z��$�}��/��g�zzSO�h�wZj�:�K�=y`��\�$h�fq���V�2bF��d��h���tz��tz� pzO���uz��QO8d�G�_,�^Z�����kH���:�꺜�,]NN.��J"�L�㢱w*���m��2Fp�qnD��Z��ӫ��'h��Kf��/���7(���j���M/*m�?���?w��H��[�����6=e�0�b=�~VL�N �/c��?s��eRc�����\�H"����|��� FE�P����+�\S��?�?f�pzy��b{���!�K��g����Ez�b'}C�����l$g<&p� �͠l� �z�WW+��h%|������Z�}��K����qPS��|75��y�qP@�E��/Dx��U���h�#}�$5�,�<���5�J����G�~iЊ���^�����yq�v� e�u�c��mB���`!V��\��p.]['r��q-U���M�m+&�@����uQj�V/ ����C綪��Cտ +��m�d3������QΑ��md T@��r��;8DRv?�j)F�u�ךK o��"O3��OByy>��|���Kb� +i��v�N ��� �OV0¨�ͫ�GC�bM��X�J���8C�h���y���*�*ޚr ��f��S�އc�;��}��C����y݈`~� �J����E������b�E��0F�|4��j�eV%�0�� +�"7V�Tr�lKQ�e �Fz��� � '�y��{"�/4� t��C�բ!A�p2�+����d !�n YZ��,Z~����k"T9;��t5b�#%Y\�"I��Yr&�FI�1S�0��L`�9�H�t/��,�������j��?@�6T;�D���QbgL�Ѥ��5?>uf#� +MΉW�pZ��,(�Q T�$�P�p�V�{����P|��}"���(�LH�M�a��� ��e�kDSw{v"|1��#Y?�%�D9ELB9�����V�W*��W�}���DŮ? ���$��~�bO��nC���8*�K1� +��W�;�� +���`�Aؒ�rʘBJ�ВӤ*> <�@A<w-8g��9M�� �S�p� b�쪑���h��ʍ�jI��rW��,#�B��B � fj�4!�|\)c��R�4EZ� ��ǂ�]) +�: T��1x6kw�$R��B<5���d�VD��cA�����ު�G$b� 4M��������Ɗe|�x�7�-c�� �l�`\z2�hoY��&U�W;''�y8�P_�sH��ON�L3F9C�ٞW�� F�…�lؤ�*�mKv�M`�h�E���>JŸ�%E'n�/�õ�<����4H>��7��C�8 �CI(g�Z��\D��""#� �E��_/^3[q%x�R��VatVMr( v.��Ċ�����HE� + +.*y�X8 +�a�������vnkf��E�0�+� ��>^���X�'dDi�����<,L��[a���rI��P�ThXH�����Y�T��Z��js�,� �Vb/R��10�O�!��Bd�����7@��;��uT�\w<:0$V����p<�&�����#bns��@�xő����{R��R�����XB���$���R�.1oJ�fr���hn�4%˭��׽��Cy��������o"��1RZ�"�1_nq��"jp��G�HlN�01dhe�+�q+gıZ�F��ƃ�i%H�� 2�l8���l�����F��B�򼚒��(S���Ľt�%��R��Œ�`&��K3ɓ?(�Ag�l:6�$#h<���);�о`U0�j�� &NYp��0 S;BfF\� ����(lHF���h�y�#�G5b�"+�J.Kp"�X�s;�>c`�o��׈ť��6S`ʦ�)��1�A̶WhU��Tj!P(� ��� C#��F׿�A�>#}�h@�c�N�x;�B�,@��S�6&���K�S�a�� �* �)k���UjX�I��!��NV:;S�8��'>�1��&7����\+��*��YE&�CfJ��$Vm����cT�ZTH;��o`%N�x�.a�������j��Q�-�f�:��b�u��v��4��6@�N��܍E��@&�L �+[�rԫ9^kg�X�f��tc%�4��PG�d��@i�S�Q�l�P�� R�Dbg��xV���A�St�e@����>/%�jzMi(�����|'=U*� ����@0݊@8�`�Bc�.�a��'��7e��i���C��O0�.�w�bDZ�j}����uXy���Viif�4Q� +i���ѻK �s^}b���m�Cځ[ @���b�K�Ny�T/���_�E��诫���#�A��P�����vE��|�v�=����Ȁ,�-� U��3��������\/"\.$C)1Ii�� @W�@�h�D���a�f;��vX_*L�_YJ���6�O�ֳ�����e=ˠ�^��>�h�~¾�`��n�?@�.�P�ZA�=�2��ّn�U��c�.�0$�����Ƅ��x���B��P}�Ӫ�y<�޳�/Q��Y +�\��MNB��IP�i��cf���V���+�Q��&��w+GLλ�/`���(Ũ�����,�N�Z�0Uy,���x��5��N����0(�����D ���) ��B��LA���A��Ġ>~\P/�,�),���fA�&w�>�:P��o�$4�a�����"�l���q��ͯ���@��󣓙x�$��bW��cZc����$��2�)��ޢ N���ӿ����<}#R��]���d�����=�"2y �Xr�3,XZ�6���� s7�N�) ��3k�[�15<ƒq�bBF.�ݜV�ĢK��be�?~��Hil�n�p�8 +'�a Z���}N�� �&�p��j�������`N6t�?|��ӗ���"�Z��@#��EӬ\��.mQ ��� '��֦|V��B O�\g^�h� +�3��kFpH�?@R�Mn����qL�6SX�`/!�=�k���ɧ�-����*)���-�����Z�[J�Y��SQ��J�8W�8�� �;�D���T��7�h$OS��7a3��x�@ :=p��4�������6iң�>�6o1��x4��X$�T6VP��D6�H,�A�����!�D�G�9����c���ۨ��w�P&�8 ��s؉>����0������)�\�Ē�#c�'�!�X�`�!WM~�k���Ƶ2V���L5Nݕrj��!�1+���%@� ~K`N�Y )���ȐB<3 �dN��?��[^�ܐ���R�X�4$�W2xh� +%��P���`Hf��sQ2g!����#�Ԣ���B�� +�P�;�V��z٨$�2`�g��H_�<�>��呬�i�I�j��V���V��*�јPdV��!2�m�^�$C O���?� +��*��ҵ��a ��Ѥ8�U�C\����k�R�l A��Ua�B�*E�B#X�{,�/�|��|��C�5�����7�����9���TsG�5� +dR�L��Q�5Iv��qPӃ��oCbj�XĪn�/����*"]�U��,+�������ϩ}K�ᦈ�!n&k/�jM���0t`���'�����ܤԈAu� +�)8���p(�*�?�F�A) !Mb�*��EM�����d�B��}i\��%h[Z����k ���{N�C���n= B,_������az�2F�រQEH��(���/�GqTte��x�"0�rcR����و�U��]Q-(ˮ6.�:��ʮ�%Ŏ��h��E�? `� �eB�/��L�!JɃ7x��*f0HJ<��c�% .���8E<�g�� UB� ܅w-z���i���Yͼ)S�@ k���e����(_W�U�jR�v�O�|�Ɠ��"�̀��M��.@�.8 ��N�MZ�4��c�f��c���?P*9a�W���!�-r�˒�B�6�W$�p��$�FfA]*S����Z�̶�r��Ƴ����Ͷ{u�]� ��8ujt!�=r���h�;�@�g���f���.�i�_�府y�9!_���0�w�0rG�wh�K�mM' ��p�/$��܆&bJ�/iyRl�j����Gq��8r=4I��� '��m����|4�+Qdp"h�E��������}�?@�?��So�+���ԇL�9��z�x=�Ԧo�N�w�t盽�P�ط��e���;D�������΋��{��/��.��BpP8A�h,����k��U�� ����S�h�%�?�x胺.���揌�kj&�"��xb!����w�I2�3c]���� v�8AL�x&�I b�qU�B��?�)Ֆ�(=V"S���1�sx���Q��h�fQd�!ġE�h�u�:ԖO�ꇠ^ W.���i`��Q���Ȯ�A��,���Q+��c� ��%p��ݥ�Hd��X�)��d�Eg��F\ � ��T�� `���BĐ +�0���wPU�a��6��eCs��K�n�� @�D��:G�X80-�� ǥƬ���%�K�C�R�N�͚JH@��}x���m��� 0���,TR Y� -�Ѕ��U�Q����98*�F����#Z_� �R�Kk��eo��ԭX��ł��CC���9Y�8�c��N�$��3i�D��z92��:t)â|�{��CvJЇ�@6�K�0�e� -�BЩ/���\S +��ɬ�mﲲ ۋ'Y�T�bR���X��h36V�k�P�V��#4")��B"/�"�������+�cz�E�~�]�*+� ⻅—��UP��-4k����7!M�� ����tzIAyA ���]3��k����1ߩ�;F +�rp���_�0���R�s��2Q(�~-$X���X��h���)! <4� 1���$V�R>4��H��4���8� q񀸢ūZ| 1~��14V�i�Z��)�eb8�F�r0$�Q�+>:�D�1���މ��EɎ�ńZ��p�ˉِR� ��6���u�L�R5�J�aV�hCghq�o �f ��l E��-��/8[q �CMx�LJvT\���V$� UN'q�� b$Er��������ʼ0��4���WDW�Z4uie�(C�G�^���=�7��>���Rޔ��Z��M��z�C{=m*�>%.�s�jh=�Ri=�E��C����ߧ0X�!g�S r���� +^��E?�Ct��Vܭ/5�֟4��KX���b��˶��X[�S�z� [�bVzE���:���Y��|�G���g��c���\���I؝Qu>%�6JjEyS}K*}5�-�P���r`�+��+ìJ18��X�Vo���X��.q��)���Ճ.��� \=� X}y����S���C���/#����j�7.��k�V}a���ev��5�)�p���,6�? +x5Q��zҞ�� �f�_%��n��5�����cS�B��o�r�S;N�K3H�'C��&Щ|��C�}�M�)v)�6���x� �;g(0�<�%f4���8�!}?��lļp�}����u1��� �����}��G:lq�A>$�<�$` D�OC�@mA��8HI&��D�~��~�Lў̫;����|��{�ͯ���h��٠��. ����v�� A��ֈz����JIΤeiR� usx��� ^�r���!Sk���#��[��X4�,���Z!�.x^�j�y���Q6@�o1��r�X���H;d��PՅ���~ ��4<�d/y�C;~��}��4RB(�Ք0 K�) �����* +6K�8#67�� �o�ƈH��m@��Ez#Xz�-�qu3���ϳJ$��} ��e}.41C�!0�У��)�IE�F�0J~�Wq02~�2"8 +�D` +��qI�ʔ+�V����V��jS�,���C����!�1�NEc�䠅2�BҾ�BDi��$B�Ń�"�p%��K�>��3��$�jV$�aj��P�t�T�Z��9j&S����,����M�� �m'��勰R�#���8A�,'�ڹ�G<�H"?Pp�b��,����&%?�O�RxNF�UNF�e�Fo#�(�U��+ec4*M�.��S�ga� ,�^�ԥ���P&�WCA��aF}x����&.��D�7�b��� +�̂���l)F?I�,��?%�کv.��f��X +��H#@��X����\� ��A��a�izl��ʡ��]4J�X�46]2U��du�'~�bv�eY�)aM�Im9�i%9�t����/;,O�� "*Q��?�:#�����#/�\L���b ����m��2K��d�t L�FJ�;BE��B�Qp0�.�ؚ�W‹��튐�'ʫ-8��Z�4߮+1�)�xC/_�~��@�j5q#�泅u���*2#5D���s��>����`~�`w����q'I�z-K���<��L&uES����*U˥v"���O�M�&kHU� 7��������G c+��,��0(M0-�,�8O�~A-B�9&�� +�E6�hG�ȩm�������Ie��fk� +(��B�$��]�¿m�^#���U�����R&��m(��{8�/��Zfb��(��%>, �bAAfHF<%Mt��L�(����y�r&9M\4aU���$�F�wYmwY�wY-�!8��h[�2����т@�H�+������!�"����Ģ®Ȝ�t �C�E`B���Ҏ�� ��;B��7�<���G�nB���=r3�>����/1˶9�����Vt�z+:|�����W�� ݑ��a_R��_o�=��Zh8��m��V��-����!3/��YZ��3���.��0�0*��axhڒ�6��E�'�ȹX�O�$��0$%;�TXQ�f�̣; +�W��o�;0��4,��4��4�4ށM� 2C38AHX�!ؗ8/;X^|�.\���H'�ƒ�c�ʸ 1Xa��T�6�{U1�+#�i�b?�Z ��n�r^1��LOML����?�����Pq��p~`q�#�X"��&;q�:Z�XC!���M]�`&,��XW�!���$bK��k���|��O�IZ12(���6%�QV���A�<�(��=���r}BN��?�#'��-f�dSdՒ9�؝�:GGEh��cm���;�B�4+ �< 6��a����4�ⰺ$m,u�M�м�J�F���dR(��ݕΌ%�(��9f$�(M��tV���9�����r +�i��4��4{��iN��i�_yY��^1 +�� Rd�ߡ#���>�6Ѳ�­J����lGi!(h�F�=nP* �f��6�R�2���@����DLM�y}�A�0F��k�I�*d]�;��w�#�a�Zm檁�dT�`� ����z�B���c��<4%���@ �zt;[.+Td�+�k��������p�^�@��@>����X�g��V �� Y(6�-D#�)ݛ�V���3D ��&�JF����x� qx����z}#������[M�&c*!z�n�F� �IZD+�q��aJO��P7w�01�!V?0>h��;�BB� �(P^1c�t��Д���y[$T�L���X����ʢ��|����`$$&� >k\���h�MJ��J��j 醨i��;h�(ʎ� ���<��4��!1Z�#�����t�5��J����f73��I�t +����c��"�0G����H-Ru5���Ԍ4�)�ӐЊ�6`2w[�cǘ�] e���Z�T�बM!?�IE� jF(,r�q��(_�> ��p&��KPAS����P̎"E�{�p��x���I��$"���^%%N#�� ?�>X -�6c�棛<^_ �gf�,Fd� ed��RD$e1�W(�~���L,�`�&"��)M C�\�J�B���e^/4����L�DM�o6�������)O�q�$�"ɘf� +M��'��@����"2�#�k�y�W�d�(L򒶙�@"��)���WX�WH��+�.�-��cY����2�S�`O��d [��2�qLZX�~���p���@�3$z��mOeKjO�H��"���v(������}'S'�E�ՕR)�.��+�I�&wt&�M�(2�J5�RkΖ�mDU���2_������pX�3���1�g��QPR�BΑ�j`��8r�c�B�H�b��)�t#�� ����el`~�R�0�ק�@˧iW n����jL>�tp9v= +���6w��+�aY�t��2$lH!.$'Dk��4UVb�������!DQ?�ipH)���X���qʥ3�K���N�ޗ^38/��^��1 g�(>+� 8� ���"�I!��T��AL=j��)�nY���ri�R�J��A1�:��#� +�ú�A�"�,�jA<���P���i��A�����ܥ>ȥ��"�ޞ�"�6�H���!�T\��ƫ�ڄ��b8�� +��r�S�P'��o�B�M(��+R?0Ps(H�~dgu>q+4d��Z�'�I�î�%ͮϙծ�ۥ+(�~;������1Q���JZժ��ѭ@���,��� �,I!԰2(n-�ë� ]?d�]�]�Kg��K0@.�t+���.��j��%v +���˻�^"��be:�~�h GG�]O�F��@U��8�v�#������`|t}c� ]_�r!t�g����t-�G +�xg���,��RZ ���{�{$�������������/�)��X��j5C ?I +W`�G� �y=��y=��ޣ:�����/d��τ������A����}=A�r=zr\�������~�q�/���w��`U�2 �qHz��t��Z�������k����uQ�L87]�t������>���z�5��zP�j� �j��W���փ��CV��`���'n=���w��H�XB3�߸ ��X?�G��@�ߟ  �)m׹l$X������<�Rp���@���*` +�p�/�ĢU(o�Z��a�^�X���T�W|�� }S�w5P���N����*�՛_e���^= �W?*���(��SXs����w}�0�G��8���d�Xu{���% Q��t�h}��@w_Ro�h7����h��[�O���S�q�ޞ;՟�R�.��{=By������c���$�D��� �.0Ta�V +�0���& +({dT���� G�d�|�f�����\yx�b ? ��+E oh�l�Ȯ�����ƃ#?Ъ��wa���k�3���)��� ��A,�5�!E�4(3�9�`#� �M�l8�,�@��6���r#�I�iܲ�M>��=J��̉'�&7q�>I�l[Y�c�f��AE=)��Q��5���'�С|� Ss�‰� +n]x��S�0)W� ��~�l�P݋{�^�`�(�b�1V��W�|!��� +�Hz�9K�r�v2�&VH^A��"�1�U���8j)��.�S��H�̢ D�`�^!k*S�.Y4\�#�C� *��~�z��^D�S5�!�DUe�0;Ȝ@�"��F0F�eL��8����h�䅴��F�Wj��T�=�O�=� +�qF:D�Ɍ*��D/8CfI�!�od��J����\~@�^�J�_����rx�2��ʸ +�}�&��L���|8URJ�ۼ3�DDN��w���B�TD��y�ׇ�TTDۨ������g) �z6��@:/��!F�FQ���&<<�����nE2�&~�+�~����(���Q�hϣ\H4T���4��x��P'�A��� W�Tq�̪A4�V��[VՒ���XMX-~��^���$*��&���<�P���#�LE�E&{ �;�p� |H��P�&�ʗ�.mԑ$t��M�dQ�� ڤ�Y�`��Q�N�s P�b�!bHG���f8R�F����$졵X��]��mU'�k�� ���+����p���`����G2�@���D)��}e08��:%���Uj��1��e�����-�Ҥb�Ҥ��K�ޛ]��\VC�ꢺx- -�AS�s'�u��ۭ?�| �Kzat �+�R�l1�E2Y'y�����8T�l�nC�y��t2���Fb�KN Rc�e�i�%泚���쬯��QV�)� +EzW ����+)�r�0�&mO��z�[d��@XA�tڐ� b�W���(˦A��?�G'\�jF�/|��`�9���(�-pE ������m�̒�r�'xRTN-;m;m��i��^��^���Crj͏U�_e)�*�D�*r _/nAL8��� 8����^�+�u��fQ�y���0� +�aԂ>4��dj�h�*��X9TfO����l��E�x�}��L �����K)���$^�� +�7A�-�1 F������ f ��%۞�E8���<�v�r�ϋ5�� �Sg��? ��I4N �˘!-�D�WL`���)�ԠL�1T�R�:mWu�������cc4�Fd�m�B�a�BY�.���҆��� {�����!�W����,�#I��]�,�P�T ڃG��{�2���;�>��1�+~L ������b��ㄬ�Įw�2(1QdD�P�0�/���o@�S���n{�]U�,�c��l†H�*8<�kA��,I���T^7�`fr)� I>���&��0H�-vS����e��)r���2㲵��Y�-�猴���Fc*�rPB� ���H�X���`�A��`q���Ҋ��^:s��}4�X^D���*Mw5�!���5� �����GE͏7 s�4�Ia�Z<��k4A�t�ADC`tS��`z\��`E�kV�J̳�\�y�@'PË����y=R�U�$O���S��r���:8M��5�ۅ�~@⭐� &l.�Af� #�JeGd�X��61�C��:�>B�C2���k�Aw՞:3�3�J$1yR$S��h| #Q���,0nV�i�׼x�"W�<��7��钋=�j�Ű@�A�xA���L�P bY��Y��Y��?p��Jq� �̠�k��.ӊkwc�e�X$�|P�o�Ň�K �� J)֍��<� �8; ��;F-<��.�%�?P~@[,0�9��I3�h��H`��D�V���J���Dp����Ų7)$q6�DA���w�bTmH��>r���t_C��x�M�p0�wlH��A �*�N�pF�� 4Yb��$���P�s�[�b���Ny�hM�� +1 - )������#�h!ɢ��(����LrA@�3GT ��3|dJ)Z� gٷ�F���5�� �9~�l.�'��Q�<��#:�/H)$�qd,�w��Kc�ɐQ���-9��nBb#�I�uh(�z��De{Q(.(��H�4hD4wFW�~�dprP��������L[���b�� v�D��D���F��o�פ��"Z3�Eߘ�P�"��4Pr2 �t���p&?���L)ߕ�ҁi\���Uq}��e%�KIl<0 ��\ʎH!T8{[<� ���P���P�B�����SD��VN��lE�$� +!Y��G��p �@�1�-�*�p-ϋe�+��h�.2�����̠��Ȉ�(j8N�`�dz�=͆�'ς�T��dTN +��Ĉ1Zɦ�sCPB�$g�kM4��+��!�v��+ ��Zq�e��Rϖ�-HZd0�ckL� �٘rzC��4��e�Cas�Ȳ {\��{Nu�@OTA��!� k&i@��M��ٞ:n�Nq|�fq.���"���R�w\U���P��qb�����'�4�m"���8��S�Nh�ُ.f"�R NA���X�P�!E?p7*"�"�F˃C"Dʹ�6H��Lb���&^��J�RjY������I�y靅�w ��='g�;������;V�=� Z���-�$�~&�-�dէ�f�F1B +�Dp�ِ:�P�U/0�BJ�4�X���X�Թ�&�� ')(F�+S�����7����Ԉ���͆%t}K�.�u'\z��r�~��tǦ�����o��'��w��ؐ:/@V⤞�ԉ7BɣȽ)3cӭ#Z� � @�4� �(�Ԓ)h5J�:[�ފ3 +7V�Ұ(����A���E?�箻��#���Ze��+���"�]z&$��\rq�?�0�\����5y����="��Q�4%ل�-/E��'� +��j�w��JP0;��5,�!������F�;��m�uh&?�����up�u��u B�돒�����#��K��ޗ~����������̬Ȁ԰ +'Q�Rߥ%ΞW�^�ɬ�E'��{��H]|î�n��%��K��\:�{/}�Qt��Q$]�9�������uA׿奁��]�#.i� O�.���]��tq�夅�7[�[0�����dPػ������T��*���23]NZC�؅�� f����G(�.��t���*��Ʊ� ˅�̕���@�>e�`OA}���뿕���C�z�)�z;�~@��?Ֆ����������z�#�@F(��_d���&,�t) ���Lr̍�z&�n�S��!"�d��h\As׳o��� q}�]_�jד���Y"��N�t�<^�����(���^����V�>����@[�q��c�=h ��mH���x>��@�g�Qv�2l�� *�.֮�1� ����ɢxpсOR�G���C���X���ltX�8����㷄��`�*�D���SA�=�V +�$(I6���DS�6��-��Fð� +���'JQ����Ʃ@�#:��r0?y�~�ꓲ��A5��y%mD�m�>_�W�k���H4J�b6?��͙�N��J\�.�w�7?PR���`�sV��SD��Sdr'~JFg �Q�q�RmetR��T�f�+'k��ʖ�Y�F�[Fƪ.bC�7�M���]5�? ���͋Q�J�O#�2c) D���h/��.d><1���i@T����<�Nm�FN�(醴�� ��p��F�!��2'5��YU�ʭ�eu�� k�>�~H/u1���JTQ�}Dp^�C�q��c�K2���rZ#Vk.���S���R����{N$7��H,g�~�4�)��c_�ZY���,��j�B~-�������J�2�e%���.J���D�&œ�� *4�gY�61#?a�Zêd J2�����!��R�S�~�U)&��no\ap�x��T�*�Bc`��LV�*����jm��� +���t�T�X��Ui�N + �E�@���4nW�$�q���0zRA�t�&�P0����pw6��;H����\�cJ}��� Z��l�֕�p_W)�rR� +�\s� i�lH�&V{|k���5ܔ�������*Nm��)L ��h���O\ȋҬ^�tb�ʊ�"�? �Q#�Q��@#P֢������y���bb��-�nM���W�MA�V�E�cN�G�%|0[H��0PHZ�`�(q�m|�Q�0�&kR|`�q������c!,��D�� d��h�;����u�G����&�ȻR�I��p�>�=�3�F.& ����`#��p�N?�H�Y��L��`��Q�g�k�!�/�@&F9U.�#�,�T՜z���b>#F�)h� ��?p�X}m�ڵh^��|؄71�J,6@����.8&4��pP-��x��{Q�$eGӡ���/�`a{�� 4����JTٺ�$���>�,�㠲ԏXd�!��R'PK��)W�j����H-;�ؑ�ѥ + tR�h�� �sdp�I��Vէ�z[9�)Z3;J�'~|@!Ǭ+HS�����h�PR��=ʹ��IC=�ck ���d��ꁫV�� ����F��a��I�P2G��ciaQ"��>������Uʹ��qt�����,��K��RAH�����(�XV� �a̕@p����GF?�����N�şDl���2��K@�y��1�B���~� c�B�8|.�����[� e�N?0Y}��61*��x�A��Ҁ@�ˊF3�7,R��xlI��BV1�'��S���`d.�{� ��-,���)��#��N�frv�����b��F6� +I�O�SrV��y � +���%;#�|G~����"��k���('���s��9�(�k�dB8V�1j�H_��]� ojD�? +���؄C�N���L�Bh��w�%� �S+Z��<�%�zz�;JO jm��`7�� 7U�h\ ˔�p0�׀~�j�ex�r`Pq��2 +A1ɦ� �*p� P{�H� �4����]�)��ijy��DG|)����8�z�% ���{��ਁ�8���t8#��@���`��`��|�Q85>�<ތ�S����(� BAe�3L�Y�P]�����,�f�X���Y�|x��Ck�a:��-�4����ʴ9]�HdX��|0XcCX�7 +Ǥ蓈��13��z�$�F��@"-/?�ɗ��g����[u.��X.�f��Ɛi!.���y���#X�8D,+��Jk�!A��C���d�1J| +�Vl�^�� �-�@n�H�~�<�����N�u�SJ�!e�5B��,�E����i���� М#�6�B�~��?���n]Tc�t;F �M� + �)*-H/$�Gc<]e�����4Br��,.P�pot�M�b��l-�Dl���kY/E;U +Ep���n6V֛@YN1m���y���N]�4�C�m"�S�qdl�s��H��P1ᩮ��#3�' +��U&b-PM�/��g�<��pl���A���u�̐��@Vͦ��bNZ�6����b�K@Q+�5�i�.%�F�j�a�B��Qe��<����-�f�6� �Qo'3zG��܃���u@}@��8.����`0 +Y�$��ig��#a�J +�A7����1�b�Qj�,�U��̬�ü?Ps�=ͣ�~€�NC?��W5��+��R�Q�פ���m9@Ҥ'���b1Q/�kB�,,E*e�A)b�T NBcmJ������2�]O;���DP؍���)$g�����[�,�s������ ��-bx�����AD�!�DL���q�eqq� ��{8\��Ю�;��ͽt���\_������Gk��і�A�&1,;BE�Ƥ]u>�X��Տ�h��O��sĬ5^V���zw�X���/���W�n-��x*�����E�����N<�nD9�Ŗ�Bb�ם��YJ� Z��5#�o!�=)�׮�Ip���=��%7��&O�`n}���-Z����T?�v��ڇ�zyd�a +h +��V�^�^ø��h�)��t.���L +�р�!z�M�V�q����p�i��ܴ`*Åe +�$K��VƮ��{�-�[�V�I\�j��ȡE"��H����Qn���ڎN�TP$����ӭ��4�X:>RGmn$�W��޻�XM&`�a!Z�:;��j�F���G����������*����A�j��� �>�ҡ�����h^kEn;$el%�&m�'�*�B�{Lr�K�+�3������c�S�[S����Uʤ�A�@c�8gF���drG��5��h�<@��!�q�ƽ ��t +���!��k��}9}a���Zl���ظBn.�i�yP"ik����=/����:�b�]jn� 承}Ec�tHO��.N��р}�����/�� +�D���z ��H$4e"U�!y�XI�T� �������Hh%J#��$��|e�8�s�Y=����5����`�D���:���F3��@(��aiЎ� )P^/Ȇ/v�Axd � �5@-�t��p������p����ߎ8���R�(yg���,���B$s�,�qIr拎6� a �؎����] ���J��"d0 /_Ǒ��+D�p���4:d�I�r���I|�.��o�!�PTC� sjhգEA#�����Цu�Yi�cpU�(�*S������$�[��&ǂ���h�����I Zg�;7��B�h/{�:S����i��DE�yߌ�$�����������9ϚGSl���. +�z�<;���RU3Zq�2J�+$�wF�^�#v.��vi��IQy֡�!� ������{Hm��q_ �dF~@2h� ��b���U+�:#+��DS��H���<+6��`�2�U���CA�n+��z�gZU��Ț�[�ݰ���K +vn��.C��[�V�С\��CIe��͞��V���BBC�N����ǂ�+�H�#�d<)R�gFuG��E�y�?�ʩ��mLs%y��j�d#�XU+ P_�rʺ ����}�2�m�/� 03�H���Sh�1%�;�|��=iA��$�"��[�c��͡��P�Lh��� +Qhޏ��H,�No�������Z��|���V~��'#8W5�\��q\|���s +�A��?�F<��;�>Ak��5v�L�xQ��"̀A�H�p�$�7Ğ�ÓxA�"0���Bp�m&M�|C�c��"vG$P *׍�� Y_:�F��&�=q� ��+��u)��kP�`��Qx��!<�2�H���H�2�3�9��MRz�c�)�Z0�@�Fa�Q{�<0�Bgd8GP���`�E"S" %�i�s�>���y1+mR��܂s�Fs�) �S���-���-#��I��3/HR�՞=�TW��w��Hǂ!�����ɇX��>Sh��i5�"jO�Δ��l�޶�T.�Rh+L�Cg1*rCY��0 '��T����#iI�I�ְ1�XKǓ�IeU��U�A@9 �J���(T �u���w��e���^��lZ���z۸#5&�{�H$L��N(@�9�ыA£1XDA�8�&\��A�CP)��kE� {l�$.�����Uye=����=� �\����WW��׭�˴-��N��"�Q�41@��� �i ��a��/7D)����7�d��ցz�@#%o�f��`~�����|�_���!� YR�*��-0h�v40j�vl�2��4�a�8k�(�K�8dߑ�E�튛;������ ]q������q��.gy����&)y�$D����[���Z������Ja 8�����Z�8�ɰXPr�j�ĕ>@�zK<���H`cmP�����#� +���M��2QZ/�Ct��f���潪��[LP����w_@v[`�Tf����ּAP1g�)N�^y,� �x*j�:+���p�.���` +��j�� YU�S�/���0˜(�΀pL��,���b��&�#�a�Nc�v��ޡ`�q������ ��B)��H�9�K�yM��W-D��Z� �<�l4�^8�P�v~�!��a0�v���yL�� &P�,B.V�2I7R��FM i���'L�J���M�v^H���X���]�T�tX�*hf�«� �nsGS�f���X)�(/%�GzM�V��n�ԙMz*Xd� n\L����$��(ձP���z��j��["W��/��G����<�_�� ƻUJ?V�QN�!4(n1��Ҫ�ëe ?E��RbR��|�� 4��?z���ֽ^����;lO\����ǹ>䨴� � rۍ��+Le[�����EҖ���2Q�ݻ '�9�z��`�%�`}�u�^���`�'B��(!�⬞�o�\*c6%�'[��"���` `��`*rpZ��bA��J��?�~�H��>�����~�;R�K��D��w]#��ِ� ��z�I���Q�&:�?E +�����t\��&߾s��l�X��]E�XFH�)P�)u�%2 ����B�J��E��u=�G8O?J��oL�ӧ#P���z�����T�L��$�k��.��e�U��(�5��M�&[���7x؃Q��H�$�a���H�hBx~�����W��}�/�WzZҕ�5(K�i���/l������Pz�C.����ˍ��&��� J/����)Zz����d�J���Yz��+�'������!�_G���I��;G� �<�*����OLPͪ��s�8�p��Ùv�*�<��G�q�ї��O8��שg�m�3���9�_�ї���C�d�o2zLJ2�lF����*�'Y@��%�(��R�XDӃi��2L��kYM_����R��Z`�H +s&�s� �� +��B��Ar�^�8ѿ�M���(�6��`��7�P�?�ITѷNU�&V*zO%=���⦢����oA,zGB�0I8>Ԯ[�#�� +�&��Y@�Sqr)@^�F�@ .��d&a��j���� gj��н� �{ac�3�_YB�ǼP�WP�wI'Ї��} �'�=%�/-�#��C}b�A� ծa +� G*��(�x�y>pTm�5f��>͌���Yg1wM�btƆG �#L՟���1������ ��?Ѝ&�9���������|�5�|^��|>3�|^Ҁ?��)� �jA}�X��]��M�K�Sd"�Hx41��I�,폖 :�*�>�x�M�c��d>���*��H=~c`�o�o�Ґ��y�CxI��� f�K�y�%c/R�89Vp�q�Jv�{�����l�Oכ�U�K��q a��p��M����⮤ T�<�ȷ��0PX����L��]����Y��(�'�p6�X/���\0S�0��dTI���~�$�?D\V_�R-*q �(q-�2P��#����[BT��C�3r?PPevg��0�AA�DK� ͑'�S�b�bE���x�"(>�H�Z3RA! (�(��JYP����:�N5�ݭ�=E>y(���>���(����owc1��� �ȱ6��+�^_��uw�L>]�P�*��Kp���͟��ab���3:�����{�p=�K3�WN!sm�=R64p,< }�P?�QB�\WȈ\JC(m F��̌E���Jp��q�I�u����N�y��b�\ }��@�!|�P��6�'+$z�JT ��� ���K�2��3�'lSv5C�W���X ӳphh�Ṵ� +A28����{bb���|�|�y���y���X���=XO���y� <��� oI� ��Si���ZY�6,٘P���A�;��Ą���,H��?�|D,�t�bO�i�|^��^1�YFCA�� �*1��F&>`�xDJ��Q��A ��^{ХH1���b>�@{0�p`�H寀����u���ı�qaP�OJpQ�W����A�,i��}��e�2ڒ���.���fv~�p���j\؉��5eN�Ƣ*�ii�okeѴm�n"y� D��A�b�5A� E�aM�Dzc�ƍ���+})�H��91���o��bg�2�/�n_3�N泶S�6O�:a��2����J �1�#V�mCg. v{�/�:�=k,J�l T�{�=b]�7#���c��5�)��HbV��\p���g,Q��T��� ��2r��?��諚HK������p�B3� z6�~M��F ���QX|G�M�N�IF��[ƒ�.E����K����O�%"�B�ম˕g��?���y�`D���`>E͜����Lg���-f�1#n��VJ *�-�u� N�"&%ZHb0����Ui/ +�f�!X�[?p���{4�A9�dԪR �Y�9��� 8��s̃������N��g�(���TA���BME�M�w�J�1]��[��yR�Ȳ��g�X1���J�S�:fF�mD@��0T�AP�&��aV/��9N����FCN+ {D6���B�� +��TAA�TAM����Z���pjG_ �ME0��NH,UM T�svJ]]�c3.��=$$+8��n��U��$<�#����no~23�-���*g@�4����!�^�/}\�k�p3 +����(ϸ�"�[��ttUDt5U� �BѦTu9���k�������(�XD �׀�(�=W�`��\%���»�B��x&A(/��`)�@������i�1��c0����Є��ԌX ŎH��̊n�A�Z%�8&fĒ!̈my)�u�N`˂��vM�����\���=�ko{��H �!�F1�w :<��x�c�<��J���Cy�$t|6���+H6�`��� MZi��V� ��߃��z؅l�!5:S0��#0�����s1�/<�ysDJ�3�C�a��O�D�<X0�;:e$�)$T���!��$��["��D�A���� ���} +���`0� ��GC�И2��=�QB0R�4/�b��� +A�<���V�;���UDB3+B��x�D)W��"C�I����C��z6+�BSİE���B0/^�* �6����Y���\$�O T��P��>tg�K��J���j�P���1��x�A�2j ���<.���$�級.�@��gS�#5�m-�r��"P�U��j�koc�� �%L�V�(�n������h�� a@�ܸ�WC�x)7m�X�l��Gk���(�\�dS/��|�e�Q$�r�w|-��lH+��H-�(QPW�B���b�1u����,��� �:Xc�̗�� +|ssE������J+��z�''� B�dS���E<�"yI���H쒽L +�C�����l�Q=��yA��� �����ť�w��y5,. ����BY9P �?8���K�ۄ3�q9�"0�P� 7:GC�&�X#CW<�2�2�,c���V�XUN`e������2V: n��MCAz;�'�40)HT1u^�G�j�J� ����yM�h�`� �LP������ye���G�@Y"x_j�3b �a��� �y9�a˷�9�ּ�T��ܑ�����P��-cHtAF!�*}2����z�[�-%���P FX�� �t��S�6>o5�`5V1�~�8�CI�x$֣9�+����Ɂc���j(�Qh�QF�k���zM�k���Kz�T�*j���Y��k����m�����'���OŮQ�E8�^�h�Z���f���X���K)����Ť�:,���y`�b�IԹ&�û��J`4�"���:b�����* �H1ah�0�+�N�� +c� ؄Z��1�@�Qj�"�j� +pt+T@vV�K4��k}�vi�R�����<��u��I�> w[�z��|�n%�� +54֫.ͬԛ�Z�.�~��IF��?4�� �Z�����Q +�������x�kSx��ľ�~�ףm���D�z�V��ø��:��U�yx��<���M8|�}����JҀ�QY���bx�d�k=�v���7[�ω�zU�~2b������հ�%Q������̍�7V�~�(VE)`=��cS��~@Q�!Pb�m��T:`�D�,��� ��S����p�� ���M-U��I�+��Տ�zL��'ՙ�+�Q��"���fL������@ȹ����5�I���S���jS��'�DY�j}No1?�_3���~z̠u�B�:}�Y����N�Y�N����ӿ����>��O����1P�XĜ�Z��=���_ ��8!�N�b>�ێ�Bh�J���좤yJ�1uJ�M�'�R�O(���yUz8��cy���S����L�(;��W���Uz�Pz Pz�{J�<�G���S�,'��@�_ ���䁯ⲏuH���?�qC#����٥"G��O� �5��!#����(��Iz����s/�C �sU��C���>�~�g�k�Lz6��R����|%}�^I�i ������[f�����8�l�7��;�-oq�a)^#���rBF8�sc� �oS&�� !���w#��1�D��F��G=�0�&#�m�DOФD��)�s(ѻn��Q*�:�S9�����|E��l��] T�P�P��� ��8�N��r�Wk���y �z�\-j�F�ɶ�C����c$!�V�X�C���ܡ�tw����w�F�C#��i��$�f����塗�'Z ��Y���)x��8���8@L���)2��%��� B����^ +�@YR��B�B����m@-����z�G��o'3�3���z ����n�;�t���@e��ib��7��C"Y��T�W&a��@�o���Q���$9�|�A��0����v%�4�5%�2�&�/K�U�D]u*Y:�٩9���g�Iʅ���d�"d����a�+[�n�ǶI�Mol}��X�W�h(ث�P�U��E7�f��pH `slR$�n��S\1����@��n�ϲ*�PÈ5!䌕�YxM=Rp+�ʠ��� ����\[�Z�iT��3��)��op�TM�S65v�Liȁ�1@�2>gp��7�5��i�����ܙs�R�W�K_ÈK�r�y�}�@ �i;xZ#W���KP`����A&�Σӌ��U��J�i��E��|��@��� +��?���/�[�0�O�r�""ď��`�Sc�`������ �`�M����"1Je&{�R��r��[3����c�������*�C%�� �b�BL�|8���%�b��#{f���7"�މJu%t���c�����t ҉>ӂN,i��0��Iâ��ȱ��00V�\S +,Dљ�PC�E�� �c欜¡��� YW�����8�Ƞ�p�.0x�Д�[�ŐY�E+`��*q�it��c䰹$�� Y��4)N���t��t�P9�f�I+�s�$j�~��G��a �H����v���"� (�\f�eH�-Z����["����"�0+%r�Oa�3��� � �I�����ET89�osZ�44p��H��Q W3���Bg:ж(��H���9> )�"� +$pY\� _� SwD�.��$�H�;���D�p�]r�0TB*�g"V m�χ��Lf����g���d5�~Q�H%�Mp�����Z��$��1.��=<K#���uy=�g�$�3W� T +J;��pXόM�g�t�c�F/���o��S ͩ��0�XN��d �f�JB/��_�z�,=G-&dh`�ʒ3W+4��ah�P�#ԍ +x�<:�p���ˆ�������9[Bs�a��bX8-�֜����F�Q8^�PNx��� �$5H6�� N� !�v��k��`��T_�R��"Z�pލJ]p����=�&.��V�\�e�F��t�R޴�L��2����h���@O}eՒ~GTL��룝+b��V9$��j??�)e2�R�k*�AFF�2)R ^�� �Rn˥i����!�����d�(�T���[���"�RA�OW��v�|�jl8�����]1X� !��œh�j�@��;�VWM}�[���l�$�Z��@UxT$� �=j�ʛ�@Mҏ��=ĸ����� _��Ĝ���LD�_�[� ��يm��$Z�H����\�}��𸠙���N޼�%���$���0M�,m��1H��x [��.�> )S@uZ���:��Ӭ6H{�V��������"Ϡ�"�fF� <5���kRN���o���3�bD��L��\�T�`cY�Xr��qc �b�q�����E� ,*5�'�\� �4|\ +�c@͛� ��-r]V��r Ň�\����@x�75�D�X�4������ePx��A�a�+5�8Bry\�hR�,WYS9L�*�iBka�1��b��P��7�Q�3&�An`��UX2t.cZ|I.zK/-��5T5�Ô �A!R�h\kt�X[�~I����1A1-�#�~�PR4 -Q��Z㌡N�|A5D�-��Ц�Ot� �ir (_"D)[@k0�M��.:iI�Db�mBR4jǮv�W1�H�@):�� /xl;lW��>�UlBR�s�|�(w�`Y,�Ј^v�q�8�����`c.��l@a܄МH;��n��?@�|.�+,D結���6��9��!�%%2��VP�4���zq���a�, ��. ww�������G� +����z9�b6��Z(?0����ȸ��%K/RC0�� +�"�Zq��z;N[&�����m��֘�'�"A�(P�v ��\���4����W�J�r�j�~sj6w`jU���D�0�\@ +(�N�>Z1�k�%@-0���48ʠs��2tr.�`�!V?IK#�F 8�5�W���v�jP��r7<.�q�����nÄ���hbb����N��¹��BAAB:�x�9W/�.�C��$)�4�� ` �1P"چ��ގa��Ϊm���&TH U.��jyHԣ�q�G'$A= ����Äc/rA}@;��ǧ�-����iV�,� 6���k���(���� +�q �}�e�<#F�i��.���ǚ7���9�2�w&��&9(�D\�S�a�U�F~�Z� 6�'�<1��eBA�^������,qJ-�������|�n�ф0C���D<������������s�/�T� " /E��[�Hp�fR��y ��0]�A������G���ٙ=�t A�h�k޼ �A��LJG�K��&V�����1A%t6�D�`��Z�q��FRjH���*AB�� Lz:�(&��D�ԉ�U���X������Ŷu�i�� z �E�A�p����&ūĎ>� yXrTX�# ?q#���@T�2�n���fF�]Zx$� +6��El� r� + ���ngLT��P��2�,)v��T��ޠ �bpX!6 ���d4�`�a��O�2�W $d��"�W�ȫ�dy���0,H��84��e�Y��Z�*�v�wi�"�W��6�~@r` ���_����o:�����z�ܼ�4�_�D^/��=��ޱq��-��q������P`���մƗ#]^pb�3�g +�۬?�3���n�fD����3i�j%i}œ������H�Au���En��JS� �?f�e�Y�94�R� [�v'���4�#�t� � 5���#���+��fovÓ�C ��I����S���hi$�Wȑ� ���IF����>��U?A��o,V�G���X�ԷE�Sk:�L�@���w�-Y��砚X!����#o��P�=�'���; ԃ +ԛ���������=P���P�l��s�>&x�g?��S�:=8�j���b��(����������HY1E��!LV�[<�eT���t�HIP�P) +�?��s^ +�R �g-���b�El1�J��;�/:��pL�0pL?�$�_# ӓ1��^g0��L�Aӳ����nM��� +���_,\��RO��BC9��cq@�N,iU���Y!�ʂ]��Ԑl!��.���w"=&�I��$�/�N��$Y�#\Vz�+��b�/Q��{� +��4�'�#K�X�o���a����M�l �Ƀ$��p�n +{�#X^�����7Ē!��A(G���ѳ�v���<�&٣�J|���c��c��1�V��SF��J��1���`����P�Rn��}�g2���4���@��y��o��.<�)��p��DyѓF���}�����V��+� ˊ>��$|L9?*��G��� ��6@�� Dӄ�ck���T$�t^gZ=�O?'����D'�MZؼ��c�g����d"��w�$'�fp��G�e�B��`[�^- sl�`�E����_9K%$�L�Z��G$��!}P>;rP>y![m��V{��\K�2+m��g!P�L��f���з��+5�"���r���?@2�M��>K�]*��<��� ��܈Vhq��rJV�@�ɟP��'�VV ����TZg5�-�"�����܀��]J��#��ex����!�N&��BXX{ �}��`�Ǒ�� +�CL3��-��D��e�>��xe����\�F:H����� O� +h���.��}P.9 fapx'q�;�� +u!��yC��18�� +"��k��W�� ���bzꢒ��=�(`���V�$e��(�rr�O�@f�N�P�JD ���$���G9`T����C%S�b¼}^&�}���>D�S�P��|?�y42X"WB}�@8��n{ +���2�8N,�;���S>�>j4�7��dL$ǵ�&(�����X�"`6�w9��Ń�f�M�{Ej���+�I 齥���!��a���0(�_���'VD匕�!I��1�Qc�j�nY��8��K#E�e�Q�#b�D����nw~VUC=������n��0@IzN@DLI��$�7ǞcF��� ��c4lr:��:A("��clM���ِ��Q%ҳ��rBe����G�́���ŝ���Np�����,��AM \���%�錬/����O��vC@X�$�y�$��E�(R�Ft� �lF�R�_As�a����0J�2KG�S�!*A �3�e�S��p���G�q���%�&�\��î�J�X*����l`I���Џ+1�F�a�#d� + F5~��\�U�Z�qgtr�}Iy�D�Lu� ����N��0�#6ڜ.��%��A5(ݧ�{� +XQI [fOa�w�@1�D7K�#d ���~��- �ndo`��X �!2j���Isa�1���< +n +�J�*� �_2 ��$V��k$�ma$�*U$���A %�OK���YIO�Q�r�F��/��vS �{M8��? Z�>� �c7�C|Ll��UZPP���`R +���$�$c���4�SX3���)�hU�X�U4�������� �~��d+��f+o��7� �u 6@��נ4���#^�����$��1Y}��KG#?@"�U�s/�$z�D�*|] �:X���gP��gPkmH�,+�M,���-���V�QGm恪���@n�����p��2�x7�W��������*�T��Ǫ�ڍI�"�Iy�u=6����J� A7�t~����(G����Z��ݗ������^W�>�&��y;�u�-�Fw\�B�Bx0 �U ��=`h=��jn[��� ? /��d�����j��LG@ �s*��$]�0���%�q��bņ�[�4d��]�u�PuR��1� �@�+�,Q� j�� �h�؃�v(����~�F9 +�]���Z�~�1��T���FX��[� ��j("U�cT1���*U96�����n��*��R)șbf� :��[��¸i���A���`���!�0zC�2m�2/:��#��:�R�j��ۯgo$��H�� ��"��s�4�hƄ��� �Q��\V|bA(2N�:��y��:ڡ���M ���#�g�d��N�E�7�#~@p�l�O��1��9�S�HdL.QQ1ID +\֋�1��7^:!�M��:����.AΖ��|i& ֳW, �̄(� ��c��p2?]�� &�|Ti! +-�?!��"���<� +U���'Q��^�M�[h��Y�\ cU +m�Mh�J����2��2�uP8��p<4���8�B#KD���IR��)'��V�BJea<>c&��>�P�Ԧ��< �D� )؊X�@�e���>6�`�0�ܠ ���r���:’&wl�T}`����0n\%�H��2����0>�W MI��d�@)c�� 6��� ��/�m�p���唨>�Eu�T��$|_��p�VX��4��Cg��!�!��s�87��A �gG~��4�D�b���\�D�$��`S)�4�J +q ��Kg�G�Y�48�j6�GH�(��mQ'&1�S"�:�ɾG�n#X�(6�./]�N�M~A�"`���/ ��� �S�֙W*Sj�U +���� A�1��0¬'�����r4#�j6w^8���;� ��B�}h$�hߥ�QXғM)R���X���Sv4���8��� �����x_���͠� +К�N�6 �>o6�ƹ�� ��")��j�z�z�Y� �O bƐ!fA��0��x)� �n�"���^Șҽ�a����f#�� ��cNd��G�>�W0�~`�E�,�Ȼ��Hoq���X @/��QL[�2�u�P�1Eیn�¶�2[N��d��G)� \�](5��V��� 'if5�Pò��� ;w1+��wd�1�@��J����Z�D���j}p��{KT[0�!�z&~�f.I ��� +�t�~O���p�mV�z�N�����������RJ��ݝaư 4Z^�<�������Q�{aư�����5'D��۔u�_��iB�7R��ϖ��+���6�z� j���O�11n� "h=�̰��!�r �x�ѦH�5ėã���ʰ��R�7c�f��l�"Y= KV�A��c��,��{ {��U�z܋W#�?��[��z��z���ޡ�U�X��7��iȔ���w�����ރ�m���' ak֕���LgaI-�4�a%����c�w����D�Իy�z,����:S��ԯ +3��L���R��쨇���S�� +�ačz��Q?�ސ˄�����焲�`n�"6�arD���R)�ջ�F&�� <��OO/A��G=��[�����===N_^ +��^��?@���[��� �zz*��m��?'���:;��f�Ϻ,�����3_ĸZ�z��O�d��Hms҉ jg�@\��įLD5����tjԻ��.��D��C�K���ҋ.I��M�%���r�)}�E�gɡ�@�� ��'\��˓O���R�P��^�TJ����~�%�p �+q +�̥bm ���&O&�_$U2�דN�U�z0&����dՈ0�� +3l�jǴyPXc=�H�� �>t@I︜�=L��}I�<>���YKz�Y�GC������0��(d)Q��jZm�� �c�B�v����B�Ga?��BH���!��8�%4(�$ G�T x�0��s.�?��ւ�k�T}��?8�9�@8�*K��id��J���b� �0�lm[�ږ�aݫ�8ܫ�&��v��� @���e�m��X���5q�O���_�԰�h 5��-E�x�?0�p��&O�?X�V�}��)����ٿV��W~Z�?�{��,V��t����J�,��݃;�!��� T.�`�NlxF��0����H =U�d{����ݰ���!MqLR��`���� &���A1A�J��$�q�(I!i�gk��vs.�dr?�*[&Gy�&Ʈ��E'`i@ϴ�loC� O�]���i;�!���w� ʁ0T!��[*q�'vK�B䯈J��k��NO�_�JPo����s u���*\v��6vh��.9߃>���e�7w�$�cIL�g9����CTM� j�!����j �"��q�1�5Z"��Y��EF� ����$�:9H=�(��M���na��� F��Bc��#I;I�3 ȅsꠔ��gri*8貇h�] !#����6K%Ը�*8�+�fD"z�sY/ G�����A�9�d�)��ɓQ��&�+��$�2�K`��`��RMT�i+��0 dJ�"<`Mk(&�]� F+��8��NO8��_�W Ѵ���h�[��X��H���I � �Y�8Ri: B��� �����)�3��:�, 6�=�*4d�r�U�t�?X]�4��%:�w\EL�ڏ����0 2�Ȫ(�LQc��<^�$�킦x](��ĈQ�����R����������ӝs;�)�k�^��`��F�O�2V�%�;�W�����j���]=�\�~�t!��;�i+�*^J9e~ ��8g���#��M��������ÉKL ��ƌ�R���*�Œ�D�j"��*�I-�Cv�1;��#�j};�Eqɉ���Vm��D��r��51��D+-���b[4�*� +�Se�B�a!��Gl�ر���\�4�X�����G��7� -�Z����E��ĕ�*��r�FKm��u%}�j%;��v���1���IT��O��������P<#�'��L���T=���x���H%�:�Z�µ$j�Ò��i%QO&��VTǺ֘d]QM�~-��u9R�i=��#�H����y�w4��)���� ��VbA�R [Ɋ�bf5*� +IN�N��0abT����`�Y1_f3t~`�z�� <�� <�u<�]�eS���^9��+�u(� KO� +NZ�MI�;bЙ�< X>n;%����w������_��C�i�5�������Nh��.�\�2��J����+��B,�}+�m)��̀>�� � �1+��ұ���Q�Y�G�B[6�H&������k˽��. +��BA5qX F�f?�ɜ��&2�:&C�>���Я��y���*J�u�Z����� w� e����a��V)�J����u���ݰ�3� 'LB2��{^�Y!i���C`�P��9��Ct�T�Q�cRV�Ӏt\�CS�NRJ�(+Br�~h��G�.av`��2�l�eP įW�41M�|��Dd��+Y������A����C�yd{c�cwD =� +�����$9Ӆ=#@���pkңY��㔊�[}3����D�dT�P2�_r�B� i cO27G%_l�J���Щ'� =��%�5�`���,�T�zAE�o�0`��1��pH��I� +��ZB�U�Q��x�k� ++e ��J�…����Y��h�1�Og��M�-�N]h�x�~J�B0iP�F�$ +m��F�cP�^�A���������@���#L�#>l�#0��w�ͪ`�� �)rH� E�Np��¢��>��Nѭ!��^Ǐ�@-f +'�vR������#Y*�EaTo���,�#dҪ䴉-2���G�9��BC@ �X[pG��A[�vJ^W*�j7 "�]��3�(�D91���)��g/�Z��=�ʒ0+�G�����Q��Rb�NP`�HP�Ǩ1�0}@@��f���8��P�]� s���� ����� J�(��{ ��T!MK�&�vw,��5ۯ�C59�iV�cH�\��B@��у� C @�e�,h�F��M��H�C���+���rLE��sc��!�FLB�"?3��›Ctb�NvH<��ljq �)� ��y����R!��d�c�,:/���E���.��:���� �"#�]�u�jۅ�ؓ��Y]�� q�h+.���X��h���O9|a-�A���+�3,/�N�Ʌ�d�PĨ�f�����^S�nB �}��lq��'>��F��Ƅ첈y�RH�����1;�xhF� l��#H|5�Q����Rƫj�������I�L��7��Ƈ�����h���u>��q�E|:_�H���X�pI ��V�UxJ�4Ԡ6�̞A$\U��n��$�W�T +�}@�M��%�(F��>mU�z��E4B�nd����t�A��y�AL���@�wI퇀�. ��e�x��N`"y�P�~��-NM=/ЀRsފ�L O�w;4��� �zOjT��3�v�J�ab_&�zL��� �EH [�p�'�N�� jq�׷��ϴSw��-�� �x|��sH��G�;:)��� �� ����sV:/��aCjm�s�E3W��0�{��$����ϼ��id�/HX���*� ֣B�"�f1��� +�sҴY� �T��ᰒ_� Z�8���* ��9Vb�X��'Dɚ����Y�,|���{����\�}q�噙�a�a�6l=.���y��.�,�@dL��E"X�4�����%҃���O�D8C�^��K>�Մ�M���q9hL頨��Z>��O(j�5Vj�[݆x#P�9Ja�$g�e~�F�h$=��D�@���:�����o���~�~�~��v�4 +#rh��� +�z��om�������� ʮ�e��멺���t�m����z��(^��N� �*E6ʺ�#l�`�Ѕ����K2��N �m�-�C���gG1�K(���tuh@�/�E�ҸHt�h��&y�U�x�����.V�� "��_���L�_ L�5P�kէ�)�)��xJϊ=���scӶ�� �~(.�+J)�<��O(i�9zU͎�Q ��4أ��|�}l�GߺLF/R'��0~ �ȵ@�AX>77: R��l�1�4X:B�-��E� :툡'�j����C��4B��$��VI�MM�1�&��*�8ԆC��1��#�"�H6W�f�p(�* �Wp��D#��w��̋�G��P{�������W��y ��yi���[}^g@�iy��}��@_0u�\:г�����Ki��:j�~�0�N�,��0���&�R�d�-�T(�Î*l +����s���)H��j{>g!<���y�p{U�x>�N<�$�7�Ϸ���hJ���4���Mn0�W���B�4#�;!�6$����j�|-o�Ǿq�qݼ�U7.���@j��<�Dl�Q�7/�����a����w��J��J�hC�ɼ!��b7<s�Ө���y]�j~b1h^F-4�y��KrD�D�u Ѽ��5/���3��y���0�͋X��C�G��� �Ҽ��y섩��A��i6�[O� �ծA�LCCj�Z]��r�R�ˊiEp���0f �%l"ᘔ?��!߻��)��=��|�ڞﳍ���^�2(}o��Wc���j���1������9 �����{�F�y��a�ͤ�f$���@�>�\�Y]��s�D�?s���sjN�jN}�L��"C�jaS�ՅR�JԌ/b�̧�_*a�7V��+�~����;��p�� ��{�E~���,p��dҾ����Uϼ�Ծ�� +���r�� +* + +�d����g�Ap*�����*�bt��T����ڌJ�&�ǒ��i���Y6;c!c�ab����@�1�P�y�l�>�^�Ҋ_���j \�d1�`XK�?2��q�6��S +���l��B�_�|T��J����$*��:�� +��s-�&�RUJh!��&� �MA ��/�*ڴh�~�3&�ʹ�ijXk#'�B��)|drm���e)��q1~+.K�2D������� %�6nAl��� /�w����0 ��pt4�����O��h{fֺ�}��S� >�EH���+*����E�S�M^���q9�Ũ=e�(�G�߃ 1���E��$�P���a� P Ϧ��6�T�Γ66\,e]�#`: ��d6��X�L/Ő���+���[����gl�m/.Y���*���?� +��-�n���Q���5S�j�U��R�Ҽ��@�DlFf��O`�Zѝuc�$w��0��#��:�(ID��'�ɿ�L4�gyDp�"B�aF��bg�&��bߔ���:��⡖! ��]�� Â_(!�LR���}�Usd*� ��f9�q%�7�����)Gíx�u+���zuV { �J�b7m��;��PE���Y���!�Q�!���b)aX�"F��4~<��aA4��.��T�k�/È����+�Sn/Te\ �JeR����5��Pf!�/�s���i ��*h�~�"�"*��Z�T Fl� j����� �MqF�I"�c���F��d�t����"�)U7*�'�e�P`������'� ��a��_����: � + ? ����V�@y�0�v +` +��d +G�H�7�^�n�3�� �TK;�#'��Cަ[(�\SV�l����TA%|��5a���G�sT�tj�]8�T`˜T�����ҭ琰ws�� �� � +wH����$�z�B���u���yA9�.e[)ȱ���eP(묢)U+���*� �!�I?3E�JP� +u�F���`���dUUk��jյ�Gi�X��WLx0n�|��)1���e�D>ܲ���4�Rb�Y���{�N�\SH[t�- +��E�9Z9�jJ�l:�j�ɕ�q�$�G�2eM����Z#AR��x��F��,��rH8.:]� ��q�̺b�34BX���l���X��kx�8z�ç"d�M����-�$��3�9u� R� B� �EX0�nvH݇��0-�1:�Y�9B��x}9L� m�Xj�ƨ�(�FK!�NV�ύIiy�.#B�v�3a���P�҅��F�Bc��>��x^�E��?@+��=HP�Z��}*PcbT(B�BPӝ���5�U��j�H+�q�L�Q*x HJ�;��L� Ż�(H�� �"2�f��A�^�m{�jL�(�(q-@����Gc\( Cro��/��w}�X�n��!�'�x���Uʷ���(��N�$ؤ�o�Rn^P�t��2�T̤�X`t�5~�. ��7�p���凣���qLE!{(\@V!9��i�����=!_�hBlrIE^ J�<�Ū��@�>�S�aP�f�j��XH��%� �X<�q� +�GH�#������='Y#�L^�q��&v�Pc���@;ޫ + +���E�E4�˗fl ʼnG�2��M��xqJ�� �2&�������4:�*q"%�FZ�r� +�e�x �v���e: V�6��dP�3��h�w��{�O��Qԇ^e7h^]��Ƞ^��Fr-।�6,)�Q'����L�UX��X�F~�V/W�M3�`6)����Q��s7h��G!��I\���$�R�G�״Ѻ�4�r��)��D���A� ��R�,�TI��a�= +�ί�(�M�4H���v���e R!�P��(Ի'�o:�Wx���GWC�� 0L4��6��A敐� D�y�Z���܉'9k�q%�~TʦW����azL�>�LO8L�c���Zӳ#�Hј�(�'�F����2��6@���g�v�� �F����c0���#=�u��%� ���h$�ֲ�OiDҏl��K��`�� Ť��y�KT �iس�}��!� |���>+�B���DR�v}_E?�Tѻ`U��P*��!}^���]���Di �7`��j�L���)?��a��5EDz�? J+��<�����ւ�͑�A���zm���Ԡ��S ���+��L(�W��� ��z���J����۳�Z���]ȡ�ҹ�p<3ހn���ɟN��u�����M��� ���?��wy>��>���c��yRI��%?����r��~ޅ�ϧ��ys�Y��G��!��)���SO>�np�N�@����/�s@� b�ʪ��|@�cRL+��ο;�$�������9���vu~��G+{'2H�{���z>C �����m�a���_>m�Xl �Uf�D$�L��iܥ���x ��X>4撁(D%�����|p>uV8/1t8OJ��L$ΣX�5����?P�8�"T�?绖����g"��sv^���gA��{q5 � �g�)����y�����S!��)�Rl�����v�,EX�ݦ,T�B�26���͓���I���'������vm��7O9��+<��ま���ڼ7im^�6����R��J\9�O.�{xr3��B5r�q�����ᣥ������7w�=!!/�t � l�A�X��-��濁�y���,��ҿ��o󑐷y��6ߞ�͋�n��6���ͣ,��&��Kw�ɦ�K�V�Vޅ|,�!m���x�� +�?�?`M,-� �bc���5˪��'ǥ^0@��Լ�25�9��Gh��I��y>k~�"h�&4?�dͧ +Y�?�aj�j~4��u��;���A�%��UvИ4��Н8�`f,���}̋�0QG����%�w��"��w8��������=6�|oiX�/h*߇��}J�|�� +���&�^��߷���&l񽧣�^s�����W��M8|P�� ө��*ga�u~�ɗ4��u�����tE�n�ՙ��tA����@�� +]�& �,B!�!�Q;�D��DF�����|��d~�$���"���H�5$�# �y ��}�ax��n`�ɻ�w-����c�٠f P�g���0��� e��H��@���Pl �@Hi<Ŵ3 ���.j�V0�a0f�����B���`.�I%�7����{���\�.�\<>R�E�IhX`JM(� +bm1�����S��}�l{IPٞ!����4f�׼Rӷ��Fy�#���h�N� Ï�`"@�����:��䜿��㉂뵫���Š�B0� +S����by���̱@��~ � +� ��Q٢��/�J�o��s�:j���P\��b�H��U��e�����*l����j��T=(Ijx� ��*�ln��D�{�8U�f J�b&|�h��#�ೇ5?��PY6�<2�,ydPj~1|4��v4�&��ڍ���3"-�����zt�g����q&�?p� ��mj��0�3�a,��ˈ��쓆�� +�4(U�/$��Z9/��j�&N��.�>um�pE��=c)� +;����y_%j�J����J�!�����:$Vo���q��s���J���qA�<*�e�+� %] I����N����  �i��d�9��g^4\A(��w��?+��/�,R�&��7��K 2XN;G9� ���g�\�qʙ������׆�B�� �M`{�-���6��� ���p;ц���%�,��H��T!��c�D�I��C�4Yp�-Ϧ�ؙ�U&w�I��#5@d��;�~.�#��a^wށ'��� =���` +o����ʪ��n�gJM*�1R�c�9CZ=B�ߤ�z8 q���8�3��.��ɕ�鐨v.��@6O�|�XS�ꂊCݸ�מda~ �{B�n-�H +P#�4RN��p��IjL����)�2&���֕��Er�q������xl�T ף8ې�c�����єh-.Zc����@��pߊe�_�C��L��§ɂSN ��O�]�虑V藀j�*|PiI5ܪ'����Nju��@pm����=*��!��0f��1%�uI�׻�::�����{��ȴ�����\���T!��k��3!���'�A/ L<���SM���~�Ǥ�֍\#��h5���U_�uX��r���{��w�..��aXc���r�`2�d�Ԛ]�8̧=&�N�����lxs�:L6���Eǰ�w�J=2���b�V�;�iT��Ӯ\��rDm�u�������S~%��� +��k)�Y D�9�?eL߲+���Je�� )�i��sDV�6����� ��o)?p2e�\�y0eD� �� "Z ".����26�o�tx����g|���Ȥ �KI3�yBcX!����S�Ә()������/0>e���$+��G��%��)`�1��� +?�+΂�K���ؗ���^�=��t)$�����UC�m7 �1�0 �l���k�h��P�0N&7D����,����B�#��Ɲ|Ϩ��I�t�ݟv� n��PL�)�� *u�XA�^�(��� ��- ��8E<|����:��("+��⑚�qG=!���� (R�\4��2�&��%[9яy��NƝ�f� ����)+dž��}�xM�F�`O� *�EFO�˽��ɵ�� l*���i/�`]��$�I)���VF#Rj�@�%�����H�v4 �q���I���M)R$�A~`*h$/F O4��6,��q�y�BH-8�֦ ���B�3.�3�w�4�H������ z'Kx����@?�� �(�������R�tm���c�ih�Eۨ���x+�`�I���JEb=�҆�1A���|�"��(�"XF�4�(� ���rC�(�,�����,o��� +m"=�-����X��-^%X�(���Q4��Sb��S\ �n���XY�Q +�A�*��ѭ>���|h�U�̯�#��G$ֳ�Y��s ��?��4��Z֋ę�����t0����9ѿz�7$&R���s�#��̑�ÿS����̌�K�B�[!��d O��+2'��!@�������r@D>42���H�^'�L?9q�wQ���N�9��3-ӿ'��ǚe��Q�-�R�W��l�������I@M�8��Z C��&ӛ")����Az��B��C�2�!= +`C���$���M����,"��"}I�!}��Q����P��4���R�G�{j4���VR�?�OF��@���&o������iDj�D�"��xJ�ߎ}��lN��8N���������=�� c���;y��˱�8c��Z�J�0�Lz�Bt�c�в �'��[� +���}��B_�]�Q �L,C !C�)��GDc����Ń =bfC?�,��`f�_ .r �3OB/E:��?1�yZX�:��uLL��9_�C�Nᄮ��w��������y�,�<�������wD��!��F�� 0�y����A}>��>�.P�W �ϣr�Ҧ\�XfJ R):N���T2K-� +.�r-�����[�ӹ1;�Z" +WJ�<D�|�=�Tϓ��������-�=�*5<ω����� ��$�N������ f�y���� 2X�"�8ȅ���ꋌ)Z�97��ZՄ B���;.ۓ���i���Z�:����{���x[Ҳ)E�� ���y�[l^��<��l����p��U���7re��a���8���\�ͫZ�ͯ\� h���E���D U���)DD���"^Rx�ۭ�nS�� F����ދ<_n������%�C,$����7r�y�[��˞�<#��<�4�F@��X���G��G�W��L�Ў��0����b�d�村�� .I��r΍�dW��at�j�8'����K�h�#�����i��P͟�S�#�Լcv5���3V�#���D�j�lN��; 5*@ߍ/��&AK�r N���JP + L����44����L&富$TQfq��1Azq��U�s +ww��'z+B����)���g�4&x,|�{��=�a��,�/0��j[�^P� ~DF�&5(�K ��������Țeo�韧�P��`�y�/:���q3eN�[�#�=ƾ�1����d�&8�2>���-uA�=n��?��聠D��B-N h�����`.���.��,���5cH���fR����'��g3 �w�Cj(��F��"$z<Δq0�+#�7{#�J ����LI*��NoY�G���UJi�@@B[�!YB^�ꈰ0���� J���u�!��4��c���)���L@��y�(�G�o���"(�-�)��€�� ��Z(t$ ��L�T�u^D���pʴ�� �lb-�J�-őV��Q�6�����])�qq�>�ܟ Ώ��珈&��ǖ�{vHj)T��2�e�9X;�* ��FG~��Ӡ���C�X�֙J����-`^��.���?�L4�s�ʴ�YU�M�+���I���D#Fb?�\#��l��r����3%ԅ�Jn `�>��ᒒ��C�I�r��j��ƅ�p�;F(T8-�<�ȩU��� `eh��UT�?���h��)�n)�DI�d@q�4>��a�<�%�����퀆2�|2��p�%��,���~zJ�� +^�T�}j� +��uM� ��+���Q����m����1�Y2p��@72�d}�#m9�#�{�����E<v�h�����р��.�����0&��#? �ڢ�Z���i��x*�کz`Ƥnie�n���~csÐ&�YT�i� w ˆ�X� ����QΪ��a��� +W&����g�xe������V/Ӡ��in���]��*��t��� +�p��Ƥގx�&��z�@�J�?�P���L$.o���p��x���p@]��Y ��ة��7{����-� �2I�B����TSN~Z��TS�TS�P��B�?����V�z�ź�����`�M�Z]KZA:���\ �ָ�� {%��}�����ηvp�5������� �x���� �R��x�T�� +ӎ� �:"p.�"+�a�P�D�ęmvf@칿��u�t˩H:�cU ��u��5R��X�^/�X�v��t������"��?�G1�Wk$X\�A���$]��Zc` 6�#�戄��� �A����&��r�+�܄� +����K�8?�� �&� ö�A��|��-���Φ�Z��d|˳w�7���g�����MI� +�S�*a�𺀰 �� +�?@� :D�s���u��0٘1�E�}B�&�j�Z�VAkhQ��TyAٖ�@h��D@��� ��6"��0� .�d�i�.Ph�k���B�����,A���vy@����%�Y�Y�� WB+0V ��@aZ�}��Q�C#�� )uM�3�G���#Xx�ן�M�Չ�l�.!Tl�Hq�Az���1 �Aø� �X��Qï�6����5w��?��x�$�- ^E��E���44���G��֔��,: �+0p�k�¥����쬣��+���⏝q2���qi���Jtv�C8�"§�J�$?1P���P���V +�QjT���/ZA7�7�(����AeF`�8s �� G犕F�@�Fk\��^J^J-%���&�}�9����LI�4 ��l��۩�^�2&(Xբ�t�W��qQ'��:@f�S5��*�h!�yY-lӅDFN��L��t�Hw4��ϛPx���T1ǰ9^y#)�sO�r�'��T.�QHD���W  �I__��S���[�yvi��Nu�����`b=�XyF��N� zy2c�E��"T�e6�b��Z����uo��T��jpw��^-�������N��jH����F��b��b*� +��d�I~ȨS�x5P�b2��z�ֱ�b�$���9h����oZF�����i�gN����֓���,����U��*����Gp�Y� �yb&A �T��b�>픪����T=�aUϞV�{LT�'�T�_0���(��c��Mu�$1"�r�Ю8P3����3 ��� J�����q�.A9=�19=B!9}��G�"��x��#�ӳ.��?0F���1�9����z� �ϥ+g."� `!�=l�P,'� �b��z�S�J����w ��_�B�c{.}I��K����NJ��� Qzl1(}�DK��Nñ=�7=�o!X��HTSЊ,@0:�W��L����R��eN�(]��'��O�8�^G�iB=��SB���_�{��v���7FOj��d��g ��`"��! w��&� �?0��T���|>�h��b� 1�d����wb���'�5� Z=m�C>�7q(���8�'��Џ�M��J +�)4 +�l ��S�Q�!.Q�'Q�Q�U��.B���_:�6r��sѫ;�#C�l�Ge�/Ur[���|���`�>}�^!�� +zW�����g9�q�W20�3 ��I���hT���Ʀ� >��n�T�Y^����+tuF�AXV]~� 0�� +Fs�L�+[�׳��5�y���>�<�������yT�}>������5��*: ��"�A�� ;q�P�X�+�c"��{�U+1��%KrwA�|n�t��7�O��ST��9U�G���~zu^4�:o�]�oܮ�����<_B6Ϗ��`��|I7��B�,}ETMv�$N�՛�2�� B�>f5�Jn\ cY1 � +�!��ʙ��.~�Sۡ����=�8���'m��:��H��u^5g��0� ��( +:��������8~�p/��-��>0m�Ow<;dP�Ic@� �ߠ�kBؑ�\I�C�a�x����<$C�^:�g�q>s�8��`�� �A������������I�gl��Or� 9�#�M��y/#r>S��L�/��� ��̓6���sc ���1�d~XVu�J�?�F�ۂE(����Y �_V�2�2��iؼD/l� 6/��s��+"���Q�y֛��S2���N��]�[4" ~�����;��J& +��h;�o2y�"��C���@����0��n��s��x�j�,���>�Z +t�[�K}{^\�=?@Am�S4O�4�J�4��4�HI�?5�� TN�:���RX��cK)"�f0d�3�PXe�����"�yT�� ��J�&m��t���`ڂS��my&�s���}|��Z�Y�|��&b���@D��^H�/��{ҕ$��M0�f�؁N_��E_�| ��cǯc?�q��N�K�i4e�j�~:Ux|��9��{�4��VhSl,���v +a�~����G� c +��8��Q�y_�˕@��J��eۉFi� ߑc�X��/��&�*�$m$ �"��������o���Q��6&C��aI���� <���Kb��� +m\Y~&�<ܞ�\��@�n�!�o��"�U͙0�:A��'� ��q-�3Db�gM ����GD����D0 ���4�?�����GL$�{��R$�u m���q +�ee���� +�g�E�]i���M����1z@�+��Q˱�l�r�¶fBSa�aO%���X�#���@�ȥd�8 �m7{&6�D�[�,n(��X��8�x�`q�ŦBG���kh �w�S�%=������Y��l�I UP�}��kR�X� N�Eȸ�w��}�����!Xi��+S��y�T�{8Zݺ|�(t��e�)ȞK��7ʠ�wy��y����,(�l��b��I����=n;�zCt�"��2]5�uZv�k(I���.N-�k!�7.E�{�-L���^�l�L��~�Z�Y9�������\��x)���Q���*�3[�\��$ 7��#� *\��)V��8�%Q��q4�hi$9��!��+�L31�}�?�6���$�[qh��� +��������h!��Q������$��P#�Ӑ2PW`�"`��V���Ӱ&Maꊦ�EvC���%���U���D4>,aM&��4� ��ݡ\��S�X�`�+5cv(���V ש�h$��WiUۍvi DX���a ���9c�2��85M����A{n#�U +dz�q�j��e�G�IR�f$��S��B4�:���ܽ�P�0��8:�2�2�c��*'�u�� �n}9Z U'��* #��qr�J��W�������f�l��v�Oڔ�R�9���[öI�nP�|�Szd��ĄC��b(���)A�� �1�'8�LR9��j?W�Z��� �x�VHy*�I�CmHj�f|�ՀpIk<���;PC,���p +��1��8��SIh�2Pӥ2 ��q[�Q Q�`��Q�Am�[P/!��E5W��$O�n=GG����uOz�J�{r��2�?�Zً�t�����,g��Z��ҭDNi�C= .��5�M��kE�W�= ���-��]�$A �E��*]��#CdT�4/����VQ@����BQcf{�J��� +z�Ŋ_���lF� + �� �YGk��4]i.�=4��I��?�˫�0\��X4��A�a�?�idj\i\Pq��2e��5�8�SW�K_�@�L'��ZWf)b-M�uw�ڄ��֑�2&bQX�æŐh\O+׸?PX���;�7E1�^M8����aB�ؠ�q�fP�n��*&�s���##��S{V�SW0�H� J�4C��2,��`�0:-Q����|��vD�A��@�0@�z�Y�ہs���(��V�L"�@φ���e#�S��7�O��0&��y��;(�j�7 +�~�it +�F,�K;��r8���@�3�sA����-��v=V��j� m�+Q@1Q?�}�"%I��es�Q�^�O�?��At�-Ԭu�,\#���7��g���g�^ӮӺIe��y02 �H���*S U�rP�#��f�=�O;@" ey9@��'��:Y$�F� ʘZ�Q��j�\� �[V*GvV�K��Bקau.O�����ĺ +����$��z���t}�G���#X��0 j�lK�Q!G�5��=,N`Kd~Mřk��1$�_k�;�Z� +b�r��\ �X��{b��KA +�e��4c �7$ �0ݯ�&�Ej����W8� +7}Yg@�ʄ@oA�@�PQ�W1'�����@����;�/.���A�Ph��c-�Q��1���P��K���:��R�.��ϓ��W�gZ������DJL5��I?O@?o����@�ϛ���sX�y�$��(�?���|��o2���1�� �yzt�|����9����| +�>�b�,���D�E�G�qD�+Dy�F�٤9=]$�n�?\^��L�}*;��?�y=5z�3`=�1H�|vʞٵ���_��yOq{��jx>�hx��!l��eU��6�x>M�7Iϣ2'�Pe���'�� :�����ˁ���93�;YO�"z ��%<�ͤ�hot��p�p�1�C�[���΢�]�F ��/��(���`x�sʣ����ywt��8:o"� ?nR����O貪�9O�J���n�80�S!*�/ ��Qy�:O��~����Q�m�L���[[�h��QPƭb�͡�� qI�����zg�p׉���~��X��N�@�����H����H��R9VjO�Ɂ7!�� �w�j۵S�����u<.�@D�(�g%MZ�Z��|�̤ݘx���%ڼ r-qQs!N��a�C��N���Wi�_挧��Gʪ������ +��^��xr���i��:8$|Ť �J Ld� :�YY�Qa���hd�O#2�\��%�$�׍<��I�5���>N�S�͚�3�ň�Ё��ӹ'�W����)�� 1�!�w�Ra7r�Qe8Ł�Z+��{E����T��n�qm����b� 7�$a�?P�Dl )ka<������=�j�t�E�t$B�r9���N�.�� D��;!T�p�i����(�4�!D�Uv��n��K*� �yAzI�uN@�bC���Ğ]�"��d���C(����Z�Idh�Fdj���X]�X����$�[��EX�����F2t��� A[��tTK�rZ>��̈��+��ȉ�<����~�͆ Ӝ��#��!��C�P��4�]�����R���S$De��[J7J����$O;����A*�w�z|�>���<���T,>ײЙ�DS��~ʿ�l�����*���_a<�l���G���0f*g#\o�f�|�8"��)��/2�����+�my�xL�G;�6��)q ��rEhI�[�`���FSS�#j��W��z�}�ܞ��!B��z����C:�b�G5��B%E\ʎG1��T#��v�͝��>�%p �^� �lE��Si�sqɏ�#Η2|!d慳���� �����\ށ�P7NG��/��i2 �� y#+8�+"p�Q�� o`��ݬt�&?9v%m���Ep�_I���G �}�Y �� �}ɤ�(MD��,�q����L�@�� +����G=���a�56�&��Sni:�B�����_i���X�= O�(nJb�*.�/����@�&Yo��͞d%��~������� �%��Z�M�zwAЊ3 �� ��85��0I/��F����E"��Nb� o<�6�Y�ȉ7r���x�~�Aͭ� ]�0�^H.1K ��#4���Z�xv>ۥ�kD�b��a_����ED�(���b�-�i�y$IJ~X�zd�CTa7��͋z�-gd�AT����Z�: yc�=Y�M#D#S +���� )�q?ܦ3����q2"��J� +�[Q��m����a#6�C� ���?�ZWR�E��G#�O�6�:f�� +� q� �`|�8�����?��'!��w����q��ytW���f-7����-��c�e:S���t�&}@��L zF��L �=�35�]�35���ڢ��LM7~��3��I�mzgjbhj��+]`Ml� ��L`M��5}-����ݴj3j��V rCsӪ��b���M��Q�Mgjߞ�Ogj� 洺�ќ����r�p���A�[����\�޾����p{��*��S*�� }�r��6�-d�� ˹���m�W"oY1`M�q�����|��Ʒl_kpڱ�vnB��_{��5�y�:�o�`q%q���X�M�.z&�z��"4�7|���M��)��R +Q�,0���:��D$��� +F^�X�e�K�J`ھ�8b��M��h�왗�R�3�. ��I �X��� �r���J�VB�;��zr���5�?�C�\�l+��φ X�]X�f@� +��:n\�C@<�7t��S� �����6���*�a�3���"Q�v���UZ��`��D^���)"�j պ�۬y�7 ˔e��R�tX�t�$�'��k!�9�i�JSuXN��Ȩx�d``6dX@� �z�Ƿ(q+�ހFd��I��Ќ��1-�\ʥ�w�8y0�ۀ���A%��-.���^��%M�k<�&���@5x\0W�{�0��v<8�.b�m�_����Ⱥ5)'D��7��d恪I�31 LL��,���J�������k=�S���l#�Nՠ3�'�a�"�_?F��R���T�5'0�î�� T�� ���!HtY\3P�Λk�) o7��ˑ;k��ы����,|b t�.����〭KE�-���.��t�2J_,�eੌ��u�U�F��zK�x8���3��: �����Dd +Ė�=ɩ���*��4A�V-M% + �ţ��"�@3K�j^��XVF��^X��W�8`�H�� +������I���:ڬ���� P���ʽ��������U'q���n��)��;��G����Uz=�J{�T[���W�*�` �Tz�,���a�?��~���u�c��R�&���e�\���A6x�%�4�46�.���R����'Jf1�: ��bpPnKsiO�”�-S���bP����iXX�v�ΈVA��"�j�� endstream endobj 21 0 obj <>stream +��<5C���A}�V1.0���� T���A { ��d�d&d����EѠ:��Ə�^ֶ�Z�`�����`;�Nhj�2�ے�m,��1���l�`�D��� �b�;��`J�|�麑j/oCu�@�b�5z�TGh�v���#�%a��[��W HԌmg��j��\��[���%*�^7��!���3`/ �*i��Oņ}�@�2�_!Z���%��T%��W�2u���6�r�TLvU�٫`�@Z��J��8���I{3nYCl"��-���E�J?���x��0@�6��A3d�uh�J��o�G��� ��ͻ�jl78����9I�����d9O��,�����AU�;\�����~��/c�I�$UM4``[�0����N�����O`!l��`�U�p(/(�����LL�%�>�$0�0P���`#��p-��d4�7 �]�� ;S�?�&��?�(f���L=��K��Fgj|�mӶľPL���'l�3A��EBؚW��T��s��"��}UGl�5`vK��K��L,_�Ň�*QU�oj*d�cY���'Ȃ*�Y�������b�̊��-��� Ҫ�t�a��Yd���O\���U�5��]k�t�x*�{�P��2�;�lQ�� |.Zx�շ�K��[�1`]vwq��z�o0?gQA����+�x�}���D���Z0��n`��� +� |E%����0����՛� ���9~ v?%0<�̕=�`�)l��Ns�� � El��o�ʄl��S�78��_%����D��L͟��Y��lzngj�EK`��6SہĖxh_��l������y T�)B=w0���*lܲ�L��E���U�)yoË]%��%U@k�*�dY�_N(f]-�:E���V�v��\��k)�c�x9 ��Ze�ȁ �L6�O��$J�����E��u��:��ӢQ'Scؖ� �y�>\���t���T���,�TZT5݂���ܠ�,Z����Ɗ+��X +.&���U����;�%��d��k:`�[��I0w/��D��.#�ÙfG� ����� ����|8-j������f� �`��N@�̖��٧�c�x���]�W��?/���;S���f��:z 0Jt�jRe;���*������H���W{� �*�WS;�q%�H��eUi]���X�s�ʦr�Y��$��U��Ug��U�K�j���4`�%�Q�7;�b���t +��49ꮊ�:Z�K�����\b1 �c�DiX�@Ŭ+���/,h���f��1���-��b�������j�ʡaB)b%������x�e��x���[���ɮ��>t�q4���q���O�P,,�ձ�0JQ܅p��6:���3��O���KaY3P_p� 1�`����/���r=� ƺ4+�}���Qk�wZ��35%To��C2��…�L-� ��\I��)�A��7�-EJ/��U#�Y��_5;��3TQ<~P��|�C|U}�:?E�S:��'T1r�U��X�dL\ цB�� Ge]˷�e/Ų���Mb�G�Y@M�V�Wy!�\�cU�6S$X���c[Bު'"�/�a7�p��2e��ˉ}}��񨛟�/��1( +���u�e�3�5W�P��0*��#2Rb*�,3�q +4g��K�����*�!�Sx �p`‚�r�:�����������1yV��� =�K@m@p�Iw�� Ħ���4i:S��X�ᝩ���r� ��7��AJ<:S�*��6әڧ� Xq�]~�||S��c�x]}'h�eŪD�N�࠺,=B�D�N����\�0��6l�n At�����_"����D�d"�Vіr^˙y����5����A��@;�%1`wP�'nq�5�(�y��k��D,�;�!"���u'֨D�T��OB��߮�u60QwȐ�2�X�k(�~�t+������?}rC#Ƿ�� ��JZy�{]N �+j,�Z�Ǩ�h�t�� �d����Vcj[j��u +�X���lK�'���l1����Þ T��@ @�� �a��`% ���W��s�[`S.��㔘�P��G����+E�$%���~�+��8����lz�[ց|�����q���ʼnm�v��35�u��35�aC�go����.zu�VӁ�jY�cV/�K�֋e>kVC �u�Q,�A�\q�f(P]�+�W�M�����%��t��tp��yJ�NG��"M��*�E�Au8@��x_s+��ȓ��������P� �x���ytC�����V���������յ&z��yG�2�U0�yY�]�zi����Ic-��jł$��-K1��"A��/-ۺ1+j�_���1'lj���8��Y��-Ã�i����BO`חyH �x3�ݢ�Z�Y����2�?���(�F�CĨ~�¦� ���:��2���|a�� �@�|JӜ�F���]y\ju��7���X�P3 �w����ɦ"]�,�i�u̎�Agj�H䲙Z���L ~�V,n�H��)��^��e��TDDBˀ����|���w�?u�n��RG��TG��5 �� Qu&z�*��ǯ�M��� +��Z�4�]5*@�_��!T!Ė���qZ��WU;��۩����dX�$�����+�U�@u�Ҡ���K~ku�"T%��i���� ���黴����`����H �bm����?����P�w��4-��D��>��P1� -��зMܒ��I�ȬNyT��Mm���3,����ߊ�x?}w��3`"�2�ee�� �lh�e����&� 5��nP�=� � �KP:� |�C�H��b�$a6 ,B���E|!I�c�3���;��R������~���i�Z��,�Q���򢉦35�TpN�t�>� ���d:w8[�^�3��ª�����x¿��*#xdU�#�'PK�k�4�s|������.������)�*B��= �N�W�J���T��p-KBv���xs��U����=��&���]+�1���k̓�4�*"���[��岭a��M:SKh����$4��4y.�w��Yi�_�d���r��x�f ����p�3�XN��(�=��!P���M�(4Y�uˀ�ae'P�X��1I��\碌~ �p�H�ʋq�.��\ /T�Ƈ���#m�f�GX,ܦ35X�h������ll��hT������:�� �:|�Ơ���-zM$��Z���.��*��"�.I��9�!���j��0@?�U�E"@1բɩɒ�mZA�MC�2�d�:3/C��Q�(��/L�-hj6Ӱbᠺ������q���c�P�L;]�zcˀ촪J�Ű�LPE�D ���?�9�6�nr�;Rqԁ~��U�ΩW�c��˲'�N�+"ƭ��|�����*�?�<�I`3A�Pz�1�%TWOm�cT�P�8-��ϝ|PK� -F�)2���I�?k���w%u��ㇸ���.4G���8g����:} +�����9�j?OPv�{���xs� 2^�l"���M��&���u�@TCx���Qm��Z/��H��G���;_�� ��Ԃ%S�=��TVȠ:�.9;���{�=�!���䆦�Z�D�:��T�$1�փm��6o�`���ƴ�T����2��v�Ռ�[�� +�w��|ʄ��lT �*�LfΥ����L�����xj�;����� N����2�-�����a��L�M��,��e��c�h��Bm�X��]�h O���Lm{N�pf�ƭәZ\n����Ԓ�ՁW�+��pr����4�>�� *�&� +� +|%j����2�A��?u;����9> �^g0 Tw��C�ځ4��˺��dr�,LY8"ξ�R�L�.���9-ܫ�^wsf K��@uϿ���iC��' ��@���hU7�M-�! ��f�A��4��@z~�E0��Z�D�p:�xF����.��J���[�!�X�ݙЈ� �D&�n�V{�uU5����;p�fj��3�Mb�L�j ~ә]7S#Wә�< � +�Z��2!�;]�5ЫS� ��͓r: ,�dR�iS,:S���a�vR������9fЙ�O^�"[��-@S#��F��/���Ȋ`=���5�m��U�-���m��Vk��.K�_*{U} +�p��"����|,E� �A���� +%�`�6I� 1��"!@�2e;�F�D7�%�2n���l:S��e�:Sñ%�!q�^A6S��F Y����pǡP�PK� +\6S2���A�6)��z��u �瘪�U �� y�����Dǔ�����#Ĕl���~C �jz���j�W �I̶Fv�_�6X��D����.U��A�喩�n��<ϻ������3>j�yA/�b�i� �I߄F��\����<"�Й�Ը���!^�56S�L o��{�.D�Hgj����a���I�R�ҟf��L�@�Y��N�B�EMB����}"""�h���00[��S�{!p�LFTGd�J)Rn}�AJ��誝�����3EiLj�s�+�v ��P� ӪI�t��*����U3d�����W��3��"�l���i9Ԉ��]����+� �;�L�>�J�Йڳ�5 �4T0�� �i3�_ J/h+L� �<)��79G/�X���P<�/��t)�c�jʊ��Ǻ�^A|s����Lm��LM|)R�(�35�OP���fj�h�)*ݠ������@���H�%ҙX�W�4�2)��e����t�fU�##P� @���~p��� $�����^�b�'��������jD��<2N�@e����t�Gg�a�0W&2�t��0�$��!�.�Q5Uk�u���+1G�_�����8���n�/hjq\�� 53(� kśp����8�i�d�{gj 6SSQ\�8Mgj�c@ I�� N����ҙ�ki�U�6�"�Ӿ(0�8�,���%�+��������Ys��]U��9�}ٽSJe���(@�p� ��%�V6 �)E��0'�3�Yz���*2� t*X�V!!0�N'�|�S)B�����>�6��V��ij��a�m +J���jMay<�����ҩ1 ڌf0i�HJ,�T��L�0ᕨ� �<3�C� �A�7BM0 �vq!��`X��>��p�o1Q�TVg“1�!�q����$6ჴ!�bl�؏�-�Mb�(�Ă>%���� jW+�B�@s @���RyH�kvQ��I )Eh�(�0�ŏ<,D�A��0AH��hR��4�lNZ����e�p���4�h��G�1p�( � Bb�� �F��=�.F{��I@H$GTG��L\,�ȥ*��-�>0)�S0�;��G&�q +6"��PL1f��]�%���iN��O�4K�D�bV!by.ܱ��9����|�%���~�P�BF����H�J�(�=�H�~\Icc�  ��"4�-E�?..PHH$2dj��C�3l3Y,�B�D<<_�OPZkV�"Q�ǝj!����;Đ<]0���<��RU ~� +!�� E��h�Pj��R�`X)[���i?�H���~��b�! +0�@�}0�?=P�}�~6��0��@'�d��-�6���(x +F�����B� 8m��"�D��� +02��*-'��� 2��㵎���!9�<~����q��@Šh��"�(-B�`4�N(�1H������tB�@,yJqD +�>b@�V���a�^6�����

�rg���U�� �������"2j)�6�#9�BFi#2 L���v�Lb�����ƦJh0 ����XG���R��B���ahjI��rR�Z��� +��z����(`6�aIt03#r0��\���+��³�:�&W������<���B-�HU<70�+��� +q�^+D�k���Z�H5�"�l��f��{�:�Q�|���\2����6r�V6��.�֫�XDk���j3��C��}�\XAD��><�Pmj�t��NJ��b5 43�k%[�D�b�j+H �{�V��f�W��vꈏ� +��uD�j�� �"�V��U���VR6@��l�0s�`�Y��X 4��F{q�V�W�5n S��K�梹f �ר��Z.�����^���:��^�W  ����]�L�+6��0s�\�@��qq�@bw ��*��X,���>4`ͮ�W���Xj3Hl6��h r���ces��^�f��k��V]�&����{%�@b��,�����������h��Bq�j�V5��p�4b�o�d��,�g��,��f�� ��)���5Q��F�ث&{�4h��jjh>�@Xb0����6b��f�>V0Nj� +�:ڪ�а�:X�U[i�>d�UW��X}t���j�Υ���u�Z�r�`�-6�,�e^�����j�����:��C��b�h�S[�(�йX�����:ڪ��:� +Zsu��q�^����u��Z皭:��Q��x=�f�5���@��z��j��,�r�>>+�Clv��X5���]�D v������2�eU[�:��k#6k�j0�M#�<�n@�q��, CMB���*@B ���E,|�P(�� ��!�!��Ļ|"�ec�!��j��@S� �`��A�(S$@��e&���|��<H,"����Z!�o�!��df����&1(<�{}���@�>J���M �V�`H��n3��8� 8�GuA��&��A#H+yz��� RQ���1(>��l�ь� �!�b + �+�0�4> '��4q��p�l� L��$f�e������y(��D�����N���|XՎeC%h�cJ<`�\�"��ؼ�xrz��/��p$0�0"�IA�O"��`��1�$2&P�b��k :�&*.4(�b��q�͆6 +�uA��u���Pؐ��n7�����HIx�����s�D����<0�� +6b�^P��. + +#�0�q��U�. ��"iDdj�U�s��$�qPQt N�U)�",R���w��8+MB�B�7��H� ^�mP�d��3f�K���D�$�QIK+#Eۅ�#����Q�Y�. +\tz��}HGg�S}�`\Z`X@�� ���-� PCDE��Ր������V�xAU��0 �%lV|�4*��*Z��LF�>D&\'��S2�كmd����X�4@ܢJ2h`h�ZPI��a ���C�!:aP*J��((|���)Hlt���%�hyA�&�E�LʌζF� +��!�Fj@����'U��B�Ƅ�!��y��yUL6(7f�FtD��c" HD+"�& fb!b��O�8i2Ք����4���2���� $-5X:2,�G�$n9�7"��V����´�8� �cExf&k�( ���¡x���i~���B��d""���Q�}"Z#�J�\(��,4������S�� I�]TT�u�B- �r�lēw���P������7 ����j�4�$��n7�� +dj��b�mPx�ƻ�nw h�E��� +�#bI#�!�u�f��x�sZQ��EL�"4�x�m!�Ն�>P�� �"�ɒAP�LI) `�6N� +��m�4`$�BTp��<"�WGx��x�"����>�� ������dJ�TѴ>cRaZ�\|T +`��:|���'&��òbMi&����v��Р*��󰀐�U* �ke����t��n�M���+��JI +&����h6� -�d����wc�UD �E0�W�$(0Hn��͡u�� �󼌄��1$!���E�, ^gl4|*�O{�$��rA�@\����.��Ja����T<����A�CY�L�X��@�2��|�h���>2T ��\��ϻ�n�bB�4�� ��n� B�d&�<b���P��+��M8��n7 +��E��k�x�怹�n�́�J�y���qLx�����r�2� � +M0b �$Yy�w@� }>ϻe>&8��AZD��UQ�!�8��,lʐE8�.�A¼�n0���ڰ��<̈́���X"�h#� ƃGl�d&�Gij=|M���$�"�ב������%������E��b�A�n4%�Û��7j����$j s�dD��\2%����8QZ��jJn7.6%O㰪X��b2T�&�lL ��DD�y��ăl�H:.���n� B)�[e<�U+���p��x]��n��2�x )J�8���A��j�2- ]x����B �b5�.����v�$8l��� +d��� ���$Z��f"��<X%a'L +��3s�$��Ќ�k xQ�x�m;X��P�DXH7 p��8M���%Q��. +09.�lk�N\���8^3�������v��y��� �U��~��}��}ܛ6����L����j�2�_**^�l�$��D��i�"Ƣy`�:X!.���X,� �gAk�����y3��j)ϳuG�c�J��R(C�J�P5 �!e��h�J ���R^�!�\h� U�̢��q3*u!K�Pg��T���l�+R��h�P0�����@���B85 +��� ���,�U\:�&�b�l����=�k`�m�q'"�`���z��f�Z{ }d�]��|�� ��R�lD��Yȱ1���`4 �B���PJ��́�@���)&ډֳY��7+��N���8��f���,�Z�Z�o#�- �i�I�x��6&�fD�l��B��X~ m0 ���P�K �8��BhA���$��n8� y(�tƀS���ӕ�l�E���(&�8(R�@Pܬ��)���ThB})E&3��"U+׮D��� k:h��d��Q@��6 S�IFi'�Ik?�A��xp0��<�O�Ad���T.;�!���†$�`��%DY�c �IG�C� +����f?��Դ�0аD���F�#4��1x@$�� +M'�"9 1���! +6>2 ��&`�Lb�����f��lf� ���ᒱ0́jQ�v�  bu&��d�Hl�%�i?�F��B�Ea5(*L[�}�eH[�������e ��t$�0��#�1�Q�h�"v�F+@�~�>��*������gB��ku�Ebc?Ц�I!*�@$��@1��ȫP���ã�8�0�(�.z��T22�m�&���Ť j�B}�J�*������:0��LE`c?n#+��J!���!!�o`",K�R��#���,D �N��%�0 ��� 2J�r�ʵ $H%���ߩ� 2K��� �>u�Q@i��I: +(�*�4��,��P3J�q!!!!VdŨȊA�o�X�X�8 ��C(!����H(�%CvB90|\L"&��I�P^���6H�A�I�$H ��������K�V\���"�@i A�j�}��(-��0��k ~� $N��Nw�A��I�%�w�p� 8u��(L�L�9u�d����� �;��E � q0!5�?nC���@*/��!T�b���!��B���@����$H�A��"$:~ ��R��t���.��:�R�]4����Y��y�<�E�`J*ԧ?��S�>͝T+�N:��Щ�8�N��q��P��(�-qd�y%$ +(�y�HT�၁D�} ".�bS�l��QN��\��j8� +0���ǵ��Y�S͵7S�8��CDY��a5�H���䵱5��FRd�P)>"�Q(�|2�L*�+�x�:6Y���4! OH.˄PK���@G����E��B�)6�A��`D��ڏ� �2)хc!���� U�T �.D���"���H��*xm"�O�1% �DžP�Q�� 1T�)�>e���b +�O��(+��P�r.���c�\�-��t����Ѫ�8��B6i�\l��~���6�H��8�-��Dυ@ (#�p0 +�=��A(R�P�S�ZL�q�K�.�m�M�Ŧ�4P:�G'�H"a�>�~6���‹�+Q +�ie)�Je������ѮF��]X���S�tD�M&E2��@ ��|�8 �"�' + i?�e��"uay��q +�- d�f&�(��f6T�f)0��IU�8W�� ���Ӑ���4 ���: �&�x.la�6�$����ҭ�j��6 $L'd�x�� \����b�PDAI<>ap���A��ѰT��6�LaYo��`�le�C)�.�Ԡ��� +P����M�r��@T�����p��� �������w��D�a�@�� C�6Z@�F3)h���$BT����TDC]�X�Boh" +#R��xX�X�R �ȣ`!A�L��L\> � +GT�:}�D�"4M��2���)(F#16"4��c�������.6!B��$ ���A4�`�M&�i�K ssI�ɏ�u�"4 ����J�%����h�Ih+�PV��\��/���}�:]�}�)/�H]����%�һ#�ȁ::}�I�R�˥g�[}>��5B疼��+��[2l�9ƯsaO+������.�w'���J���e����t{��ߦ� k��ѱ��{�9vmo�?%�ѻ�_']�1V��n�Nw{���Н�W9�ƺu�8a�Hw��W���~������[����%��c?o��2�F�))w�(}W:�:gGZ)�O(�#�Ig���]��2�ܝ?#�aW�s����C��o��ㄑ2�(�ӝ�W���N�������K�Jȱ�|��]�V�jw��7]豫���#��9P7��=N�ee� �v�t6ׯ�]����Ng;t���y��6�Q�:�������3v}�s���;����Z)/�3���t_�X�!��R��t���u�~3��.KH�~�t�������K���ƥ����e�R��:+ˮ�B*=�H�W��,yV)e7��N�_wN��6w��\��e���:u��Pvw�����.t��J��92}���n�.i3w�W�vW� �w'�oӯ,�BZwgo�NvSY餓N�q=�� i���tn]������+�Jkm� ���_;�N�r?�.�(g�Q���R—ݽ�X���p΍��%���N�n��Fg�?�����갩��u�(VY���uVXiw���]��t��/e��~�n>���nN�����֧�����^yJ(c}Yg�q��]�8����g�.{�t���O�g�~�)�~��:aG]Z�ƞ>��IחeKHݻ�^�]V����}9�6���#s��}����G�8+������N���lJ���-��)֧QJf�u)W�7vd�U�ksݜ?�i����0��"���n�i�wî�u�r��У��%]� �6g�z)�TN����.F��{�N �~l�s6���)#�*�ז�p%�s��K���z�ε� +[����i��m�s'����k:�4>��Jڝ��7�f�T��{�>ק���No�^9R����ڑ�,۩�Xeu�3�8�W���.v�d��/!���ﴹB��M�8���H!O���u�{%]�+����r�B��tN�_��{��O)�r��:9����RN���J������+%��5�|��شR�������:9v��t���՞��'��0Ҹһ�� ��3u\�ҡ�*�Q�.��s���H%��V�]+�nS��7~� �d���uF������u�9��T��g�s��~��ѝ�� +�%����߇�ݹge�.#��KY�ܗRF����/ߗe�pR�@�d2�(�n�~�/�z�2vӇ�g��UV���~���|_�gs �ϕ�>�=B����k]ر�P���*���C9�3��o'���6�;}��ze���{Ʀ4����mf8�9����])�����].ǝ~���S�N+���ݭ�N�WS��ݴ%���Yi�sz�����eKo� �i�c�8鄒�����v���n���9g���O��/S�S�C�\?VIk�(_��p+G����O�'�s:�(���?z����)w�%��.Wr����S�f��Z'���� �2gj���k�PV�@h�_2��p�L]קW�]:;"�%�~�)�\�h��;9i��:�N8k���N��-7ƕ��k:��Wָ�R���,�e]鳙ٝ3uR�^�I��?��� c|�q6��-�n�9}NH=��=#퇑��]~^���͍1�ǥ?!����d��q)l�(;�Yr��?em_���g��M-km�l���s ��+��� '��|ߝP��Ӆ��L 4�t�ӭ.����F��ٜi:�l]2��>���v��w���ҹPn��tR*�7����Yn�N%/���_��P��āZƏ.���-c���_�B�͙@�{�9��!�޽��a�J�=��H�\���ku�V�3��Srφ�_�9�[)�H����U�){����LOk���0~s ��ɕR��M��+�O�t�9��y:��.��%[u@�Hs�u<�����\}���O�;Ze;ǖ��|�ct��1��)�tcӥ1B��/�e�1R�>���|��]ʺ���N:#��26]�<9���iW�,���K)����{�H)�W �O�3vˇ/�����m��]%�L'/t�I�:'���,�3Uʓ}wy>�)����3:�ӧ��N� 7:ǧ��Z7:��=������;gu�>帵��v��{��Z#\���i�I��B��ɦ������7j���<�2��qk���y��w�סO���ޖFɜ���ݼ�]%�6E��y�ذzs��)]�:��ʏRzݞ �k�Jg�˰%w�e��?g3���� [2��=�/�2�M۝_��J!K�٣��Q>|~M��8��� Wr�R�m�]}��1>�XݟB�3u���SپN~M�q�;R���F�@S�t��� e}MǕe�I�� +���KZ+�� �FM��֭=�/��;��k�Y�N��QR���ɜ)�m�?_Ά�2�}�8�d��B�Q�U�_��N�{s]����Ie����8%�.N�+����B�r4O���8��[.�n9O����B��̣��ªN� �L +����j3�F�q"O���Y��p,S���n����]��v�m�s3�+S &�>���9�.���Ni!r0<ҔH�>��Ȋ- �%�Z� ��ː����xd�J���$D�)!!r0[��$�!5� h��JXdJ�h�H��IC�E��x�6� � /"1$��4��?�B�H!����e$Q���4Z��m�b�$^��f5P� �8 ��(d���h��<6���� +��f5��k��>���`qk���?nQ����b`�~%Q}X"��l� �q.���D�E��`�� Sj���d�VB �`0^�������>����"+���=e�6���/����^u1hج�;u�"�(��]����Kf�Zx@��6�q) m���p ��s�` +,��ُ�>HL���R + ���`�Db�A��G����ã�m +82���0 ����jƒ9�M%à���F��ic f�k&��`(޴�V�k�1�� �l,DdŔ7++�\��qf�֢�@�``f�� Bd��h� �������z��NA����-���ud��Amc@�bB���@"�3!��M(�s��`XT���#Za(lP��y��2K�Xlڠ�x�>� ��{M��@�`�E�`$�J�<�C`A�6B% +)¤>�5 �����sa(�(����D�E��!0!XmB����qV�x�Ή�Ӭ�G(`U�X��B=fRd��䡑d�6r�6[9 �]t�U�qJN��Ddř����k� p��U����8�@iX0.��0O�G�0;@��$Pp�{�<�6K%���q #���aS�|g�[a�G+��;^�t:�� �Ư�M����M۹��:���:Yzd��k��[�J��a�̙�Sn�q�\H9ҕ�V�v9Jv����Y]����42��s2�4ro���T�W:�>!{s&SG��������u�nw_�So��UJ*� w{�w�O�/�/���������'���ۓV*��3�����}�>�d��;��|��'��Z'����oNß%�s5��jT����+[.C�́~z�t���4$ss��OF ڑ��F�`n�+�r����)dnδ?g�(�w��SN��w��J��t)�Ӻ�!��4$}�1N����4xn���K]��K��-%�N������w2uoY���}%�8�K�MݗFgf��t6o�3֝�FY'�M���J�9Jnޅ�wָ�L�nm��t�t�qN ��� ��R*��6��twyRH���͐gݎ�M�;�u���-���������������t�7gŖR�e���ee�RvOYn����>�ӥ�VIW�^��ː�ǥ�7B��it�g�a�Ko�9+��]}�Ɵ�ϸ���UF�^e����LLy�HkOȲ9P��#��++��5�;�˒�S殕)��i�{�������;Ҹ�ks&���W�=����uJ����Ji�9�O}Fo����1� �֟�����N�ԧ��+���c��23��9�3Sg�;v��s��e�+�#�s����#�I�>�_�S�����­��K� �_Ζ>����Zy%�8P�۲~t�eu��tw�k��z7c��L%��j4u�(;>?�;����s�;eu��ڑ�Sجe�[���Ι@���8���u)#/��L�\�Pr��m��Y��1R�\�N�s�w��UV:!oS*WV���&�ɓ�3u��p�wF��3˟�J�p������ܗ��'3������;vo�vwX]:�I����(}V8ۥ��q��,���}(�ֹۗ��o��2ώ�g��}r�\#��/go��q�)�92�����/=~��pٷ�����t��QΖ^���p�s�Ic��u>�t�����ߍ�^a�YY>��ʲg}:����v�.:��d�Me����J���/'u���kϹ�N�_��?�2�X)}�음�r�d�NY%s�nJ!s��L��!}*#G�v�J]��(!����#��9��꾵2�O�~�~9e��Q���N����dO���w��]��=��XWRH�ku��K�O�c�u��O�J�5��Hw����*�c�({��W +��2G9Wz���>�X�V���3�qθ�g�Z��'�g�(�-Y���}��~(yz�����q���u���;��S��N猱ƞr� �o�_w+��ޑ�����Z�SI��4R(��'?� �l�i�l�X�a|Y�lw��:V�5��>��+}N����w�>c�����V��9����#��3�it��͒BI9���z�P��W��qR���e��'�m�Ӹ5�� ���e��_� ���~��N�L�cY{eW��r�yֺ��ҏS�ص�5�=z�m�g�L��ƹs��?�w������.��YF����nW��k\^�u��I���!�/]����]ݍK�d9v�M���V(e?���%�����V+oG�5R��{Fٱr�M�w�e����t=�� D��4>���|*�O��+��*_BZ�c_ٓ.�u��U>������-.�w��r�4J��,�+������ݴ�Z�3Q�Ne�/��X��r��/��W��+e�H��*���_Y�����W2g�@B݂:_��%�u+W����;��go:i���׹�����}Jo�|8ۻȽNv���k�1>��r��5�o�Ʀ��^eo��k� +sS)}�0�w�e��ҟO�9�b�]^��r�+}_.e�k�O*�6��I��gX�c���ʏ���8c�9���2;��Ɵ�w�/wR��FvM'�lZ����[ۻZi�(#����se������i�r�l�t.����>���Y�Cڮ�f�wg�K����ۥk��s���n +i{�:��0:�����޵��Уϯ�+Dž1��HwNw�$��#W�PFߖrz��ҟ�rS���B=RZ��6��ʕ��α�9�8���9}��O W��q+��N���P��{o˺�a��k?3��XMt�w�tgd8���t��9Ϻ5����pR�V�Hk׮�R��V��PR�L�.�=�J]�Ѯ<'�([�H���J��0��n����5r���]�����9AN��w����4z����Ii��w�ӛ��sΖ+�d����V)[�Y�F��L�.��pN��g�����;�cӟ�����}*�܏������n�Sָ�t+���� ��:cǞTFwI#���w��X}2��O�G*�?�Tv�r�����k�_��]��J�KY_�9�O���� �#��z�����[g�8��KHkw��Η+�3|�_�2e8[�����%�����=n����7v���)�)���)�:�7G�ֺ�q����S��<��o��ͱ2��q�u�6�o�@���U>��R��5]�d��Q��\�0�tP��3 ,�G�9��]@"26:$$0�A��H�� b�bJ!��j�ǎ]���;����.�P/�<�����1 �C�Ef��ܝ��GSt1v����,�y!cZ`�GB���4��Q���C�ӎ1}|��hʥ���l���l�`�G�-ց����H� �k�l �,���4�Gi5 ?A�B2��#��}��Q��@�4p���͆�S�?U�As��,��+�n�(!E���3��d{^�@ &��.�z��ow�0�E`W��EB�M� ����� +oQ�aM9,O��K����N�}kC����k�RLk2����Ђ�������'�Y����_��À�&�z� ��ĬXy69A�'��:,I����Y�^.2�r�� ����Xͫ*�恀�<�f� !Yn��<��z���wѕw��-�4A��z>�c���5�������3�J �҈�@�)��(u��K�۳�3��o�R$b��"aR�j]4�bZ��Ç +�F�l$^vSF��1`$[�Z��e:ī�h Y�$�i����A�w�b0L1�� +�!��sE%��l3;�+p�\Z��2aP(d�?�Ë�&�z,j��u������d.�|��*L�B�Wv��ʋڵ��K���D��׍c^�2��wL��""|����;���v��N��� +.�TojT4���Q����0{U4`F;�����v+���a@�!�d��mK��7Ec�>ud�hieg1b���������'�#p?���R�����yI.���4[� +<1�Ȗ�FB�DC71�n�S�� �v�M���p�Z�Zu�8Yo�њV�"���~\Y�����?��(S�ǧV#�j4�^��S��)T�)��/0�s�Jaù����4Į�2Ie��,�����F�|ę����s/n�����/�Ӑё��wՄB�9DB���ڪ��%>��u�H\_�s�彈PS�Zr�,7o���ї˶<��1?���#R���N���ö��6uRp�$30�s��6ɦ��z�>b��\@[��+�Ӽy���Qw1���zu�Uc��l.�\�ȉ� �>���jl���1�*��q�b���IM=�!*(�(�Ҳ���c����m�q�����Y1dհ�A���b_���q�C�;�`<����gW����}ߵ���LՓ�.��nS�?�7���`WV�0I`��E��y�1Ôqv��Xu�*(]�l����@!�� �>9�9�Kx��m����&עϣQ<��@��6Љb�h j�X���؋�9 ��IS�v��,'b��(�H�U,bV[]��q#RR��� �?���gF��.�(]�n}�^?�*S�I��p���?o�Yߌ2!�SR�:�Oؓ���Cj�_���P�Ƹ/@]�ſ˜�6��.ŰI�ZJX&�r��� ��*M���̉5^lPx�����K3�^����o$Q�b��]5���_Ѩ�M�_M} ��JE�~�@͉~� �_9�k���S�GNA�4|13�S����A[�����FDKt�;�n��?�gb�U�Nr� jA yC�~f������������L��㝠%��#�]�2+����,���޹��n� ¬ld��8�/ͤ��B�X��p,�[��u"�VaPo�(�5�/��y��k�\AD�^n��+t ���q0x��5 +���VT����5��`^�v��,���HHX��G N0f#��K��0s��g7:��*Pd\�ikd��v���iP�Cu ;����ӷ�3��Q���e +QJlZ�@��*�2ÙI%'ɣ��'�~b--��>|��p���]��JP����6q�yz�qR�fO-1/�:������/��N����K�qk\N�� ����˭��+�e+7="$o4�N(�Ƭ#�d�7� �9��1y�����$>//y��Ͽ��d���Vy^��[h�$*#k��r�"qܙuSm`�� �L���uj� �V�E�=�;�v�}'8�,=� �t�^�g�����oF朾��W!Ek[>���\�Ŭ$���e��h���-+p!MߢP(����Ƒ�,*�C�����f� @'f����A��6�KW�'���3� 3��'C��*�p�P,�#�g����\��G$K�(�����Z�"b��gB-E }�T2M)��un��-H% _ވ˗�s�}<_ j��g�(8D������ +m�P�-'$��i˰ B1Ze���_8_�7]S� +�R_(J5�(>�� (l�&�~���L�pg'� �m��ʸ�������;k��?zR2d�cå��U��B5�'��He��#�YH�[�m����E�ڃb%cXE�-AՏ�f� �9+���E {�(nH5��j�eb�mz����ѳ6���2�`�#���j:�����������(�P.5!����5���(�jA*;�B�\�����УhrƷ=�|qc�+3t��Ŕ��\5����6!(-��!Brv/�����[p#أ��>�KC�kR>6��]2D���>�����T����[,��+��*�5��XAeD�1tZz���w�WXN ^�sV�a��*�eº��e�#Ș6���e���dͲ@a��q�&0�j�8��'5Y�80���^�^���\Y9�N��L.�?�8� +, 'xm^�Hsj1IYxh���vs�MC����6��X!Ꮒ��>Q�j�Q�$Pb޻2�K��k��X=�"��z�E�YbO�x�/n�(��eR�����䊭|(2OJA��W�[����׈��q�ɕ�`���ͭ\<��� 2��|7,{M�~��������\��cbN=~�H=��j���*�Wē�(Ҳ�Dl�k !��x/��@��{�j�zʸ��NJ^T��r:�����@�o��9�M��O��?��4 +��A�h��P��%�H}Œ�^�* #��:�Q��e�3\��+q�ۨ��2 +�`�rƈ��fU��9A�fFlM9>�&�h<�!)w���n}�l���ю�¦�- MgP;r�0 R�� ��"�(�&�`�d�e����.*_T�\ F���3����T^a� ��^�J��0!U��~,���|و"z��q���i�I�2�^\f�����S���W<��4PP(���|ƈ��SH!d�̰��!%�� +$�<�K��8�o����-:$`�=�l�o�Tl�c���Y �}����� �����r����N�V�DEcZ�a�r8�k���⼟��Ƒ'R��Ub1��B���`%%‰�x����3ѭ[�0������i�!�5�S/,ط�Ż�8�ACD5���OKl�[R�y�ҙ�\�^��7�#�����_/��=�^�D}35�-e � �9e r>:l�����u���zp��ĵ�n �$N�Q׀�p���A.����+x%�(���u� A�Q�J*,� !g�u�AVP|n�I��Ѕ +b +�E�tOc��l}z���|<��ȥ�/�t���b{�6���W�?"d���G�[�L0��c'�z ���ݪ@(ȨG�/V5�u��"�2&����p���bcI����<��N����td�����\�4j �����>[9YcV]�O%(ˇ�"AQAgvM�?9�� +,&�[9��� 4����6ð����\\YC1�ڰgLݭ"�p#��${���I�QSH=�ZY�!G�����Tٺ�H�2��f�Ö3� '�@`��H�ǍªJ����|E�2W�%X�@��Q��D6��pL� :������.�5秐Ч/��d���5����= ���*�%��"Z�.��B�/�bv��d��PX<9�ح��%��K�:-��vV����*�~��n.:A)h1 A�;�L*M� �0���"��,�@kc��e���\ �n��[7i &��^�}��߸T?cS��Uc<�b�:��qi�lU2f��ٚ�LH4��Y�~,��@��f�~cD���ђ��̑��������M#��8�����I�Nΐ����[j�����X��'v[�K��J�&8�{�o؍8U��#[R�$v�#& � ����_�C����}��6v�'�Cݞ���@�h�P�u��t����[oI?���AoxZ�����%?@�-����D�W��J���Z='7 +��Q��죸����1d�ũrr�}�P)�p#��1�##t�Ȼ����#r�P���e3�9Б���x����9 ��V��5/N�v�Rqr-m�qfTE�÷USf� 1C dt=� +���PTŦq�;[��5,��/��-��8���������V��{���R۬ɲN��/ȅih��}qr�����ʽ��T?�����Kݬ)�fR� ��D[��a ���U$ை�����6‘��hq�(��i˒tM�W*�$��=����+�r��d��,�D�~ ��ז0[�n@���"O�vBm�ڽ�>K�ۭI�qa�/����/��_��aR�&G���4�C%K�:V���E:�n۴@��<�&'��D�y�G ��D�˔(�?��2�{�Zt\7g���_b��e=EvV���aE9�9�jE:�#夋d�] �ˢH +(�D�ˀ# ��Ū�(�E��E����X/=/ ����1��<���H���i���`���AS\Ü��_�-TC +�s��B����\;5z�-�a�9�1�F���ػ�(���NN}���3�� �^`H��l �������� � �A¹Ta6���5E�h���ly��&�>��>h��H?C��I�Q��0��x,m�G��_�j� +e��r(1 �պ}QȋNO#��! +p#� 6L� G/�٥�)�:ԇ&��8�+ڸ_���*k���E��"�R�񽀷�"[�Ђ5��TC�½���D̥�8`lW�z�{e1)��D�m��lȕ���s&�����w�|r��ϧ�*���� +�q�F�:�R���E-�2���:�uS�ߨ�Ʊv#��/E�����sD���@kg��o·�q �U����5���������9'�Yi�Լ7���QȲn�xF]��Ϩ�?g(Ԕo* d�f���΀vYiW�?�7 +�r�#FG#|�g��f ����|���-$+ [ݑ&.3�r�}�=Dv"�agvL���؈�egX��M��tz�DbvB!;m���+�[�n�R����g�[��Y��H6K��14k���"�H�!���4���<].y�?���F�;dA8�����w�m])B��I6J�Df��E/��X�N�������;X�g�fg}N�g%�� +�S��S6_�X�{��N��W���C�����aJ_b-6a��A��}W�>4dш�%ֱ}�uO��)�0&s�J�k�Cf�8��ax����NYtz�0�h�؇�ܓ�º��֤�^���荸 g�̆�d���;����k����=" �E�Gd@���Ͳ��(_`!S �Ŀ���^�WZ̞knZ� �8� �����ܲ���2M�[�~�BX��H�x}-����U��vU�7tN���m[�!ֿ� +��X�l�(�77�h��Z �� ㌅,��n���ƿ�; �,��;5!�:O'�I�953RTXas���<2��$���OOӿ�UF�? A���rݽ0^�wk�K@7p^yCk�;�pտ]L7���Ɓ*���Qx����;���Q�� �U~:` j��_�| R������1����п({�U�_�D���VXÿ[e1\X�_q��q��f~�Zp[J ӳ������ԙ��()��1\��8WG�>��蓲��*�VU��O�����T-nn�U�N�0r-�@�L������Ǽ3 �6�\�`��E����#��0 �{�V�E4�)���&_Qٲ�y�Zt]����* � ��Z���|z���ri����i���Nn�ת�b?��"�D�����FaGXF\W ��;��0�(D(������(JEh��� ����ف���-|���U,��E���fF�Gy��}�� ����R�4P�r(�̱�?*4��&�K�{��=�#��f��!�z��E��=/�^ߕ�[�ѡ�3MĻF ���Ѧ�����JB`�k9�bf;}��N��@����B0�-�P�A��L��\�y� Z�hI^#��k�8 +`m.��)&���(W\.�-�h�#De^����e���ʯe�Q���)4��(��1�xD�a�h�Ј +D���ڙ��a��s��Me��'�@ +[@N�zFcAl��W�1�pOƿ76��t+E�E�%��+`O,n��ۺ��(n��H9^�;D�P,�(��<�uŬ��>� +�FLs5]1�S�G��U쬇�7ez +f�ګ9�����x�m;����$����!�秞�[� S?Sg7@����m�[�I�l6���c�*R��֝��u��f/"VI% ����X`��F�W<7�I/y�!��ud��f0{n���w �Y�,��S$t�* ����lUof�Ӻ,ni�X1P�Z2���%��ӫ^i�dGf&2�Ҵ �^�Md�$�W�ꭉ�e�;:�'�ջ�tl֯�����4v��k~�l4UokGs x���S��Q�e�˾�U�|��g�qO��K5`���;ڴ`��kO�-\����Ǣ�(JTB� �O�k��-я���q���h��•C��ޡW*�� �a�T���o +���Wž��s��Y��ǺlV�2ĔV:��y�%�f �v�@���m�nw�r�I3vʊ��opJH41��7�u��e��AC���!�/_�l���L[.9�"0M19�R�s�;�1��<��2�:��(&�a��| %�TI>n�#ꭵX;I`V����@�nٚ����vڿ�(���^�]�>���u�V�)���Kb���.��:���]��>�CM���EB��c)��%xl*�.$����E��GY�u��(�y��T��.�8��=9F�]�ئ� �>ī��)�٤%�q!A����E�=���1��j�4��Z}�=7��B��Ϻ������|C��M�хޚ(�pX��-ӾZpr�g//� +ui���@U9A�7tX���1j�~��P멵V�zu�y4jW۳�m�f�\1���jƢ��'��:x3^��:^BC"�D�ўm���Uƛ}�얧����� ]\7��d ��p����rO�/J�Pʚ���T�TD�3/<�PH�L��.;6�����1aW&��+#z]�Nn��W�^w�I �Q9�H�Ք�n/��K H.r������M'e��`��C�d�w� �} �����B���1q�.��P�7f�c��Z9��y���̶57Κ^O�Ҕ�����N�GV �e��K��O[����l!�����������8#iy����i��� m`ڴ~��(�] ��Z�笏9f���B,v ���� �4��p�� �+��m4ĴE�/Țrs��/�H�8���&-"88�$��4��� �PE�����q��5�kb�؋W����(���s7ZR4����������������yȤ}S��u��H�:���2��T���� nsܜ�������F����#T� >I�������Ǽ�E�u-yj�.���*�)n� GׂP u� ��$S��{�]�N6�us ��$c�BD�zH��1\��Ewm�g��х/mv-���TG���|��(��������m�*!�iBw�z���EG�rC ����=����d��t�M�4n��cr?0/� }UA\ �/�i7�z�U͌}"71��;Ř����@�L��\�B�(��� ��8=��)��ok +��%&V� +����"��IY��°�H N�����˛�)�<}IV�2T��C��Y�|Id�4���P�����ė��ȁ_����DՉMQ�v�<yT��^R��ǚ�G��>BH`D�}2,r�̷E����Gl8E�;�Vc3�¿I�g���qL��U�8��VH���+� +�K��v�֚'�Gn��u�=a�!�t�:�ٶ��KHg�/��&��c+�J�t&�V�����v�H��ƞ�� +���w�?�G&#��{�;Gq ��zpj�¸��u��~�/�b� �#0u�2d�15��z4^Ӆ< ����Lw�Re@�tqJ����j(��N$TڕW�tE@LW7o�AM�H0�FT�yr&�K�tE�����,��iۄYl�?��Bb�Q� +�Q�~�T�L`e$>8���gؒw(?��`ܔ����� ��C��=�V���鸷d�A.[Yn_�jK��TMt|ęB�Q}����Y��3_V@��:WFQ�&��P�-[��V\�,��ˆ@k�׽�ZK�;��b���N4?�")V7rV�Ӿ7��>i4)f�0���݂\�9�14ₙ�P�!��%o�� +6��2��/F�Tvh�%y��r��7� r�>p�7΂��A�F��$�B<1f/���Z.;�x������׀Ac=��s�}c��߿$d��ݟA2^M� ��@��L#G�w��$N�����X�S��-�l�Y.�+)2V �J��!~Q�o�ÕO�*K%�D�uٽ�ʮt��pƵ+��_�R_P��]�>���T�� ?�P�)`�g�3C|�O��텗���[�2#XȲ��g�gb f���fK����D�� �ﮯ�^b.�--᫾"�8��h�t��c��x���d���ٓ}`��!Q�p��E���<�_0�� .k6X�'�r0$�;?3�oFܓ�ʈ�R2�BdkЗfwc��F<�S�eU�DG��e/�C�,{�DK��Wh�:�Ni1� +���)��D�E�١��k��~��d������.����8����7�:ow}<��Vd�$�J�tLęHl&���LC�O;D�d� �b�]v��b]����*�SVNh��z�F5�Xy��2.�zN�����]9�YLY0Nb���u��%���x�^��$Z���i���fK�9��_L�QDŚԣ�T���(��������3"���+x��@@G���I ��a�B��Op��R��b���QMR%�u +#_��jD{�b�����*:���UCj��>nwg��f�� g)�:a�vӱ}����yǵr(�`,�x�~3���N��_⫷&`W��b�|б)ޖ=�x�O9��"��dˮx�\Ee�b�BJ��� +����+d;�7��U���jPg*����@�g�ƔE'2!�1a�7���Iq )@ ��r웓jX��@�l��k.� �D6j��*��ԚOZ�Eh��@̊ +�n�е�q]W0|�(C]�W���PYѪ��w1���M�`x��?���i�r�� �‡9�2��JWh�/�N��l���,� bC�V� 6ω  +���޾��q>��qu�Ӈ뷅q9r��U{�� ����daxX�yT#f3�� 1�u|\~{� �QaÌ��'�qex��4bmK���5!W��{zȄ<��ʒPb��N� 6�|I�6�#����^�2Ș�� �#��"�Z|H0��6������C~.��^�o]���c�z�S�e�ZZt򯩇�4V��ݎ�w�n*�b�>���#�,蛊}��3P�2���ٍ���ֆ�y ��3�jX�Xk��ڲ�Z �Q�\�w +�� ��c5��.՜�?]T���YPׁ\��j�����ù\�1�ˎ��w�n� 7c��� ��x��0�[>%'<շ��Hr�m�x��E4����0��8�8���Kw�o}�~>D��bb@iI���v �i�b=�d�/%O���_$��l:h�2��0�,lG̿�4�LV� J����=�����j�Q��/� ����)Ҵ���EO����gӫf�Ƴ��\'~�p (~E����}��j�\�bC���,��n�^�`/�΄�����]0L�� C�B�h�/ +�j�2?3+8+s*�y��B_��i�m��v��ڈ�ɉ�?����,,����q��&�W����?Y��B8���L�P�_nc�����K%̺8\#�=�nx��m',H���O@�@��Xl�����߆��Ղ�?s˅=���/���0D �"��qD�L����b�J��Ġi�Y �'��K��ʹ����p-s¸�w�����a{�(�6Ux�*���h9����Q�]����Qx9#���o���Zu��]��Gn�c��/+R� ��2��H&_�S���K�r���ͼ)À�"S���p��� �+A� +," rCPH +��dڞX�:j�:���.����贲5���/�|"[0���D�[�� ���t�j ����UD���>��5}�7ʼ]�n�r_� cr�eNFV��2�=�1�����0��ԗa,i ���cU�~����p6���6�`���7�:�Qzd��a�C9��q���:c'J�A��d�:�����7/�H�kUu1R����k������I)>�Y'f|Y�� ��ԃ:��C�ˋ��Ԕ�N���&�p�P_or���T�}�L��7���>,7�U�����0����'���89�܃�D$;�tH9�KD��a5� �f"'JD^jJ��o�9�xSƕ7�tkP���M.Lʼ��8bd�����ڣ���K%�?�0�\#K��= C��՘֗�{��;�"��ٹ�0� �V}�l�F���gu��q���j/v�������~苨�����[��t��$d��$������f��>����{J�ZH– �і�9#�' ���J �e�U���7�BZ/CBT:8�E2�2j��<RN� �_2��܈ ������-L�_�@�,r�g��0|�Y�}��3�#v��{�m�L��6�:��s A�8�xX� �]��7`�w����7wz�f|�萾���XI��ﯵ�o���e�Ҥ��;0����'��L�ah���[�Sv�^+�l��z�D���%I�1i���D� 6t"��6�B�&��1I��Q�|5�Ԭs��5J� hNv3��9|�B6Gh]:��線z��cɂ�� 5��\6������k� +z}��a�A�s �������Gn�;�}~"��&�h��i�FH��t�%}�Ja�gf�L� ��9�*ެ7��h0v:�X���[���C�$�/ �1^+��[ +����\�L�,������%h-�=�ɍ2�f��� +5�؊�󖐌�nx��avI��72�5���E$^�-�G�٠�i���2|eZ�#=��P���v�8������!���G���W��Ix%�pjͥ�h,>�YAj��P�_�&k`\+c��"'��}F���B@P��KV�C�\�]<�@�]*�:U�e�+�������EOYf97W ��@p��L'@u�2A�g'��ͳȖ���nZD� L�x���@�c�n�!����HͲ:o7�Y��}�_�~�������E9�l<$��BT$W��Uf���L�!�ʙY- fC������: aCQ�.�v|ENC�,�(]��ϒ��w�F|�l0�=aW��v���F��L_������"-���`�vK6��%6A/l���Ɩ��-5� J7�K(TI��zI'�-�a�亣�-�3��K��oB�.0+#�b��A�A�=w�¢��ᛘ*��izkE�JK0l¨YZ�Ϲ��Q_(�vQ���!Рd�����8oxT@����\�Ѯ65�neV�Jhð����E �R� �z��;H�4�ӽ��3�.��f��,�b<K���� ��'�P4O߄u��"����k<�H�����7�$`+�����.� +}G��n�kp�֒�Sq��q��w)�*#��fsS�����ɌA���jzw��n} �9���4����L���L��H�����Z� �>�p�O������:���f�͉"sC@�A�ǯ����|� +���zL�X������R��Z������^��Mɢf�.��x��8���H����'�-ɒ�fm�m)��eӁ�����γ�����'�뗽����E��_�3�H��hq\c�?&�)�U3L�ϢKҶC����nc�6XX����:>L q2��[k��F"d407<- J^�2��ZCB����Gպ����m̯^[���D#ֳBh��<�J�G��?9-C�u�\�>��D�H|h!\'�"]ؾS�v��>j�N M!�_8�f��Q>�)Z�Z ��d�z!� �������^��8,�w��X�cj�m��o�Ǎ�h��~rz��}���W�7��V!�,ciBg���k��.o�]3��¤S�ć�nV?�{��NaE|�!���{zM��rC�ۨ}����7��xY��{;�B��@:IW?(�f���CJ� >���,BչW�S��nK�i�Q<�[Y�ۮU���,�D +q[�Z�$�}]O��i��������n��.���>��c妡kMk��Ho�6���k�$Z�㢃[�v�Z�l�J1Y���4�j ���}����Ɨ�Nc���~��yɏڼu7`�� Ċ�C���e�I`����tc��M��� ��NtN�����k�uN�T�x�1h���˔��72��>�.�*C �Л_�~���G�n�Oimҡ=���U�{��Y���� �������΋U�����s6�g�����\���]Kϊr���KC��[0��{y� ��,}���TZlT�S�'�1Pt�U����>�-a� �i\��k$յ� +��3�a ��OY,���g8%F���#���\�ҡ[#lY-���ib�D�Cq���m��a p� ��i0,�`8���%ό������YK�?� z\+�fN}��9hf�E��@�?i� [�/Ԓn˦��Y��c�$�,�`Ǿ��J� ���U�ԲܭCx��8j�U�ĺ����a\7<�`B�*!ѡ�[K�f��� }�T�$Ja����bAԗùDBQ"�3���@�t�9n��� �y�j@�JB��#d�@������i� ���Keo�]F=J��>M�1�pRl�ywHj W!Շ�KA���.cC���Yi��k2Tm���1�?NqV&;��!`[%#<ͽ�.�A�� w?a��Ǜ�e6a��Ó&���}��<�<��A���ǁ���BxU�x�(C%K��nld%G�2�KŠ��v���ycH׆�ă;M�?q料h����AVO@� Po� �0p���7��V-�y��t.l���Ak�2�)��(q��aI�^��g ����D�u����I- }�1��ɇ\~����V�cث�{T?5�#�~� �w ���j����} B���H�Q��,����a����(m|��I�E �bEB�U�,E�Hn�ڢ>��� �(�s 䈀�<�S��_�Zm�ޝ� +�P7+�m�r��/�� |ߑK=��?�f]a �����o�p9]��n!@��t��up$|p�� q�er)�����������u�ߵ:����wX��:�,�1��������*����X��β�|uKK�����ssq9�93?�}�栅� ����;󓹢��ƈa=�M߯Є���;�E$L�s�^�K�>|sJ}��1�c��.�1�3/qH�ٻ򈥹���}K��勇Y-mn��槴>���?du6f���_���z�'dU+�V���/Vs�T�3��'�ϯ�P��f#q6ݩ�$��y�LUy��A�;B\�`�(?g����V�&�P�h� �P�j�� ��j�c����6�O��iu��ƂcF�rW��f�W��ՙ�N���K�����k�2m<�f5N��H�bGhET�#S��*�,�����m4V�RV���71��~<��������xdp�Zf>���.w�g"U96��s� ��н=jM�ճf�y�|�uQ�4g�L��M���M!�]�6rױ�r�G�LK">s��W�m'�I2_��B.;"J߬��؎U�'ɇFt�V�e�����>�9E����9�׶�'��of��_CG�a�ϕIM:��13 ���)Z�ե�I�1�jY�H��ZZ Q�x�3��˦&��泓s·|8�1z^5���HgK���ߵZl������t��� }Z�Zxw��Աqh63%�[���ҰCS6����F��pSvٻO�z��E�,R��n��X�����4r%�N�ټ���ҭP��f�+:�H[�y}�,VQ���3�H���kV��YJs�)G���P�q�:ħI��Qf�dt(X6C$Kk+�jw�:����ŸU�V�3��q*�N]��H9�C,Z���DEEB����C7��J՜�vx��'��TW�f����z��2�`��I�H�9�9��>��}�g��7�BK���f��#������*A�P��y(�g$��T�S5�|��x|� :4���x���'ofu2�v����qά�tf��u�&y�k(�n)���#k]��cèh&���Y-��1���nD�6��S>����d�PN +��Ew<9K�FIw����~������>B�|k:[Ρ�6ʐ� +�2�ɐ�;A��^����_�٪����*<��I6� *��Դ3:"ɩz�����f�tJ�st���V�`��u��.�[hy&8��]<�7�՗t��t�d-��Q���U�.mKqޟ0+�hǬlJ>sh W�*�+�:6ʔ79�t���L�G V��R��A��y5�s``DŽH#�R�p��>̢����:˜�+�*r�I�}�7I�j2/d�����e˛��t�(+�x$N� =Wl}����U�CS��1Av�R�L0eF3u���5}R��Ts�.��]���ţ�""L�fZaN�j����N��oLs�����*f��L[�u �'G0�g��jM4����W_<*�Z�I뛓��h�o�)��m�ţd�f$�f՛ ��j�隍�������/���?l�U{�"�ᝯ��,ڸ��E���ls<�$��U'e�U���e���K_$F���<6Ar�I�����*�\C��K㶧)i�j^n�N��M��W)�R�Oӧ����垇�eYD�!���摜��9b�d^�Jӡ����Ґ�)4/�[�I��q�5���?��դO�;���tZ�M��$�V�R�N��;��v��LB��i,x�I&�%zЬ}�QV��Trdc��J���*���u̦w����8�Y���C<1 ��,ڳSe�&�9��r��}�i +]-��̛33�lQ:話�N���X>L����(s�u��T�]�|w*>k����B7���޼�9�g���Ue\W�b֮�VxIT��kt�C3n��*��M����� �RҒ� +���WWd$�|���v�=��A5�U�D%d;"�4��,��կTI+_��َ��`�G%�m��c�-�=�g�[]�8�i甿�[=�x4HO���P����K���w����uce�N��SaQ�jZ5�՜e��JCW��AtM:��>rg**�����V�,)�Y�l��|�xk�\F���'s'�x���qj��;Ӻb�� ��S�����4_<>5���� ]���uC�4#٘�JU�ӑ|q�*6��,M�y��i��H�)�j��|)ً���/�Ji�����?�F6u(S���.���3�'+o�󳲫`}�x9)���ԛJ��6"[ɨ��,Tg���*��v�#ʴ�|�����N�K� Ʉ��P�Y�/��Q�r��wk��ϕq�e#syts�&�ʉu���e��F_�Cң�'4XC���s�����q��K�D1ߍ=�� 4XXXX8D��B<@�CD�P!"$@��ĊP��*H8Ba��*A ��E� :(� 0p��A �T���F��P���в2H�p�#���( &��  �� ������ �X1!C��`����%0lh@ ��`��p���@`Pl40 4t�!� �064X0&.x�A�,T���� 2 `��P�6�PxPA�A��� `<�C��AAR`�@�����‡PAF�F��p�@� ���ႁ HD�*(�Q#H�z� +`@:\X�� +��@ �hX�pA�Ae�� + ��`��A�P�d������C�*�� +�@�p�1TЀ��x� ��RH�p�p18`Ѐ(B�@y"DF��`����@A� �b�en�q]}z��N]:���i�$I�4�n�)83��ft� �WKN+�/��4$t�;�<+����#(a%A��8c%��$ +Er���Za� Bq ��"b�A�1u(��eu�|�ک�n��#���J�j�[,��g�L]1�����#��19������@�(�D�ң�6�}�v�&�*�6#t��2R)^Ssˈ�r�U�Ix �"MJ�����B���v>���8ZtW��b9��A1"$�ZK�t�[b%j<��������c �5�^�l���A�OM�r=�s�D�pR�%�r�EW{�ҩ�c�Qq��xK�h�;/E�[ꬮ�3�.�*��hm�����O�J%��{�\���l���&:�Q��翭�5��_�UO�ڰh�l����T +��hɇ[ʷeK֝�Bmɺs���.�k��k�P�tK�g�Ucb/�I$&��Ǚ���S��g��x�L�R�[�����GM�M�=9m�)ݖbl���V�-[�W&��׀��'��5d�,�X�BBK(����]�et�� ��.� �Sm��A(�F��@N�h[���i���kq��&�,�]�->�3�$�SN�܄�˙������;�;�:G(����al���ХXy�U�4��?Y�q���l�� 6qx��9�>�S4q�9�� �7 +?92�E��� &;�H�˶W����~��q+]�7�?Y�����e ���x�jM�t̒��>|�D6܌�)�0��y�+)W�;��f$B4l1� '�Q�e�� I�^,zD����3ȁ��8��N.g��%c�@���!�#Apql€�D��ӂhJ�|�$_�,��c���yIaL�A2<2�|QE�0 �#��]��#� ��dP�z���?H�:�yĚ�o�=2s�2���k � ����h�@�xJ�p?�B�+�V� n~��wKh����:5�B�s�?���=!�q ���ܠx����l���C'��#dk~���A�'4����=���d+��9�n���k�K�׭FP�4����2x\/?�a� �#!�%��ȸ +ne����HOE�����CY����'��7�����X=8�'5���k���`Ìm��i�t�o\�,P{ŝBp3�1�U�~(%��mɜhJ�b �LC�6G�f��2De�/BZ��O��� U�Gd����j +��E�t +�-�8] �xV��;��k�2���4�~�����q�f�' 1��7%^յ!a�v[��k|ߤ��@N"%z����N�L��Vcߙ����H�;?��{%��ׅ�&��ѡ�At m;ɿ��.�nfz46!4�j�Ę�}�~����}B�5l�`L�W{��K5I�)������b!P� +��������P[T��9�u��\o:� ����y�! +�LN�;KȔыZe�φtꞣ�B� 2W�H� ~/n�J���C�BП�t�6Y�4�����ċ�\�n_3Nz��'�p�*�`��\� O�!:x�$��=�1�"��/��N��s��t���V�I���@�rd�!i1ց��^���=y#�*f��f�Y54JH0��(�=,��<�ȥ���,΁P�!ϙ��4qO�O˂��!� ���?�M�� ��@�*�<�.���Q���N�^$�~p�a��y ��>�,�2/�a ��7tE�B�2�,�oZ�#P?�5� �q]�#���!�Ս]����`���1k���:���T�v��q�Q�x*F�3OD:��}r��ܨ?�r��c5�@����r�e4 T�!25T������ �����3��m�<�G���w�?��↥��/�(�[b�^�-�!ZT3A%p��cn���W 5�{KF�Z���C�W#�������h��S$iw +�WF������4��ߐ����N,"�U�`�vD��8�l0G3�Nh��c��7����� �������� Fg#�ج����Rs�W$O� +�{3���%Wl�n��jX������g0�<�Uf<(���l�2�M 2� `&[I+�1s0(w�AӮO�fc&�7B����Li�����dM�O�/���྽�i�S��'i��Lz]r��Xe�3�� $B��QӅ ��C>R#�) >|�\�="Y- ����`FW�쑧�>���ƓI��'��~o���b_�xC��dx�f}��,x@�"8Ҩu�� �y|Zם�hNm� W/z�z����Sv#���!�)��{���DHi���c.O�x�*59����ߑq�"���q�dY)m��ڏ:У�l0������T<=�DS���9VP ��x�2I�+p�Q,��?�g 8{,�>]�[�� �u������ >stream +Z$����=9wg����s��M���oWra� ��Am��ZP�-,����)�.M Y���[����j�nԴ�&�uK��@��.q/ �G'/i�/z�4�D��c��?g��s� �e��E� ���оt�gwLͳ�3� +�.�36m���܇��e�5�\s�<,�e��?–�~eau�)Kq�����oL�O�Hv>�7r�d���z��<����x����5��_�L�k����[S&��,��GR[�=\�ن�q���������#���d�9��` .�%��n �� `U�VM�T +���8%]e��;'\��-��z#%���ws�� �����nY�@�yɢ~�A�XOI���]Ӈ�o=ec@�*l�&�@,����\��U�mN��҆^m73*��~b��ɗ��������Z����̬'jGc�jZ������*�6���Z� ��(�AO���auT��p���6 ��L���Q-Z�:T�#���j͗��3��pmI��CS�#����?�RB[+�>N��]��rs01�&q��H3���p���X�őC��8ԃF��2-��������h>_bk�L�,�nQ<�9}h$("�P�?8��Ō�MI��>؄�@x�!i[I9‰��YK|�V�3���*b�E��ަ�H��K)� +�-����-�Uw�tJ)�X��B�m��֢�0:@%��B�%%la �/�g|�-6$|�&5�l��䶬�=�����#���*�#Y�g��Y�Ə�wL%g�P����/&H��G�6�Ր�����I�q��!���E�4 d�, ��^�ѝIo�{��g��,(ߣ��x0�D�œ�!�],$e���UDT۫�o��56�y���o�ڧ��,4�ej+��d$��]�&���Z\ISTA�B�X�z���XQ�_�I�/k��T��e R�O'�����:W������ �$����������}`mX�g>w K�!?���w�j3ѓ�O��e�!OXM��$���:��^D��N/h�6[;�G�;\��W��� anz���; +�KJG���*�*�sNh~>����r5;���������U���o�+ ���v�cPG"����a�]S7�$x tU�>��f�7p���8�_���镛Lh����~�C�3'CT(D���_ܫ׊5�B��Z� ���+���2��p���E��dl�s�֪���I��N��>ƍ�i5�osn�ȹm�#Z�]�BV5]4 +�O�|p��.�>vft˹v'����FZj�Юy3Z�ԭ�Y�\��,�u5J�@Z��7u ��7�:*�R0ojE�\�2����-ʤ��H��>_l�t�Ae��N�B+�E�����'u�U"p(@�+T�=@���<�a��_`��0X7H��00���� =R�; �0��`��jd/��N%9�%&�� �3%UV�U����Zl[�c��F��m*�vO��v!�wh�j,/;��ƛ�r�� +�;��AI�G*Ln�Y3j^�=�����Dp#� -�T�Ѕ�� ��ȋ�h�s�L1��K="~��S�J����y!b^�{��p��h�����*[�P/g��;:=�f�� D��,��A� e2�N��x���VQ���)�9�L 8�#-���y�^����Ф}*=��ੁ�D X�0�J�/Kz�CꚌ.�� �5�o�=�����<�|Je����ZQ@��C�Ej"�! ^SS���ßB҇�y��U 5�{���Y@���#}N�{�j-yS �X ^ ������U��&ޤ�� +� �:��$1���d��I$�����;���9�,�SӘI�P�ufq�?Xz�����אY� +����t=��H{�e�E������[P��ɗ=T��� 1�,�,1,��<��Q@.�F*�:�(��%^v�`rU��y�4h��ʗ�����ܗ��y�l)�u7>#�s��˂�F� +��c��]Mc���8]�i�W�"��Ƚ���A��Ao���U���|c�/��4Y6b����L��a��t���܆�|⬕_�ƽ�XJb����,��f\�_���3�M�g�z���[�c�+}��^�~{���5Li���Aj8�^K���(�Rw�яLc<��.�.�͠C�k<W:(K8�J����}�����8 ��nl7b�H�@Ye\��}ٕT��=��oT#={�۷��YۢF54B|�r� +r�E`�������; �J6_?0=�l�[��r ���� �*�@�`���r��7+��z9�N����Oc9��c���txR�ߴ�];�(�C~\�e����"�,ٸL��"���d���}8/�2��mB�ѯ�V����,�_��r�� ��PL��j�'���Y��ʵĉim����t��ܥ���i[X� ��E�`�%gt�]���~�F�|�#j1%���-�F����ن:�@u�iƣQp*�*��"��i��K�4V�7�۞�m�}I:-Ł܎�4�,lׂ +��� FS��_ �t 8�Iw 8��*3��UiIC�Y�7���⟁�N�`5�ME�)cG���⧗ڸ/��・#�\��/b�<�g�` � <�&��tgD�5&G�SE`E#e���78X|⩼�E��˴���C�O'�4��R�PQ��)��ܕh�qv�������;��D�.>w�~�����{�v_�0:W�"t�K�<��kt����wv��)��ޛ�f�0�,�b�3���;Pdu��'sy5>�I�3�;~�#�'�h��V�ߩ������ �{zK�r@��b�߷x��О�����C�&� Mn�pcI�]:��e�0��̢�z�k1�1Tǚ1/C�N.%2+�I� +�ă�jNL��hb���JOh��|��BjQ��ڰS�m�w4���S�`q-zq�5H���g}S���l�iݏFo,�d��(�X� ��\��ө�|jgg{��ݬ�Q�.S~��.�UI�2�&�>�~%���,�c�<��8qF��+�`� b�`��4�� ��%;�������Hߑ�"3p&�GYaG��#�Wk���Ď�'�ԟ�$�#ױ.|���>�t+�M�����A�9���Y��ٿ��%�3 Cdxo%լ���TI�Vg���4��sU�}P�:��)��z�Rb]��$m�E���� �,�WD(I| 6u��DL�CQ{!�qG�Z� ��*����"b�u*'���P����F�4 +��2|�T��"��3��H�%����5�?YiO�_79�H+ʗ醬�����/"�h��2k ��y2 ��3.Z6YIŊBxr H��!Z������WN�"U� +]m�<��qU(ֹ�H��B5̃�a9�����X�s_J$�V�4`�����^OE ���b[5��T��N@��5a�����Y�:=T��U +� �Y��B��� p��l����e�xQ�}f�\�B�C� +��A��l��7���!�_�l� �B�Y�����R_I�}�d��u�t� �pT��s�[�u�9O�/_<]o��K� W�R����D���z��e�� +���ޠ���Y�M,c͠/�P�?j��b�[���w/��ܝ ��]��A�z��������m�;gG5w4��#�� ���r����솽��P���Ӗ5��^��*y��*Mj�M3�Y1�a�8RZ���H)TQ��^��]:�%I����r�mp�w���@��ٛ��r�ɧ�'3I#`H-iź2����x�E�7�n�+��������DIf�A�%AM"��m�HB��I�FC*��h��Y��$bo��ۼ��z��`�~"�t�U��^ ��1!�Oީ��))����Bk^%%��i��Q$���`��De�'9 +�?[�(�1�,��Ί�+���{�s�N2�Ʋ�2�(u�56p��H �^��[cd�N��/<q�{R��`�-i˧�)Ʊ���s���d�b�Ȩ�@ͭ��µ�`�{��%�/���J!ƹJ3�q|>:���8jTBg@m�2NT`��A�b�HY����}�?�׵R'?�@�kȮ�� z�����wռ^�pFnMXqs߻�����|��(�,աR�L���4ʤN�U�*2����|�QEJ�U��WZz�n*�{�c<:vr�J4���T�ݓ� � o<!����y>�� +���\@.�,�r&�'7�hcm�b�pPkTt[~'O5$�:W�Z|��Gf���b^���7l��iѾ�gR��M n����H�l�O +�8I�f��V�>�"�t�~Gc��WPF����Q�7�q�L�c� B��:l�`n���r7'������(�gx�� �Y@�0 Sa�+�" ���K��\2�D�9���� q�UE�Vf���`cx�APʜ�]4�PM�p���N��);�袶dcbƝ���2Ȕ�r���6 +��L +ϨL^� &%��*��6�MK5(��*MNK��w�-�-0��KG���Í�b���=:[�(�;�� ��6�=�W������e���c埀���1-MD��]�1��#�������5+�:G~���E�2�0q���G��E]$��7MU�FEn4Q幢��$Ғ�=EtL/�]OT0�σT���[=�����A���(�����X�;A�e�TW��a�|1�Q�(6�6EC ���}H4�BV=W,/L>��Fd�)��4�9�O±MBO���Pt��64� ��'7� �I��V����Y:��A��A,a7�r�TQz͔ٞ�/2�Ƅ��j�S��'�ktL���ƘԜ��3)����&u'g�G[��{���� +��.cC�$.���}��+|�(x� >4q.8��FY]�Ak���X`�dL��θ+��{��)���#���sD#���WD��ZP@�aq� �*�g��b�] in��-^o2��v�]��&���Ѧ��/Ă����L��� ��,f�2H�Rc�e_hE���I���ls�"\�� �'�e��i �^�V]Xq4���B$������UN\�oqq�-_J�we4�T6|�W�����E=�1+�b�{[��V�~NM,�Jxd�IJ��n���a��ȤH�e¡�F�@��2�1D +�F����D�<�.���@�X�gߋ"�/��uL�]Q������2�oS�q��}�d%�� +��{w�F-�q6'=Z��}����Ã��_F����)�f^��ħ�UÓ�ǡ �I|�zi~,�l��^Y�� rTU���ܔ2΋B����Vf[�j?i[�ߩ`p��:o�Y�*V�+�1Ϝ&�A��D���$��LR""��\���=u��vŶ���a��1��Ϯ\':&�5��ڝ���� qG�ܐHk`*{���]X1��¸U� :��G�oM���ć#봋�S�L߰�l�/`�d���y�.ޗ!/~� ��2[��Z��t1r$+O�%V`��8����� +��"HrA==�&h�F���5'`��c��y���Kǃ���5,�����3�R�ܘ,,�2�� R�F^ d��;�.4�Գ�CЯʴl�5�;�C�ha�7[�P(���n%��"6�J�\�NJ�Rh�-+���k����yHR���~�`��&��i�H���'p�C�FǛ:yd�$Վ� ρU +y\m���T��Z6���F6��f�_i�X"nOi=�C�D�e�뀲E���bw��>O���C;�-��B�&�B4/ �yq�R6.C�ᡅq�.��[�O_�r�U�!e�x�Șsm���a_� �#KߏB �QZ��t���sAfv2�S�=�� �R�^L�/q���2�fq� �����HT����n�� �����q�6躡�Bėqs��;(���#s +'ﱶ�9��,pʐ�߾��{�R V;����u�v"��Eo����W8��� +G ��5�|Y5� �^�@bE�O��!�.�{������q �h�+�#�逛��|��g���1w2]|����N����������q�s�)V{|~��[_ ?�y�c�=��d�e��;` +3o��O�t���=Ύ�n�1]����^!K���8>Eh�w�o�������%�9��_�~FB ���Q��p$ +T���Qj�&��.�)���� ���_)���7�� l%�6ο��L�\��� *?O5�uF���qd��%<�o�92}�$�ӏWGN��'a�cֽ����� 0Tr���Zh��N���T�a𐁩-�?��%G~#�Jn7�q��K�K�I29.L.���A����R[ Q�g����� s(&S-�Y۩�Bک�w�',fO-b�r��f�J�"�*�W�N����ꟃ/�]�R!���R�,��L:�k�������b�'x�(-���5�p����.���g��q8��Ϡ ����P����4�Hj�K>k�8�K_�\��/��TB����i#5�VU��%B �u«�W�J�q���k>���\�v.� �U��W�7����&E��yx��͌Oa�R����g�.��$��3�͋$���L�*�G� �k�}d��8"/��b#�I�Ԣ��t��KR>W +)RI�6wݼ)�<�L^"#�L$V�'�S�Ɲ��D�G$�;u�H{)�&t�J5�Z�lT��!��-D}�BC_C�`���!�HD�"��c8�d,Q2}(hd�Pá �Q ]FB ?]����f��y#5]9�U��S��Di��;�12�tbS-��\Ej�XsQ<�܇6��\W����$'?'�rv7ԏ������[+��P0&�:K����2E����#N��C�Pi2��Q�)%h6�>I K7B;Q�&Iƣ����o �Z�MCB*3��L�Fq���(H�zLI�tVeu.-�4���;������iż�X�b�bҋcd��yEk5� '�يR��g�/�>���D����N�l�%�̲�iW��(-O� ��!-�XQ��'D�����g��Y�Fv��Y͸�����x|�qR��Y�2U���V�uf���w狼��-]G��5y�LѴ���E.�F�E.�K_J�8��_�N7H&�r",��+��z����W��QiH�(tJ���\� � I"�狵h�)|�-��Eό�#�!%:�A�4aC�-��K��̑��2m��4󅴦�8Kg��*u^��:���Zs�#U�[Q%O��., N�)�J���Ue�w���<Ѿ!Ѳ�𵽂��W�� �,B���S��,�`8"�.b�M��$��ir>� g�� ����T��4�yE�cN��=��¬J��d�׸%Sl��D=�iĕ*�#�:/u���TLm� %�sFC�U�b"bF�b��5V+3�N,qQ^�d�h��ԯ��b����w?�8C +/���"U��y���s6s���2���If�LI?!��M�{�����/��u�d�����5�Ջ�����0W*'.'.ǘ�V�tJB�I)�< �P�;ϳ��.���Vw��V���|=U����V���6��j�z����fv�ތF%�c���n���E�I��N墋օ�:Yd�h� +I�U���ny$�U�d�����*�EMAuj�dp����^�� ��x:Q�x!RcJ>#I��q(ʊ(�!�4Y,�6s�B�u�w�}#"F��X!�o�B4S��wE��~&Op>�2/��&��]J�%� +c~�]��b"޻ut���i-�A+��66� ��f�捝��+dr]$ŐR��5ҊZka���K'XgP�31<���[d�ֱ��4�E��V�Cj{/R���Hdu��F#[�"7“%S�l�/�ՙYk�-�/l ��Z�%+�Ø�g�Aֶ�Ca ɢ��VdZҪ�qa)����hXJ�*$+C"r�R�l�1�Ԍ�K���Dr������̭L�Z�(�Y;�FCX�ob��XH�h(�M��R�1I��ʯr�f/���E��\g�UV�z�x�N+^���Ά-�i� +�A�1�kFA�cC�U��J��s�E�-Q�z�\2e�z&S\"2�������kg-����% 4�.��I���߻6��_ڍ :�Be�Aᒟ_�%�0U˕! {hHdLE��%WD�LF�q'Q�ٕ�*�㒘����0(��z�FNŤ�-<��G$��Up�Hp8b�ID�D)H2�v�؍]�a �K��!>��Dkdg–[���x�ik����57Z��� B����j��`">CB1hh�B�"$ �"��%w���>`�a�����T�bp��om�*s'��>��dnE�I쬄����.���a����L��p�>QW[qf�>�_��q �AG��AIy>`D���6k}�����EϦ��k|@*���vh}G�1������A7��w��)|���d��@G�A֭�$}'�AcZ�1�F�U�{����c:g�S�����yб�=VP�ȃ��x� f��r���べ�Ո�Zv�a<(�� 嘌�Ķ��G���xP�����T_ƶ�,����A�C� J�� Y]V���V�|A���� ^d�\-ڴڥ=�� ���nj�챆�/< T76��tP����) c�՞�@��:�����X�(�;�K��Ĭ/���ַ���*W�,� �Y��vkD;(-d �_����٩u�,���A�� y���t���:��ƀ���m�sP}I����7ڗDL�W���A���.�G�`��-.9h� 9��̅q@�>q0-M�M��=z +邃��)$�@R��`j� ��y�&���zun`n0\_n��� �۠V�A�N`�>X� ��t�ng� d��`����Dd\Nև�A���������6�>��QM��ب�@��[ַ�N��5�A(G��Zk�s�h�� �r JZ�}�.Ϡ:G�A��3@ -�d�G���e�C�&��摁��G��3�BQ-sK��D�c��Pca o�|Z_�AW<1�f��> 8��Ag`a��0 f}�k00�e�`[N`�d��0����Ӿ0��z� FM��R�߳>}�l� ~�����MZ�� ؤ \�悎\r���6�K4pAx��0 +�zB�k�� �bև�[.���@gD�" BCz�Pͼ ���[`� +�� ��Z� /��[@�/"��xF�j�U�z �o��&xj��ꌼ��� "��^�o}/ ����ނZ8�Eco�q��M�-�EY���n}��V�L�[�m}w�T���[���� +-Nh����]x \��Չ��� +� ����r}�ؽ�Ƕ>E���"}i����*������,0S0 Zr���cA��E*t�aA �����+��xU�t� \h�Vp�sV ��L*V��Eǫ`zoW���� ���4bZ�'V���p�]�#"���;m�N)a���/�+�Jn Ʃ��> U��o!]����*x�����h��P��}뫎q}�R#0l��#���!U���p�*88���16�'�MTF��1���@Up�,���{�����GK{8� +�n���W�^t��gT��u�����,ޅ���Ŗf�=�䗪�P����*���|� +�\�Yl}�T��550&�TRK6��*�P��#T �'T�ͭ/�� 2����/c�)H�q�=�ǭ�"x +�p}�ꛅ�u�w +�[�����@�>z��:5���� �49)y���}�/Z�*$sS�v�.�M�ח���͚y +J���+:����)*3�Ӆc��/�Q0�y�)��S�Ah�/8,�)(��06�O�U�)�l��<�� �m��/5k~�>ByQxs��� ���u����-|?AO�(�PƇ�)9B�:Ev4E�>7�g��D��a@�PPs`����� �~���bc� +���r +����)7ќ ��'�B؇�ă}tz���N@�&����*�$�9k'ľ J�6Aњ��&H��8� ��/�j�L�������.`�~ �.A�`K�����V���J�)� ��NG �:���4�K�����Ó�O�$H\�_*$A�`$����+h A �@��#��8�ml�����/���2�x�*����e�2J��q�C� ��(O�A�����p�ڰ gi +y} D4\z}Р�U#�5I��eg �*��x�aV� � +��2*a�����>eð��@���@P�= �}@ �����+����p¾��/��~`hCe���z> ����IX�/�i�3%�Aa�c%�=5��I�P/ ���u`��P���x��"i���#V�F(������Mԁ�Ƥ�����.�d���odr� +�D�P �(@�0�*�@����}�n����@R1,�|�0�>�@�p������JŰo�����+$���#Yq�~�`�"�� ����Y"���hP1Z���c�W`A � ��~�i��L�?�T�8�� �}K����[.��L��NJ�b��w@'M��H�YD��¡9 ɉ@���ž"�X%4�f����m�f �z(���׀H��o.�p|m �A� ���k��a��k@H�G��t��%�������k�\�e��>�[U��7t $쳢��3�K�]h�X�����au���ݜMČ,a_n�E� ؈}�^�t{;�̀�d3�#���7�:�˺ ��l��ތ�n �| b&s +�aط��X��a� ��v������G�%-0"�΀%F����zˇ��l�q3 sm�;���b3�Skt�h� q �q��)�f�E�3�kG��>�� �� h��i3`$�op3 �g3 �-��dPx��cAþz�ȧ�:��&j.�W��)��*ʊ�ƀG�y l�0m ����Ǫ��D�ՙ7�B����,���~�7��N��ldƤ�{���.X�p� ���=����YB����I���hĆ�NP���AN XT�K�B{�0 ��}F���J�� &iW��D�OV���T�A_N�=�� +��"L"���N/d�NG�D��)�(�ɤ�k�3�R��L��E)�T��ط�eP�8ScQN1M�k/�: 8zx}'��y(�����%�#d�W�AU AnåyLRV�cH�G1� l�$Y����B���>2��;��h xZ~����B~z����X�V���-�A��=j���m� hh1ܱ�Xt"��o7m �����&�{�J�Q�~ٖзh�J����0�Ȁ4T<@�n; +��}x�g���hAx&���ٚ��ȏ#4�bؘ�/� ��YT֬ӥ3��5�?oD��9�R!�@U�I�D�0��m�6��0��x�j� +.��В��b�*e3�u4�i��gD��t���Lx٣�ܚs1� +�x]>u�iC�R�֐F�~G��� +� N�� ���>�'�7G�胉\�P G8,d�V�` ����BXH��q#��T)�F$k!z0~������#���}�!��!��ƽ�����.��0�@�b��))����D[ONBn��n9xɾ� ��N B�"��@[�RLY��l���E�m�hH�G6h�A�~�1ߒg;��7��4T@�?��0�#'`32z�> @K��Z��� �#ƺ͋�W��0s��W*�U���,� �N[x� � �1+a��d�M� r3A���>�ͭ����R�q>?Ff/B,V��ԉ�ܞx��ȋk�#�i�������! ��P�>`o +� w �S�Gr=K< �<��1��< +�/1�}�W T������J�o ���ag�_ +���:3�u�b�E����0� ��cx�]_��_I�~����4��*���8E٥v���1��>C����&��LL�40�Bۚg�#X�E�2Z?/Q2�����T�HM�ڹ�\�q'�x��o�S����y�G��F��w!�J.2n���ʊ9l��E�|��xG ������}e��,��\"���E��r*�?�E��ֿ��� +A�����g��v@D��1g�ީ�E����T��j�'4��y+l+_�~y�����U�m�("�ly��-�-�߾�" tM��b���V��r.�2���?J��1*��{�����R_����D,[d�%,Z�*Yl�:Ƥ��o������ 1�?9����Z����P4\|M��s�r�zP'Q�O|X�)���~����ӄ(W��}���I�B���+��C <�-v��5� +>C�heve��"N�"��A]Ю��D�_���k�l�υ����nO��ގ ;2�S���V����q�W� ��j�a�q��fI��8?�(s��;]�P��lyx��oPr%�gL~����w!��bp���V��������vci�!�Ip����"�#.q�\g�E�G<�]5B! �1@�9�����/j|�\WO�쟽�N���u���]�l<��n���Ml��q��J|��?N �������5&�G�w��y�� �+��}�x{�����J' ��a4a������h�Ɠjvˏ����&�p�:V!(@��Y�B�mZ@�3���Kݵ�ٮk!z�_IZ �U����H���-�F[�e�.�' ��� �#����t�Ia��:u6�� �����#�`oPJh�42�1�Uq����×�_]���B����ZP���H0�>�_c벊V���c���-�G��YL�N��j��N���X�2r���������I3��Em��<�v��?�`'�h�^Կ|��V���ꉃw��fQ��4�F�kB�0��0�����I�?)�\�~0��۬��F �Q���c.�Y��G�؊���;�} +Z�B�䐂>Hw��wң�|d��-$�M�27Smۻ�!��R�w�Yف,r�zn�h�*Gi�^�Q�+q�3���G�m�q��I�\�C|Q�`� }���O��Q9�Q����]�P���KPB�/k�–�o���D)R/�O��Ϭd��-��=��S�Xr�ߗ:Ŕ���W���d�?lrb�o�*'��_H ���o +�,�ގ,��=�OP\ҥ�T5�- nHt����Etw9�+)�W� ����f9U��\꟰xs&3��gJ�Կ����i;O�2���jŸo�%jy������%x�v�bf�1�"�*ގU�1��H�����D tH|S``�"�0X_d 3������j|@� +I��B52�]��K����k�rk}�k�?z؈�x��� ��#��>� ܽ�!飰��?�1�=���=D���z��?���*�����O�����t�'��WVo�Y���Z�72��n:���.��L�~ߍ�i�T7$\j��M��N�3锪߹7���b.�� +VR�Q�@�~�6e%�8s���Zٝ0��Y����_8��S���m�wr���yQ+~b�b�f���2~^�Q���Ha(: +��z�?�9������F +��<��Tu��잗�ZZ;s~����?X6K�����8���]w���� ��k�,h��%h#&�{��I�_�B�4KȖ?�-��ΐQ����|�����Τ����l���!p��C?�H���b�7R�^��)L�Y�( +��p�+������I�����5�FQx��m�1|�/���?�����˥���I҉�x?\�_���O�g��ܹEk ~��>1��_��c���腟��ۜ����'��%� AG_�0��a �1� �)�����'�w&U��!A� ����'�5�?��%��|�T'B%z��W8�Nc��Rz��m�:��[�0ߗ8�>;��R��nsCwZ�Iat�A�_��>g�"c��-�Ʌ��OF��5�C���X���: D- D�/1��̭�������v_P�r�Q���n�Q�[��i ֹ��N�����C��_7�N� 3��v-��k��e�^�|��)�����*Ȓ�ߴ����MȨ���c#ɷ�g�%��� #}�� Q� �@t4�=�i ����G�O�E�2�N䦵8��Y��������2g�i�O��QGe_]�R�!�μ��l�%h�b��"��u���aߕ�K�rH�T��}o�Z�m�sl�qh���~$ʾ(�>�_��z��Η�w�����j�c�. �5���+ľP�v&U��S3�ڨ �]��·n�P��MP���N�O鵋b��p��~�.�qZ����\H�}��l�R�̨�p�}��ZexZn1��BJBӎßHuMA��[}�g��a?oDOo6!�_{���}�hB� y��_ 6x��=Ϛ��%�a_Ґ-�P���Ȕ�f�⿠�a_/��p���;_=���6����P�z�g��@v����Ci�˥��=�Ψ�=g�LCA��� � )���c �2�] �����:���6�N��6dQ�;�^���ć�o/ uMD����ݯ�.w.vu��+�G���}��N���룷W*�������ޙV�W�t(u}���}��*��{L߮�m��ε�c�a�L�0��_��p�u�%��S-î� ��D�h�C��>�'�셐��i�p��@���x%��7��/qc����3���o�j�YU�h�}vI?�Dbd`} G{�Q��u����-����W)=`��wɸQ ;�.z[GD~�Q-�S��Q��Qʭ�UA�q�����6&�ۍj��ʖ����,N�C"C"�Y�R}+4owŪI����7}�{L�&�)rq�-�$ +SQ�bAj ��b��@}�|���2����|��;�6����9�t��N��� �s�VY��^�>��6��/ ��;�8����AO�C��V<᪬m���D���O��7x�������3�d�wx�i��Ώ�N噑�Q��T�wtD>`�����z��b +�q:aO_�(L�Z��zhZJE�{��Q�^UĐ8����~ 0 ��ªՠ=���,�A���� �x[�BzNɩ� �|� �?���3����FM_䳆΁�U�_�2�)N��,���3�vB�� }�DM��]��r v6��k�q��K�K�4��I�%�45��*H~�}2�J5���b��G�b��1;Y?UU��l{r1�����N�m��)����Zp�h�k���8���@�ħ�(�V矧�$�����~1�� �q�M�����8����>V��#�� +��%��~�0,S�\,�ײ��h��m���KN=Z,�šM?��#���ޡM_�^I5pn���&V7}���N̏������f�����wnwv:�� ��B�o�<�-v��Xꜯ�\�)�;���g}��D��_�˛�~m�R-�i�ͷh{=F���k� ��kVh�Hݙ�ԓ����dz����T\<�[�Ҫt�ҾF�׮Ҳ0�q�$�1��ϗ��]χ�5��0M ��~�(� +��M��bB�߹�lm�C���CT���Qq|Y��F��?H�"��?��g1��c|w��R�WJ�k��`e��_ � Hw3�PZ�.I˄�=���E�����k(D��I���ƙ��v@�i�7��S�> +��P� Q����1�\�VJ�>�>-|� �_����a��5���@��pï6t��Pj, ��|E��%N��St��M�g�Z\!MF�Gu�;Na��ૺ������ �q ��^�Se��$�H �\�M�mMY�b%>�������R���DZ\4�{ �߳S|�5���� ��{�ú����Z�{��~�f���}��6�%��^�l�a�o��l��G�2t��{7?H���;�^��3荲a���QG�0 �^�KѲ��7P�{�4q_*��gt��^�M&���a�+��?��e�r���!�x��$ +��Gy���-Ѳx�3P���S0��@�#��v%�wߊ��(J�$��kQ�,��RZY������=��!�Tq�t]�P>��3��t��q�3��?��� �۴��Y̤s/�s���3k�w��̽f�?C�W��>�jX���^�Q 'M����#��x����{��f��� 9��,��w�C�t����듓�K]R�T��/��/h������b� ��1��������=������}�Am�=������^3'k��{�S��F��Z Bz��*��k�{r�J����?b`�#N$D��Qo5���[���"yXIo쾮��,�~���]�|6��lA+y���� ?ca��*���}������`js`�Kc����"G��� z di�4��@s���m� pofO���� ��1���_[�#��@�0٢��]ۋ�F�`��Y/�iNu ��TO�Y�b��y�q��҄m_V��j%?.\�Ķ��g����j^��/&_]�R��<|��*̶����=Я9m��� ���fL�3�l�c$�1���z�q�T�G�m��u +g�J��R��͓��}ϻ��R%��1 �/�і�d��r�?�>۾Ř}��8�l{t�}'?Ҹ ��cQ�ݷ�Ra�s?��4��ov&p$`3aŶW7ѡ�䵽��K�C������dj��Gu���Wd���Zl�*��Z3�"��V "ш�%?�%�mO��{9�0�������d�rA��"V]�3�ݪ��-v�la��I��] �%�P�i�LY����&��ir^{�UT����<��'3���ZXk�j�6�R�`��u���,���ŴK�z�z�����$��>������Z� �4E:�Fk�/t�p�ާ��^�En1����k����!�,�eJ Cٷ�aZ�$��� ���—i��6�L;Sh!�J� ������ߨ�&A�n��A����S{�5L���uþJQ�5��47;�^b�� +a/�m���?��yђ6��nj�"��>yG0a�o`�Sp +���0���ym����O�eX(c��؟[�Ex�$bM3����.��^��#Y_N��w���]�O��I�#�6(t�H^����],��Z tZ=�瘷ƒ ��B"Op�:6�� �פ�����X�2��������zJ��{ӝ ��i�%��2`� +z�3'�4�I\ +9+>|�À=���G[6#�.�}Cd؏gf>�K`�4�34أ|��yJ��C�Q?Ģ���q���{6�ME5�-U�� +��>���z &�W@7yu��aq;����ߎ����)/�[��Q\�e�{:cx�b�5Z{� %�tg9>khwB|�P֌`���H\,����H{��M֌ E�k��ʱ��� z��R���� %��AxlUU�Y��u�Bq��ȭ1أ�П�6�-&��&Din'� �(��c�����j�@��>���:Kd��E�x`ݐ2c� *��c�}�v�.��'�/��a�ť�Wn���ᤶ�Ө��CĵcO�y� n�����k`��͆:�[����g�`��$��,��Q��Z�>��?l)v�%��w��b ��� o�i��y���.E5�G���޽?? %w�`$�7~a\����h�<{H�cO�В�����%��z��]OX&��%Ve@h�b��/8��.V�L�Z�[���p���w]�fHׂ���<�z��f=�=SjzCe���.���y�(�%��wպ^[��$�����- "�����Z3Q�xDj��yi�ʹ����C�T�D,����\�7����=�A����� ߌNa�냏��I�2�u���I�B �J�D���î� �O��‡K�N�(�^Û���%ȷ�_�O�Eyn��l��Z�^X�]�gV��u��c�[��o���{ ���a�u��oާ� #��p٣x_�,d��k�������r� 6��OD��-O���!w���AC�X4�b~������E����ė���o��k���j##�w�+���O�0��q�'�NQLc����G�N�6�g �Bl�2��� )�?�c nח~� ��:�Kíʸ2�(�_L�]�DR�W�9���kr��G�y*�h^�θ�z'��`�� -�u���o�GBK��m��Ć��It��Ի>�7���n�z' +/y���:��|�A������X�Zx[�?%���l�ծw���vPB� �H�>�L���5c�)]ꊖAi�(�o=vir�C������w}Ƿ�b� c�Tԭ��[B��Z���� Ag=9 ��C��ޤ7S���pL��u3(GRv'��t[����|�Ru=B#UiT�گ���^Ty^��L � 4s�%�"ˋ�2���;H-eoJne��&���M����dQ^�瘔/�� �Q��]�>��=��z�8������OD�n<�ʓ���g�s(����Nͯ�+Ӱ�Y������k7e?8rѢ� �_�A�Ud���+� �W�W?��Cv)Ӈ���\�h}/��\1�/�A��6�׉��*SgZ��,k�aԴ[�§�l�Q\Q�>��@�u�%e֛jJ��"+����u��$�Kbi8_����eb���C�H�?�nl����bŎ���y�®�p��ʷ���Ie�ihWo&�Y(�� U����?>�����>��oȁ],�M�QN?18�$N�#PT�^�LUsU9*��"�و��z����A�m̄�=[MW���qB�Z�����Ц%��v��0���(4�f�+J!���2Q��] C�K�T�>�F�bV=�����U�I$��ɵW����pѐ�MX?��v|�}�s�zQ�Џv<� rXK=eʎΡI��RLp�Aet�s`=�]6$J +(��� ����$��r}J��$f���@=KR��� �OO�O|�ß��'�����y���+W��Zަ�M��H�Z1ǭX��]J�2��I��&�0'��$���irЬ��=E ݙ=���U�M.�� (^ t� �M�EEO^�%z_�s �jo]B�ݎ\< �3�~u|������Kb�=��1BH�H��DlB�9�>�=�U�ox�'\��@����\)����/$�%� �g���|�����˘�� ˚���K�������>/�M9Lgq +��?��y��D�܍�!��9���Դ�y>�Tfp{<�0�}�(h�/���c�U��)d���� � v��wtބ5-s)�9_�/E�G�Y48��Ճ8�<�?Y��p^h����8�`�~�D*�,��w�f4E�>0؁��� 9�^��e�.���a����Gp +5�g� ��Mɓ�C�mP�z���ك���p���Ij�G�-�h��*M\+4 +�0���H������d�i +��7��,/�ڨ���So�h7b�8��$�,Õ'�D8�/_�\>3 �`�:;�S�.�H��lKW:Ӑ�M*EB��g4����5-@��k�� �,��if��R��ql�i�R����'hf��#|K������Nj49�?����u����B�5���&`Jj����l�Z���Y��x�=XtpV��5�CS�䯿X��W��ҹ��Q�f�VѷiO��?�� +��#��T� �w~w���R��$sG~��y�ß�Q57�“O��G���+|@��x��SxByW�fT-O��� ��y�V����6,�~c�G(\(b~Ń�w�I���7�|�_q�z���{��0h����W�/��+���"O��»7�\�����M?_���I �hG� �x��V�7 ��4�6҃�2�n��O�'R�Q�,��Ř`�0�m)�[E2���N������@�G�~0��1��p�I�g{�M�7b@�]�����G�fd�KֱĨ^�;�[i�����;i����������C%��ݲu���7�E����0���8����3�}w��tn*�p=�a�E���W1ǽ�@G�T~b����sA�%k����� ٸާPOdUr&Qg{W9��}異�>���23���;�S�+��S}�������w �Kj����.�lc`���y��mW�Q5�2��z��d��T�F8�g�M&��G~?7Z�*OǻsRQ��*��{��M�hFoxVFc�j=@/仫G�3Z���eΜ\Zv�ʃz�n ��%[x� e։�f�jw�<��S�fwk��D>�HՆ��="����S�y��Ae�5�����7 ��>�ҌP�S�z��r3�5�R�x���u�\���5y7$�� +�i�u_F�,s� �G����"^_��+��Ds�zM�ԎFՕ��2l���ْ;\0.�G�`��'�ٞ�[��~M�Y�b 4x^��J�h2�c����΋P�y!p�b��K��x�io���bg���>)��5ϐC1�����NB Wu?A7��.w��(�;�-����H ��$L�&v�R�{`�G1bV�o1�%èڐ���t�9 e��.�˾{�R��wNuH��cZTbl1��.�5 �US��p� fM�r-�b����-ݡ�Mh��=/�ؽ֭��o�&�C���=Ȝb���=n~�{����t��}u�jI"���I����2���\$��'yJ-|�/��~�O����ae͇d�{�nL~8���Y���b�b��-/�ß0���K�����ĸ�Z4�O�ӝ�d8ٱ�S^���,��g� /�_"3��ʩ���Sҷg*��}���X{�:����{�٩��K�f�e,��%�!��=�#Hݜv��Yͷtox�Rw�;Ɨ�x���`S�����U��{�B��]�Jwi�Sp�@��N7�;|�� �q��zhћ�e�(F������_��R<�@��j}�dN�.+�������lDs���o�^އ�=��T)���Kޜ���t?G%�"-��}��U�c�Κ� Ŵt�p�a<���,������.��{S?-����)h�������G�L4Nדb�`�kP���Y�zW�<1ͧK��"F���4:�Gd5�� ����[�G�1�t~v +ʉ����B5=�3G%�@U 9e��o�EO�}Ot�Y�&��V�i$�VS��[��W�����HM�i��Z���T�^ f���Y��qMt�ȕ��9��ӇWkU� +�j2���DYn�a�x���\L��p��4djr/�/��`���]�-��zPnm#�:���]aX���`>��w8�����2��q,8P/m"�Y��< `P�No���\��UP��K�IR�V�Ք>�s��A �pNG�y��;po��\����B�.�Fb)5�3���C n Q3M+5q�\͚��}�5�J�: W� ��DM�1�,���ӿi(OmF򜶔|)��Ol�? H,�2�Ɓ]��:��c�Q��s`W"��<����O#8?�W�A�?�LV��dge�i�( I1��ӌ���]����@鈚*ԫ��v�E+ZE���a��oʥq޲ݮ�M��6��Vq���W�Tc�1bw�ڶ�զ���߼�i�q�<��SQc�~��fr��938$�>e����� =�D���I-7� ��i��!���P"���n{���E*�}��ub���i7#y*4:#"�>�H# a��5��$׬"�� >�^u &�F�tr_�Ӂ)z��,�� zHC 0�iD��W�x'/{������� � N�r�P�rM��'�g5�� ��4y��ڮ��է����˞�~O�N�o�'���pJD����S� ��6b5Χ=�������R�i5n��'=����S���h��0ھ�^�K�����p�/�Z�Q��+�t�@D���{0�3HM���t9�_"��v�o�4�j��ˊs���ɔ���M��:��L�����T�'�4&��*/Qha�D5Gˇ�8�� =�;��M��4�E"=���P�0?�d"���ˋ&�´2h,65��L�(�;PO�L��w��l���{�=�K5C��ml�D9Mt�T�4`��9� �L�|��I��Gz�45��ʄCkj@��h�+@jj�ʬxg�����$��q�8غ�!��+;�bڼ.� ����}R��4W�yf�!�QFSU疯M&:{t� +65R'�j(ZF��[�pTS��4��UBi"�Tle4��L��󼽗Ҕ4�� ���hQK�Һ��7�L$# �t ��d"�<��V�H��(��_"ݛi�ʜ�RsE^��w�K�9�t�࿤�(��h3S�g?_��J��X���?�E55�/,|)�ʬmil�t���X)��(���Z +!2�\ڍ�%n��J�"�!�M΃[�%���)�I��qLT�xb���yARȵ�@���"�:���@�\��q\l"&��o5�p�/;�]O�9�W}���>*P�0Y��,ר�y�8r�|��+�K���������9��d��x��LtRQ�O6 s�S�V��0����gs X��VP�-m� �N� �����`��6"��r0�^��<����y�{�s6LSܰ?�hPϷ�:7�,�w�n4��4�E~x�K�q�F�^�7�S`_��5NRo�ճ���RT)�P�M7�a��y�Mp���pT 8#!9�����~�����p����U����L���'Bݒ��ÔJ���i�>��w=�8�n,��u�0���.׵�@�C�X��q*l�c8�P���=B$��"G5������F|w��fY����U�}���FH,d�F�ch�� �+�(��UiP��sԆ�VL'结p�s#��]����*�r���0d�?�Cu�� �s��\(r�rc��{`m��Qx��x��" ��5:��ԑ�3e��s�=#�2 u��ŗ:xj�����*.zZ���.�3�hu�����G56f&H[�&��ajۡ��/2q�\�u���L��a$��Rd���d ,���?&\�m�$K��Q��g\��FPRx������?5AbH�LAx�W�G��B^�)8e'��/ vCx<�b��l��c��R��l Yh� ƒ~�ȹY�Bx���x{Z� <���~W�|��t�F�Du @x�V[IJ&�*`ͅ�� Ar����xŷM�{�Z |��H������t��|&F����\ē��*ry_ģp�!�4V�|�� �W����D�w������,!�H<�WM!�\��}��4+�x2��]� R=b�oh��7�(����� BZ:F�*qFƊO��j2�����~l���}���� ��EC��"��i����wG� ��(O��� E�)���qs��]��N��慫q���T�I|��5A؄ 70 ������wJ�u�݌F��*�w��n���wI�����,)�1��O��L�)�k&�f{3p� -}���$��� ��^��nA�K*Z3g��[gu�~"���[w�A�a�Hcun}�����q��@:6��QG���X$n�˵�He�IǮs�/��D���M�Ydc���P�� ����$8bLc��ڗ���t<���tmω��%c K���@J�~"cK��C�<�n�“�a������=�w��t�H%��j����?�}�I���N��_G�i4�?� �Ǐ��� �wh <��#��J?b� ����z�({%�;<ِq��{~|�c��4'$�׃H̜ HD��m���4u�?�����%pрV� +�$���#a�yl�;$�o@��M�zG4�fv~���/���4i���Jd?C�F��;����B"S%"<͚�(��ౄ���w� =��7NXϵ�����L"�����d��k�|�/��y.�l�NmvP��ѷ� m��`���%0߭@��v����L�=ƀd�4w�rO H� �����B�%$ +B$Œ��_}����$�0���۬܀��ϩ/%QS�ꃺ4� �0n�LR����Yr�����[3���=)a��JEC�~��l�'�x�����]�G�;+��d7���+ƙ��Ю�Qa#r9I &�vG�Ճ5n�R)@r����(@Rl�J�A���k�b�0N��&���? �EzGD A��"N���S�@��ލ��ց4H��ա5B7Ҩ� o ���f �&,����,��M��҄2���V2�[Gy�v�; A+t��Fw[�;W*�� �n�s�n�<%��~.�>��T��S 0��,7����<��w�q�#H$o Yhu0��֦�[�w�!�@A�c�O����H�'��w��%�-�UO�|�7(|��aO(�k����� +N��8��B]��7���9��_sFV$�������m����n6x�@j�w� /�{�(vU���-')9K�a!�n�$�Z�Ο����Q>@�z� �*�͋C5�Z���tty��A�?%�����p�����_RYzϾJi�Ě:������ �p���ص=�����A���U��� �8Hi�aJ�3��)i7'�1��h*?��I�mŃ�����b�L����I��t{M���m���x�������]�|��ܕ�D%��10��P��.D�\C�Q�э��Jg�<<�b9�゙!�D�D�Ϊ�� ��UK/ytdg��ݒ��2�݊oK��_w^��T4 �yr��D�3�e��v�� }�#b0q�ld^Hi�Ӆ2m�օ�m���X�ƽ��hf�����������n "���?@�瞓�X�B + +e�~�_Y]�ķ6R���LH�9,eMEQ�x.��B±��xE��Z7���Z(+$��1�hl��!�"���*E��T�O�Hϵ~�) +;y �4M�:C��ۥ80�ŇJ�r�y��"�>�%F� xrTD+�!-<�/�K&��cG.� ��i��fF:Z E:��#��N��*�,�"8��`:Ov� ��{S��?L��R ���NN.�;zH����U=��\:jH�"xy�t��n�����Q�G�ψ.�<��'�@�&��ԥ���T{�0M%�T�"U�����ݏ� �<)�;�#z���W��艿j`�)�?�Wޞ�]��[$��װ2�m���>���*�������(q/#�ӂ��D-� ��H{��H�Z�DD�Z���4�<.�x���Ũ4 �4�} �‡ /yXc5̎OW�)��� ��ν���NQ<��WS�>�1� +�$!������,�����o��1�Dhx�9 ����A�[���8g������j,n0��aߤ�Y�'y�n����[��GX�6����ͱ')1 �ľ�9@�$�y{��I�q�8P,S|nq��$|��F ��G`(�������e 3��)��/�7/�8 �\@k�V)R�Ӽ�'|@B.������{8����'�=8WiJ�c �]�|#l ) ��L$�4v�8�Tus��A�R�6�!8V�̒|E]�62�i��ػ�Y)/�4�:����,� "���e��Z��J�)^p� +���X������HfR^�+֟d�%~�r��ߨ�R.��MŒLt�X��y(�K�&�=��=�.�; +${Yտ��uŸ��'Du��.�tb��n +.b�_B C�%��34�dp�'k��!�\l��S�н�T�*I�P��.�P�η�'���)`(���Z� C'�(�u�e�F�e�A4��Gܱ�'B(K +��`��UGŃ ,�P��s�8�~��Ɩ �KE�v7D ��WQ�7����va��8v]#~ A!@J�� +�IK���Yz�� �LN<y��M�����* ���f�;�mOFt�vX���� wg,�q��b�}��.�2�� l‚�E + ���P������LDq��E�_��&蚢��/ +l6C�ң���������(p���V�K�\�� S�M��� �4���@jzo�?!�H�1]����q�F��{0�Y׸%�&��X�m�w����� 8��*Y�Ag���F�3�/���ݿ����o�ԩWE����K���{�~Ñ3Y�d��H��1SN�4���X1��NÑ����-����;�9˦2h����pt)���6@�^6E����Bо)�p�ע���T ��_��&���1��a�}0��u���2��o����'���#���s�6o���$U�t�o���eh7{��o�O��S����ۏ���w���R۵[�ʜ� +�2zY^[��c��mM�������NW����T���p ������Fqz1��姍��3�= +�F�kK,� ��p⎒�ƍ�*�qh6n�mv[�L��$'7jx�铍�oݷ�M���NA�nJnt�H�&�=J(�9�G$s�z�cy�ɍH��쇆�����!#�~�o�¦ p#�pF��_ӗ]$Gkk#5k}M���K��6:��-^�S?6}M��p�+��F� � ԉ�q=�&x�U��ʮꚄ�3з���N٭Q�R�b�c�^�DF�ݽ�e�����|���f�T� +��H����Ȭk��<05d����~���౦.�#ҕeG#k�壝XyH���p�;'��o�Gӵ��l�jt�^�� +��xW7�IK� X��(1l�v�p�| �q���v4�̦5�U8��;)����9V�q0�y��:>��;�����]�Sa���JF��j�1���|�520K�j���O#�E�k9;�4�`!��4"K~���7�$�;,� �?����� �FW���m6�R�Futj7�ӈ��i������Ԋ��+l�^�8FG>Ғ�W܁�&BJ wO�H�l�64鬄n��!�3rd���SW�H��26t�*��L����"���Fb�?D?��(}M N�� ͝�Q�Y��S��R濦(�R�(۴���$j�f7ifMn݀���F�� N�@��F�L�SxD��6��C� !�k���$"�s3YB��i]5�-{R8L�����Da�������&K۸�N�Pӱ����U�FwFR�0��������F�H{����G���43ghb��x{�)��Fr���ӽ�U��MA�@5� |�<�6�"r�6�r�"\����/=O�q$������LmYͅ {�q�B�x��+7�T�e,��/1K��vX���T_�� q�}�M6#ۍ5�(�}�B�G�����udX����a��M�b32�gO޵���i�*ߍ�ɆC�v|��)��G�G"�N���:N���rME HSvsT�v~R�H�P/H��R����Aɾ{S$QS�R�d�Ȼ���X45����Dp�='B�� ��)��q$A�#N��-S��E�̚���'���@%G`$�OI�U��H��E"�P]�l�:�KyVĉKJ쉤b<#!KՂA��H��Ɇ��$8�0�m�N����C$�O���x���S���$���R�NUs5��@���3f7�d�H�*�����Z��O/��H�$I`��$���#��.���U�����S�p���ɳ����ZƓS�$��*E:8��)�wS��ƈ��&��fV���*��� +K5D�T�����؉�`9� �M�؉ $� �M��#���W���Q:%iPD>� �Lh�$����5����,�� +;Y4�߰��Ywb׉@��C}�D^�[��"�����d.T�ߝX�`����"I0㗩��$=��Hj[�)Ds,o@��ܵf�T�� �Qr�%��fG���d�کA�3�G�EεS��5��8�_;> +��<î]>��K*�����](�uI=u�%�^G(�D�C��R�.���)�� 5�4J�;�L�1I�6|~��%-�vIT5�n�9��So?8��5�CfLG��ڐ�̨�7 񵓦2�� sQ �i�H��P"Eg�H�ϟYh<����u�'�P���"� +�#ᎆl��,`�R�[P�pƶ +%�ފØ'O�kn��� +Dž����ۨ��}�t�\�in#��v���b����s2j�(]��W���yR�_dO�L"`EI3Y�Қ'V�����۰%�IJ��\�(j����ӧ���2�'kg��D�#)�c(��طO�(QPO� n �A-�[�J o��jS�g�X���S������W�<[�$�߂���J�nc�rR.ا�JG���qvT����>EQ?я��kD�¥�.����C;Yevԥ95��K��d�佣��ҋDǠ+��(}�k0sW�rё_"@�T�����\\�n�¦�K���d�U7ť��%;܃� +b�̆�D@��#�K��0��h�� Q #��/i�]p��Z 1��t4:�,y��:�$KԢt� Ҭ��9���수"����{{�J'��>W���7��J*p�$�H�‰{~�ܩ�Y^W���=�q�� +�^3V3(�T���\�0�`ZՉ�&w��Ǟ렅3���'`����������lv}>X0��ݯޒ$r��C�V˚�i�� SĠY S��}�Кw�K`�8�{��G�K��RJm���&m�����/ ��̿h0E�D�@��_#u�"�R��ȣ�C��A�i��:�՟W� +���2(jQ#�>�0��V��'�mC�G<��wU 5��_�|��b!]�[_}}��LaB S�/Sp���c�_�1��^ +��V�����!�KĮ� � ��!�٠@�v������ E{|I� >u�)AL��po��T�*k��-LY)�>�c>F1 ��A���¯0!�R�9h[h�ZW�*J>�!��”�۬ft�� J� (q��8�$�^Jx����5-0���a�l^ �y��@OL��@�1�����4�Jb/�=C�P:�2`:�5� R0 oL6Vl�S]d���3�*���J�{ r �҇a�0��_�Xh��� +�_�p'Pu�P3K��Ѣ�x cC��;0�_b舭� �ұ�����9p��R�H8�[L|`e���_���!yEq8v-&��:z����[L8�*f^ZEB���[L��Q�P'Sw��|�*yϠe +alL�g�7�����'��=��1��-���Pp��] *�ࠚ���`I��;��K�ׄ�L-GC���:�XS�����;��� +Ԋ��1 Wa�Í2ŒvT��ä�1�������Qc���#�Ä�*�™�>�⢠2ڇ�����$:M�P��EZ�%��=�o��C��b����}ÆB�f��a x�U���r���˻jxZv�cCBZ�t~Q�C�1 ��iSF:����O�R�"���~��L�O$*T���J� r�I�3(��2�OEmN�1T�M����j�5�~�؁M�+uu� ��xzr����M��w��>ԓ���zo����Ro�4���7o�G8M��1Q������hz��V�� {��˹��8�ͨÊ�Y+�D ��t�+2Fv�Mp�yQ �. ������k��I�o�~MO,�پ��3(a O�^��$ ���8w��|:h�g*B�*nXܽN6��]H �"Ӏ�����W��)����|�}�.59#4����'���' x��'��5ҰO[s��#L +���Q�����3�t*(V1�}�"����b���{��L�X�3C���NZ�:���o-���#��7�����}[_����= +���QE��v�����O���3ݓ=%�(Gɋ����Ob�����|Bg���8�T�̣�)RH{�O�!���2��|J=;K�7Q5�� sN�bђO� ����<��/`f��FwT�/��w^:�;*�D������ �����o�!̣�����O�M��S���u���{N��Ra�; �=ꗖ���P]�pH lQ9�u�����@� Q�7R�~�@R�s�a�C�\A��>�t� xF$uՒJs �Tlq�d�lk�R�� +%�̀�u(u)�C`]DC����Z��Z��5��%'c�\ ��H�%�kO�ZC�m���k�¥�b�*��*�2J�� /5]V�;~������4� �^2ʜecQ� +H���� VW)GJȬ�咔鷫EJ��Ճ7)ay��ĭ@;-zjS>�e�(R�����Ӈ�Sl������rj�2O�SNvزEGELU��"2�Y#ڝr�P�2�*�% ��b1�;��R#]���.��P����T�i���b�"Ԣ0��]���A�L��Z�?��b|����*��w��?eФw���'T��� �X�D��ۅ�dv�d��|�-�WQeE�� ��=��B�IU�\�.s1�5�ow���ǫ�,�^��)ovQIG���^�P��,y���FaT�>��}`T_�kLY�Y'p�+�r�yU�]�EYY�N�U|�3^Y�Up�^Tvጕ�l�ߏ�xQ�T��pڋ����t 6���P���Ah+m:w?q�,9q�R�A�E�Ҧ�(�� ރ!¸̦.�b/�m����Y~��1}GF��������&J���� �L~x8 ���q�,w�!��9U +I���J�F�ct���3����z!����AZ�@vcb�!���9���� ��Q��)CD6��M�q�}]L9w��~����EePbe��/F 0� +�/*sv��S��W.;uT��%*d�� ?�2 $��1��:H/�*�r���NT���~,�e�g�E�3D�Y܊�cgN9Iݝ�+*q�/�B?0��2GnQI��U���K�Z�/� �?�3�V�\�D��qL�����Ĩ.��0CĨD�Y�J�|�7w��ڴ�G�1**��x������<�=�fi �Qɸ��wp���P(S@�cT���|=Fզ6�Hi�Ǩ8� �k2��f����uҮ����Ũ��%��j!���*�9�!9��}cTM�v^�<��W;\�X��ߠӑQa0��(�m@̨pؔ (�̨E� �jUfT(��QqP֐��97P�r���4hLlv � +��e�6􂒍Q%?�?�#�Q�u�쇇#A�j��W=)�����Um���6���U�{XFu�m_���݂H9��-�J�Y�S�z��/S����D�����2�@#ph(�1*�Oa�i�(Lĝ��+���V1���FEO��b�PpLR ��n��!=�u%�>����Ĩ�B.1Tz�:�b�jM<�M^^�ʱ�/�F����K0�|�n/�-�҄�ྨH� +�_���2�vz�������Z��bՂ�� *�É�4WA��rQ��ʴ2�".��ס{K!���պ L�<���R�]�bۺ��NJJ�mVN��Q��(���P�h�쳇�����0�.*��֔9�R ���D�.*��ȱ��Mt��'��{cr�/*��Y�sV͝�[��D� %xQ�JtO@fH&gyQ�T{Qa��� nc_�.��["(8s?��̸ t��m��¹<V�EZW�G@U0M�k�ܰgrQ��] +��qQ5}��@����G`�3 `�0����E�և�T^�.�Z3O.hՏ�i�MG��rPE��>f-���J�*��â��Sx�����r�~#U�aF*��!.��RU]��9��S�����Ң�q_�B_Q�TTl6k�HQ%�8dcǰ'$��U�� �@��c�JQt%����nE�5~����z@����*����B�n go )*v&p֏`�{����iU�Y`���0`������'6�G�� +�x +.h��oܩ��fo(���᪨8��p*��K��`hDE��`Ni�Y9Pa�,**o��0��s�Ax���VT�h��b�R��A7VQ��>#S�7@(E��DC�a�������'G��f����1?�#�P2���ʡy�PKUT/�U�˖ � +� �x�'* p�Ng_)n�JF�#�dQg�]����.1㤼(W�yYTY�J�� +U>��J��x���Jy*�j�8'���`�B��v��D�DJ�<��@E�B%�7��])!�z���J�Nus��2�+���\�7��E���f(Qi3d܁��NU����% �agY"�i��s���P��Mu�kE��"��ԋe��<�"��!*Y��"�H� +E*�Ͳ�CT��(@�>HE�Ӌ +Qu�!Q�¾�J���l� k"*/';�.�"���#`��"��6�WMo:B�L�^Du�'8zI�� F���l"*�m�(t;}ETK�����c�YD�cAo���OR�N��B"*�J�2=��*`�� r�Pf�z����+����3Y �<��Z?� Q9q/t#z�^��f Q��C��:��ЕP�"�mՉ֏� +>���ĞS�ETօM,��~hM�DTP�?WCI1���e%7�P��X��,�w��A�; +O���h�V���ۛ� �J2�z��l_?"�y�0> +@Q�X �]WRa"��J�"$C�8 ��QY�����"* �k8��DT,���6?>����`Ijl�47�l*C`Y2��,\��$�� ���q)�ԫ����3 +±�� �����2������e������-�J�H��"1�P���=�(�,0� ��|f33a�%�E0e>b�KPܰ�f B��,���`�!>>L�PW�Ĥ +v�(��b��ʹb�-�L�h���\h&1Ž�x.J&�If� ~��#���tݞ�4��H;�\��#*� �sxx��I��М���D���;9�> CF+D����W�U� "�G�4��GDEE�@���|��4q��}o){��M���� s�2��(Q�Q��Bp�BOo\�n��43&���P�8#��.p�F��L��'��ی��t����8ݸ�s��_4"4��-��~0-#��`���0B4�p�:� 6��_f3�����?�'�˙^���sD�z>>a_NZ��s�j1k��q�?�[? K�~�E~>�p�CG/�W+���A�E.@�^��/��[(4"�8�q1 �����a����g&,t����G<�6IR`@p# +m�0�"D^�h�̝k\p}�/���� �/<�2���Ya߉?�����]>k����}���#�B�tMDžL��fLD)qUB�N+՝�+*�2�|B9�>T�A�(�2&��atC���&��d?²��V�f �6��¬!|��y�,3g�%\�����1��W���� �ʽ� �d5����d�fY*H�v�N��5drF5�֌O4���C�C�v�G$���54���E�����i��rI� ��W0(?DC4DC~ժ ���2L�⭲�ツ�4��~a����FS���P.�z � �����@>h�Cx�-�X-,˰�5g]�PU�F]���܌�>Cz�?��N�� ������a(��M�3��̋��?m�'���w�-����Y�����_m��_-=��T� ���4O�B��L��k*�/Ћ?̏�qH�����F !Αq��O��� Z:�o r{�����a�Q�0�~��}D���E�&q�$�M��)�4�Q�M����YQ�<��dbU� �w=:g��R��D��3�|f�\���#MX�F7>�Z�\�����ѿ��C�!�H�Y�a����ٿ�ue�i�?��^��џ:2���a��y�M�|�O ��!g^2�b�A��=� ����e!�T�?�����yf"��0�P.�/�!D���>�����a<�d'𯰿��Ci��� �?�C��t�P.�E���C�͌�1n���$CW�� ����5ց��a�F�--oL� +lCI�w�O���}L�=��P�B�*�|�!x�RƦR��ߋ3�x�a8���L f���(�������H�� �>�n73��\f�/�"��B��S�ȶI�h����4�QA��x��{;1EC�It?�),6�gvqҙn�<O�|b�biZX���.�/��P|�%3���=�6#��H^��Ċ�r2� Ue���g/���[A���&���o����(���&0�C�\阁A!�� �(�G��:*l!�� \�&�x#�� [F4� �M!jJzMQE*�U�P�e������b + +! ��4����h�]�4���~;�rdg�i�0%tڈ�/�@ �|R��b<)�9��ش?��{N�$9����iTq6���&��?N�d���B�##C�ߥ’����2T� f}����n�CƩ$0l9C���)2��!�ᏼэ.?�!H��n � �B*Q���#4t3�E��P��(�A� 4%"��q��bCD� ���' !�� �����S�+f3t�l�f!~'�~8g ��ypTT��AB �ï`�� �s�񲄗�2��%�7�qA �5P���� ���i6� Ġй��;��ژ =� ��'�%<�Y���,�G�Ճ/��#��Z��-_ht��$Db,!����wy|�|aC�A �T#�7��$T K��lvQ0t�΢P�(��&ź�(!^|(���C�|a���X���:4uW��3p���p8l�� v.b +H\!$a ������� �E���X�o�>������:�6�]�s0ޚ��7��,8k}7�|cR:sO�a�� �[_���m-�I��n�e��y������a����d�O��%��G1�0���u��#~XLr}��B����^X��{X�� q}cu ��lr}����n�>�-nC��[�bQ0c��L��t����*����a�H���K���Og�zX�����jx�# ���w���J�6,T����� �\_H���(����2H�J]�jM16�A,��o�J�O�П�]�ge��K�� +@,����S��~X�8A�S����z�%=,���������d�a�7 ����������a� �%�y>��}��I�c>,�=,�Âc5�6�3�r^P;,��@�� +t���������R�>C�i ��S����A�����5�̣0���49,B�}��9'uXԓ�[�a�ݧ�k� +:���D��}5 ����@0ȷ�l� ���9,>����᮲��^�w�a1�O�%1���] +�T<� xPv_��rX|"�>g`�؋���4\�����>[��}ay���D����=�T�׷:RA����s ��rpqX�4�d�j����O=�âf�t���-2�:QtuyX`���{X@*__I���طRH�S1��j��}�!�! ���3�ҰO �� +�O%Oa�;��tX�J��ݫ7�=|��듩?��}�_HI�P���EٰX�a�w�d�*Q���4QF���a�u��� +�,�I<�/�FTbX������.}��j.,�+�7��"�5���}��evNЉ}.��� ��� �z֜m"=�-, �>6 ��hA����6��s�}��>������ �d���b�T �_.,��Q�>��⒳��Y\X�� �X����}\2�kI�s҅E��� �9�}_\��U�����t6i��>R��~>���!Lax"��!Qb�tN��& ���LȰ�9�"�pY�J��3��a�� �u�������o'ఐQ f����a��a�gQ�ӛn��qs� 7,�^�����&��; ��P�����E-��mX4�>?�9����ȫ�����}� �HiO��"_��*���O`�Ia�<_��c �����o:ľL���s���"���6d�JQľ�_�&P�����ϗz���>�ܰ �a!Z��6��<�a1.����E����h��@���L����S��i3�EҌ��׬f�~s�+�R���U��E,���)�}&&���?kϢ�)�)���4��n��)#v��;����(K;�@� 5@�8��#��k�K��f?�;�[��jHp����Rܰ�)ZHum�F:���5�#�I�~G 7��30��՘�ݰ@NJ#�+��_��E���h)�.^�]dPu9�߱w��b`�� LE��]���}m������˛�(^vN�tW��4&�$j� &s�5�ՊPo� �kX c�T֚�/tb� ;��`a�F�X���aac �nX� +lN�pu �WroXp�3�\��pSD�d��6�Q�t�c�D���7,�(� L�Ғ.��+i���#B�aA$���v�^��55�b�q�L?A򽾆[��9 +)� �F���a�(ONdN��d��Sn��i�UJ4�VR{��(��A����]�� +�����I��e����nX �P߫}������J`�[ȕ󿕹�9��aݡ�kn!wn/�e`�gOnX�����S �����B@jѡL���{��R:7,tv�92� �Z��ٰ�co����Ku�o� ʟG�P���Y�� �oXܴ:����R,0�y +��2y�Jf(t7 )O= ��{�%C�� ��]�hW�)O%*��8�����,h4mg�#CR5)�����v���ԧ ��"��)�r}�x-ˏzg�ٟ�tX�)"M�1�Y�������� �U/e��d�ٱkYeQ�7��N,�Ƿ�������JNQ*����[�v�:,B7ޢQghf� Y�,���H- Ģ�"��Y7 ��0(Y�?~�dӏ�7V< �ّ�zJw +�hI����F�؝��⑴O�tX��9�E)���a�0\���Q0�$�B�(`}���� W0e �ZL�G��a �\ ���g5(b�9��>,���mAK���4 ��"���g��=#����a!3������������ci�a�Wf���� (���x�f�2�Â�����|����`�}����|��~,��[ J���n�DK������eλ���+���X+v1��Vɜ�O[ R� +5�/�����O�{�� *���7.��@��E�U b����e��>X|C���A�Ƥ�Be�d n��/%��q +��4xN�r4���!?�ì�캋��E����`��+�=h �b�G<4W�J}�b1Ґ�)�ӽ�V�a�xB����+�.S����.���e:Jz�F��e5g�ImkV�n \���hӀe�[D�2��� ��P���a����@�"+�X���#��x���*C�{Q��X�2'*�<Q�%O� ��A�1s�v�~~& b��PJ�Λdi����n-�)#�P�?[��_b}��� ;oFw2q�A,�"�Q��� +bQ��xc����� +��X:ʇX$��K`��ؠ��\���^ +��8^t�+6X$��_g<���`F��Գ\+��@�랃g�i�&a�|���qPg� +̀��\���@i ���B�X���\� +����Kep7�7a���[ϯVy��X�d�a0���� +��)�WW������Sw���A�5b"̳}�71�D,̌�WOX��Ac#����h,,�o&�逰D,���� ����N��j�﹫����`?z�5��M +��1� ���VH=x�K�f�L�’��+twO#a^��p{k����c������(�}�����J�m5QX��"#'�)�3Y� +s5�0�h�1�X����kr��Vx�"N�qfF�‰XPa�DK��G� +���8)�E���� ÓqW����X|�-� =)"��[6)�'�X��u �p����5��X��I�����DX!�r����E,�-�{���(ۻ�Q� �I�����������9�M�D��LmNI0�Œ�a�&�� .�7���Z�)�@9���`�)K�9��F,��Q$��mĢt����~�;4i��A�� +�/���5qi�����IV'ʻ�U�9�v��5�_JX��z���Fb�S1�E� iW�|nj@\ +8c,� �0aAPM��x���IA +��AP� Z�#a��OJ��2�%��B�f��2�LX��,�K(�!a� +�O� z �H; ��}� +��Ի-� +��X�u@�ﳆ J���C���2�LL#�^h�q�4{ĢC� n�hB�`,����1� ���؉KX� '1���n;Ml� +��F$V0��MB�5-|�~�v�30-p���Q�RL�9��-�u9b���gVA��֠��T� +s�+Ϛ%1�����N@��<��i�vO��@b1�7W!$�bR��i��_�,��Z�Y�����[�j���a� +s �GX�w��#�6W�����z�Z�0/s��C�0<]�� ���:�#O/�� +$# z�:�F,�k>?������D`c�'s�C����F���cU3�s���Lk��:���Y=_�.Yح�L$]� ��ܝR� ��&�+WmF�vB�ۘ�rP�]�B�`YtC�Xt��G�ȇr�ڈE��.�MWҌX �2ʶ$�6��H�Z�=�IޔV�\�z�7X�:�t�"ϜwNGjɰzqJ���F�?�G,�x$��z�"bX��#xF����0W�C�ַf�̈Eo�K�4W��*Pe�ߚܝ�R �9��\�Ȅ�\.m�N��B\�U��@�D� 7��d��u�B����w=U�>:�*R\�pPs�� +4>G�N��߻�xs�����#�UXDɉ���a�\��D �?��m��� �r��_a8"-�f�f�ψE���\�ޓ\#d��#��NG��pS,�$�~l@b��,R;��%5!lӈ� y���'MF,��X���G + u;�؍ q�bDS ����I�"��zY� +i�� �� �֡\�"��j���H�;Ăo� _��Ib��o 4"��$� ��j��J��Z�B:�g��n�[����/s �c��a���.���� ��E�sMh"�@�(��/Kz����7Uؽ<��w �p'�n~�:c.�@,t�Nwj�>�d�+��h8�i{�-�F����X�\F�pI +b���� b�4*p���&,� ,�������+�{jB��9q +�:���E׹*8�ՍdЩ ������{��7�)ݜ�P�z7��b!��̩i��b1���)��jb�����i�~IOM�E���g�XT�� �a�v���Ԅ&ד�y,���{r�� 7 �yq(�t �z�f,��q��x��yj½�mPZ*�ϩ%��� "e +��Qj"?眧�|X���hɍċ�T� \����ҢY� :F5���{���PM�g�:]�LQM8�?��w�&��x��T��2�w��𲊿T��ya`��e�������V��"�� J2Z�f� s�t��ؑ������lB�ϭ�����T@��&�����j�a��=�"��0f�^����^�i����}=,d�4_F����2�d��@<�� ��F2!�xk8��|XL p�p5��p�۫� :��6� ֎�?2�Kn�2Ð� :77@d4�>>,&�X�R�T� +M�`��Qb�Z?,2�zBpj�:L\�+3��޴�2��h����@�� +A�� �M�O�]�Ӈŷ�78�~X�>�o��.<ϳz��2��Cb���Xl T�%�b4[�1/���a1~�l��:'(-�}���z��KF}X|�����p� T� >,� R������?h���I��E&w'�c�|(� *�e� +�8��HX +���J�u�? ��}�t��*d`܂�����������X��U]�������<(�㝕�lH��T� ����B m��*aj��6иP�3L%�ڷ(v +�"*¾� h�xL���iI��>J �7Wf?$��c��, +�v�9cQ������V t�3T\W�l=��(�ں&`�5JD)9�'�P���o؟T�~���8���$q��?�u,�C��E�E�O���4\f�kD�H�XEH�T؆%�*h�/"�<3=t9&a#~�W�= =��̗�v}j�e ������u_8��g�z�u�|H�-��g��M��X���\!��/�� �o"b�nq�l�wh)�"�㱄%u-���&�}�ĵ��:�=*V�X$��mڃ�肀��"!ݭ��@�%E+�X��jh��I,Ăc.QсWUW-�F ��)UB,��!>�A���@8��p�m$I{�_������2��E�!��[���DH�@C���\$׏gbp�$ ��Tbi��X�� ����$ �A,<����pS��ZgZ�q�C  �\;jeJ�=��u�;k� 2� �7 � �Bj~д��],?����%��w�n�X�?P-~q�@,V�-�"�ƒLk�I@,���K@.]���S \2e?&ώ�8B7#NG��Y��e�au{�ڃ�xt �X��>4^�PĶ����Hw���W!���z�����b��^־��h�6E�Ά�z�K#� {g�Ϧ����#4۞����o��3�!�� �� R�ÈF�T��E�X??z��Bũ��a$‡L~\�8Ni⍅��yB�'���w�b����Y+F@� ���{��+"o�N�.�E�)bQ"�ĭpm� ��� ��� ��*��Ω��b�7��Ѱ$��_1� �R�ו�b�z��v��G;y�Rf�b�W���&� �b2L~�ht�!�W@,a����tE@UeQ8S1�k���2�-�Q"l.�����%Q6cP|���b^h����W�u m����P�c1�a\#�����û,d���ǐ�̊XP��>>����8�[p1��S�_O�ЪK�p�����^5uJ���;vk[^*�9;C1��� ��`�Y����L(FB���(�D��E߫��aa� H��z�/�K{�ޠ)cT&#M�qX�� 饒-�=+n��S���}UJÇV6m�\|}I 霍�"���]Q�P�t{xۡ�� 4�2�3���޽E���"C?,:|����X�D��aq联�i��r)F���[�RV1B�a�@��߯�b��gBf|�"m�;�aqX(B�MP���Hļ�����I�*TnXª? M�kS�as���7,�Ng��u���nX�Da��� 4oްp�`���f #�Whs6B�T{���`�[��qX�ƌ�T�̤���q�����{_��xւC�/�f�{���ɖsX��z#\ "��e�9>\��\ӡ����9I$����ozbe��K��:����������Q�N=� i]�ߔ�sn�E��2c2�҈(�mzcRE!��0�t-Eo�ܩ��@r��U<,��ؓ ���E$��`[!��%B9� 4������������"��\A��{X��I���vj��Ƒ�0�чE�i �`��qL��/�%����� ��~��� bgf� ��4ԇ�B��8$�b�?@4�v?$Uw6�wT@>���%�cŸ�� '��/���aq�ó��тD�¡����ȇ�:_��G�����y��Љ|��j�� �#Mt�C���#���4<��:!��a1Q2�R�1�������9zr���ܸ-�B��ah;�[B��˭uyu��K7_8X� ��+T�:XP7,,��m2���D�hi� �T���W�*��T��5,^ž5S�dV�,vmL렺"l{�(� �)w.:Al�}1KiZt_!Ża�S�G0��:��E �Z8hC���<1�aA����:Q�KE���l8㼐u_f�fe�����@dT��\�z�W��BIp�&����� k����oso��\��O���ո�1Ŀ�|�s��V�n�e������ux2�:�B���w3�{�y�p����,�e��<㜔 +��-�ZW�lj�������1h�|Y+�Վ�7y�a��F����l�����EXQ��]R!?�#�3D����Ņ�ԥ`ڥT�Xc��vѽG���Ɨ� +�d�΢Z�R: �ŵ�ȳ�Z��|Ob\8����`�i�a�����%�h1���љ���J�� �{Ap;y F�hAط���+hnXЬ�˒a�t���*+'��5�WP�-�lX"膅k�8,�ji�o|sX0��/��`�f����a�� �xM��O����4Mө��BLHē�)����X"E�\,"�tz���B,���|�1��M�n�H��a*3���9sPwX�2�ޱ� #�V�X,^���`q4��t�a�0'�;���h��ۓ�Â�3�������&�5��+�d�*�,wX�-�TN��<��*�V�q�����*N�� �*T��}l?��;�i9,>;������ǟÂ�թvJB#o~ �?���%?!��#�t����x���a���p�D)�EFs=Ǡ��̷z4U�2[�d)�a��@� ���">-� ~PeW\������Ҡ��"�ơ�k�į@���L�kX�%�Fx��gXdԢ���ɛ%��+���1,Vm��g�Q��J��"bN F>aX`y���U� �e��(^XD��������=���B��I"����W�fv(� â!�{�<�K�<�'���w�°�\��?���<�aA, �������^�a!#�Or^��6&�X肠ӳF�x�iv��M�I�q�Z� .,rx+1f��(�[YX )��~ X�F<�ʉ�OnS�݅�1�>Z�&E,era��B���ո�pv�w�u��SQ{������V�w����5���������g�9|��v�� G����Sv@7Ր�:�~O�՟�� -,�`DH�Z-,�^��nx�_W_�֐�O 8�=+}��4��JA��D-,n��W6�.*S��Z�+�<�da!�H�������~)�B���������pOD��ѐr�D�丅�24@�s��[X�a����u�V��P��%��*�>�ZX�,1��zr�;I�vnz���q��v���֗��Aѭ�>�)�����q*I@�'nʚ�}��iaA�z-� N�]��\<94W�����: m��i��Ҡid�Hz~aq�}z���j����C���l!����"�y(j��]Xl��"st�!�W&�ʡ}�y$?�yo��eC�4`ǎ#?I�X��΋!��19�����C���T�4��̈́��l�a!4�@,�-gx�.������Q����\Xdl{��B{,2Ű�r:uf� J|�ܱ��8�7��O��Kb X�EfX̜E�'�G� ���WâS�\�ۂΕ�w�鍫VjXX�;��.�rM�f�B�Kz��Ek�p[n0�@�OZz��T���t�^�n`�q̝Mr�;��m�/�[�� ~a��� ��4�0�� bh6�.�C�/9C_��&D����|{�MS��=�����HOZn�e�BȲ��sGF*�vLK�aQ�px��[�il@��^|����ם`�>ˤ=!gw� �`�� r~ʄ� �"�Q�b��=}|fjX�%�Z#��S� hLSw �\L��Q����#rw N,��:Yk猻0j�e,�<�,N���_�6,H�-ۊm�jX<�΋�nѰx�=���y�?G�л=��v���pH�wga8y1۔�Y���\Đ$+��5h)e�W����s9���װ(^}-JwA���h�w ��� ��GȶYk�̳_ϻW˞r`��q���� �D�!���`�"|p8���D��Z^��� �/��Mc b��ݰ�PnϪYWyT�AJ��fV���|�5?�ǬA�$g�c8:������p�5(�߰�]x�,�EV�ϱ,qXP��V~}�0�Ҳ�c9�(��ğˬAO��,�Â�HEuΘ��b��&9@�����}%�%�5�f!��:��Â�o��e ��!(��6:,V�٩�˯�$��b�9<��@�=�v}����� �;�U�=o��,�<��f��/k��Ed�3ܹa&�ZS�� ��Gp�jX���o�Nq�l��v��kXXEC�� +w>�rjX��+$s}cSi^��"L �>�T��a�^�@xs�Q��+kpe�7�9y� +�=a*M0��5p�� $�N�]f�_�E�/HZ7}=�r��r��5PI�պOA�a��Cu{W��{&[�HҴ�x%RL8, ����Y"k0��طnX������.����� ���>�����7,�}R��O7,^v��>��oXh�+1F߰���ϋ>��n�Y)Y�5z��ɌI�^oXX��r��� �7�R�8F��5md ���j�bi���H��˭��� ��aa7��K� ��4�| �N/��$O�ԡ��K`bc��ҟ��հ��ۮx�s�ݞw1o��� �3 �#X|��D`�A�+d�+�_����+�߆��@v� ��u�^�0�@�J�u�Xiy��+ �>���:������x|�婱�#��`«S\)pE:x+F�׽�)d��^�k� Պ$�RX�JF�v�Y]�t� �Y�H���Y�^��� +Ђ7� +� /�Wa���5��z��&Q�ul�� ��*$Q�mO� lV��TU����1U��Qʼn�m���3T���O�g���t*�� �� 6�B��%�T�����'d#�$Ш8#��P~ۮ*v(��ߥg��/�P�+*�!RB��s�d} +�\�rd�5�)R��)�0t��]W�q +�Y�L� �[��p�@�����TS�CS��.��¤��:�����0�R�s)��R��z�1 KqJ�z�W*\�P��8��)�f�U7��H�����T2��Ia�I�܆ ��0}p�@R�uW�"E���"���Ժ�ǐ��j�7W-WR\�m��Q� u�^�d�Z�QܽQp�?�H�� 3�Ƌ[��ⵥx��A���'��. +/~�;�(�QQ��W���'�(B�E4�Ѝ$DA� +<9.�z��(�x�`(v�PP�P�_������x�3(�t��`�`ME[(~̡�����z�؟�k?�[��/�����,-��*/#�ː/߮���W��Ȇ�EV�%�ݸ&?�A�Kx��(�r��W����%^ +��E J�ī+�e�\xQ:{�x)*��L�jWF&/==̋�鼲z�����t�z������K_��}�+��K�������K��fl��+�W?1��H��~�����-�����0� ?Q�����gS�V$��xӳ�4I3�O�&�^l#, +i0#W����%���GdZ̠ ����{��?�ʩWjJ(��Uaq��7M�%/�ɺ3 �k��0>��'�L�!��/�5��������۱9�a������Hz�d�I w01h=JN�?������ }db��躮X�����=����=�]�:��8/�{bGcA <��&���(�� "=6FW��wc��8ss�P�1~�+�S��X�=�.�=�d��A�{��KL^��!k!�P���WN�B�\�ٚJ�tO�yG��;����x���"x��d��כ �xǓ٪5P�'P��D � �[c�Lv�2�Z��hpH��w�SR���T1��� m%���\����ps5e�m��(Q���"���=a�(��$P6q��N��[��̹��.�M]~O���8GF-�����&���=�����&N���R.D�G��d�z���KO�:Y�<���r�DO$q(y�N<�����n'-Y��N\'�N��Nl,�Np�����m��D}.91�%��8�\�8A��L�U&'������;���dg߄�&�wtsRF{Sm�m"Om�l�oNZa*����0�DsXw�d7��(�$���@��`���.Jpy҄I)�TRkIu� 2!��@�L#/�ʆ�T�Q��U����N� �}e���оW����P! ��*� I��*&KZ�q�%���L��h�V~<>�/��x�ܷ��2�B"zeT��e�a�b��8˒'2�N!i��AH�.H���*9�@t��Bv$�$�;�2�������d@�D��� �����@��]k��v�]l-3e�="��{���e=�~�,�� mG�[G`N:�9�!9�/2�F�`"9�w�{Fb�Um�e�YrD)#��X��)刚43�d��W6�Xf����n�<��G��v�����V'�� GY�L&x�ۃ#8'�L���MB�����e0C�l�# +C.���%*�H;[&W\֭q�pޘ][\��gp�"�h_��u�/�L��p"]� +����@� \��;�Li�θ�8Ų�8tu\v�2]�8�qi#>l��}�˪6��0 ٍ�\�r5��d#�o��K��R#�2��4ۙ�A#g�D��ˈ�fv�̫.!�� 8F`Ð f�Ri�t��\n��"ڛy�ϱ���%^D�3r ��8���"���8D?Ÿ3�f���+�E`g��"0ݙ++�ψT:�+�^=#�@�=�1o��}����YhO^V�Dth��J��A �ā���4�:��A�!t�4XwJ�!(, 7BxKê!�25���ɴx��ؕ7m�8/��|!�; ̅���X 1�Ҵi�X�P#�B�Z�F-N +ь� P-�Z� TSKlB0��B�`�x�����}�U! +a�]���[��"�(x"�� +� �u���Uv�~�tID�a��A��`׀z~/u1�@�0`J�UQ��3�΃Z�JAck'�[c� p ׄE�!W�@��@`�k��y�1�s�t�+a�� ��!1��� �!&؊0 [��e���%lw��=�Il� B��7��9� �\�?�M���-����Ɉ@�(�]�C�����٫�ͦ�����x�gs<��aF�tE�6�'��y�� +�!I� �����oc�,϶-cۤl� _u[�6]�C��� n*�C���.n����q�F��_�γ�5Zq�7mj�CR�9�ћ���@�f��IE���U��*G��Z�-���s�p�n�4�,��f��_7��M�M_T��D�w��o�r�x3�?��7�A��[���x {����oZX�u��f���og��<���>��K +�㈁~2�F)Y�Zbi��ø������� +�`��o��C� �\�����L���)��߇�ר}��+�}� +8�� ��`GP>zk>���|�N�v��o���J�!�!��oϩ�TD>�3$�[�1��JS7UW��x!�]��[,���t���g�Kw�7��Xl��U����P�O�7��o�������o�b�|���J���i,m�@��7Nܞ|���A>셫�v|���B>����{�ͺo*���p���7,����o�8�!_��o�����(sm�|�Gf�/��SH<|�y� +��[����|�5�R��!���s��P���oT��~���� R������>e���! +[���Aw�������o�2���;)N��i���Y�i� �. ��'�!+X�u<�� ��p�����ew8��=���v������O�9?Ѽ�_���D7��0w�Nj�i���>��a�@�p�V��J|+(���;{Q��3A��@���u�L W�V�k�P�����R��=\��ɷ�1�f!�.*r{9������=�X%R\� ��G�vAr����9�f���۔t��c=�������^ک�(C�9 +�恦�����O�0x�Ƃ����g��q8�Y�y�����L�%ern�T� �� ���93���uNt�T���x=�+9���H�Xre�!���a'������mJ�2��B������('�у؜j0Ws�C��̹)�Gu�Ɯ�=zȮ��p���?�m�BC�d��M�8��vX6�<�#jx�S�8%���)��3So�fyh5΁�<��\�ԯ�a��<��y�!��@a�rLW[�n��e|�~�t��Վ�dBT��P��F�?$��o�X8�s��t@u��C��Ӎ3�ρ6������!ԍ�s�1���tF]���.ƒ����C��r���r�t�ʁG�$�� +�@��ᅑ�!r���p�������:��uO&C�5ep��t�`b���CŎ�A�;{��dW�c�av�"u�tȠ�v� F#��1��v�y :�C�1 ��Yq ���� �n;���]�f��*p��+�(\͋A5��F��b�r��3�v�[�qr7[krE=�!8�;�����.'�9|�wtão��Q�*�'��M1 �x�YV��d�W�0���@ /�`��� �=M��jl/+`h�x`�c���`TNj�;�_p:��� k@�z�� {+�� :��$�y�����R<��P�����ԭ/pJ�Q���N��)�j]�9뱣$ē^_`,Y�!ޝ���s�(� Y8<KA{lz�nv�''!��\��xT<��œ/��������y��? �0i�L�Q1I�x+g��.Hyܱ�a� _����`/�����#=����5�_h�T�^�]w��;�z�{��2�d^v�o��艎�p�_��@��#f/Ȗ�CLO�N�C=�r������z-�״k]���^���z �Y�Ջa��ʕ�, Ϟ�t�G>lo{!����⚭p�^_� u�{!�{�͉��n� ���z��cB���(��u�Ĕ��� \$���n�+���rI>z�|8l�\� ��|��̯�v>{��>���"�R�@ɟ;_2���*Z�#?��k)*�˾�O�f���?��� ���{��:����� 6�pG���ªt��vABv �.\N]��NՃ.4 � �lsay� Ek.�5�f��no�'��������}hoAK|�g�����ڶ���٩����ւW<ѩHO ��p3Z8hAr= �q@xK����y���, ݱ��c�:�w�X(�X��}���XX�,4^f��+�Ő$��W�q�͟�qw����!�U�&��&�Qq�ˌ�]�`ϨW T�}��>��ѾVmB�;� +�XxL�}�U�}N��}&�3-�>�_ =��^#ɯ�f��;w���� W�|~��C��z���M`G��Mp =0se0�@������>��>��h�I�o��]�w��Ч�M@�}���K��Ƕ���y)��%�M'W�1ڄ;��}SJ�GBF�� H(]�kvR��&(>���^M�i�/��iB�죊&`�� �yh¾?�O�&�,�*�������M�>�}\wMȴ�\�������]�}�{Am���f��4ć}�P [�ǘ�� /a����B�D4a��ŻO#����@�!�Fg<-e�'2-�ⴑ/푒.� �Ӊ&��\ɖf���84���t��f)�T4�<��-�c��8i�� � :���B���}O���d �фvI�N�τiط�L(S3�,�F&�Tdp�/���� >��Kx�%�a\���5Z{"���o̯���$b��@⪕@"�J��Q �M ������2�*��X��|��e��I0��>�W/�D�-��I��=!��ْ�#%!s��QI |#�16���p�}`�� �^ݐ@ ��@��tH�F��/"������ +"p[�A�<bu�/��`6�l�Ch�� �#c�^���j}�V!�Jo�+Q�Lc!!�;�0��������(?ë꩑{x&5���f6V�O� `���; +�`�!��y���B�%Z�倐f}9� 8 @7��?�A��a�����qY�0��{���������%���$���1L(i �� c�8N����,"��hK��j��?��P�I  �0��c%����f~O]$jM.2jx�˒szZ����Ԭ�ې��aZ�8��e?S�Z;� �~�-����4ܢszazP�a�+�s�g���avM� X|�k��"��ObV�ct؟�'τԱ��٥�� +4M�����& +�`W�y����h�Q�d�'�Sf̪3�r�lB9UZn�&���4&,�0;��2�RJ�<�(GĎiDiw��iD)w��HiX&��yDl�'Y��q+D7��+�(��О�xz��K/ k9� +�s-�Ȱa*8���:B�8=��㙟�Lj�=Q������a�t<,nÌH�Y�̞s�����K�'�Ԥ���?R��n��tWt��r�ѯ���wZ RV�BԘ�j<�2�xpm�i���f�� XLT!Bh����L��j,3B�_�H^9D(�p��`5̒��"����5��c 4�CF�J&�,�S�sǨG��b��SL���":N`��� �1�Z�5�r�P^ 2W89�����0[ꊨ=�K蘾,�"n�[�, +64�D����Ѯ�3<�v��3��e75���4��v�EF���uLK2y������� ��Ջ.��ᩞ}I�¶#$~�bxѮ�� D�Hk��V���X3y=�Կ&��8?�Xh����<����&1�v���XX J�>���O��5(./IZ� e�0IZ7�j8h� �h�q +V.�ߛ�3�a�I첋�mêof˾ � ���f���#�U�gy�eA)ĒU�l�6?iw���ؤ_ې�ut�’Y�lͶ��\,n�=Qa�!4�a�ٕaljk����cBس !�y'�m��@̜_�ܵ�rÖQpձ����Jô!U4f�l�_h��Z�<"��9�@�&8)��7%���E����2��Dn�)�S��m���1E�iix�0N�% �Yr�h ��1���I�؆��� �`��4��s%�Ur�H%��G(׆���S���P�˯ ����.�j�e7�a|�?��F�5yWxN�Np:�Yj�B<��Xۈ�pnx���۰����QqNP +� �bޑ������Ys�A�[@�Ê!dD�6I^�#��.�) �� ��&wD�)�A�$���V$0�>�ѡ��v�[6�mG^�(�.0ya��D��$����&�����`~�. ��q�u�e�,ӣ�$lPa��3\+Jǻ���!�c�Q*��b�1�������'?�"��B����>}?�YQe@%Q����6�\Ӹ7��ՁL � 3[7æ����i�M0�ӗI� ����y�l��z�R�J�鋇G*f�H�%�DS2�'/�&S� ��Q��5>�)�a����R�jHA.Ȍ���`�b�\ b�Vp�1�Y����u~X12���1�Qׅ�Xv��hz�q������⪟�h"�%m}�9qEf�o +�*.�I�9��'e&�e��:F�c׆P1����+V�_1[��U�0;jXG�~�rMH�ǩ�ì�5��� +�Xw|�!��0�X���^7�f���[*��2�5-�� -����0�կ�A� dM[$jO]8�tLV�7?�����Ik�&��Wt endstream endobj 23 0 obj <>stream +Ұ�����7'��G���`���e�1+����Ԡc�'����g��X��8!�<��2�������ޝ�SL��ɭI�6����� ^�)9��S����+����Hh���H�ì�V����jYh��ՆR��-J�]~�@��J%����%vM_,�'���ɛ�k�s�Q2-H-ׂԲ�.�J�L�ԗ�u���lI&��� �\V����� �����d�����'�$p��#� RpX�29�P��D�Ty ѕ�%ˊM��4�g��&(�quYv���ؐ�ILC�E;*um�Nߜ�9&�q5�~t�4=�<ؒ�n�R��x%���̯ � J�J�U� �I����"�s����+;g�g��:��8%� c��ા���L� � ���&���l����T %���"�$p�%o�cVA��k�Ψkf��edB�XA�C&��1:�p��Qk�?Ж�hJ]�Yd7�Jt?�^�IY7���svc�Pߛ��Ww|�oE��#� +�씾Fܖ�6̐�`zM.�X���ߓ��B���������}�9u����X�L`���w��c~P^�p���v�O�p��0�'� 1�˄�=6a�nӱ 1H\&���谓S�xAB� ��8����nP*Լ������}��7�� j���}�s>����y����{��o�q;G�n<߁��[��:��tΏ�L�'���O��}�c��O��X��`�8^����=��l^��㲢�wN}�;�s�|�� }���������pBN�$�L���"a�c��Ӽ��$���O�&�HL�%�L�'����;��K@�I���k��q}�'�����݇~� $�H�I�ۼ��|��:��4�����4���M�z��v_�x~߹^�<}�z^����9��=����x���H}�1��5�������w��zM����v��o[��[�����;�������wz���s�o�mܮ{��i��{�s��o���[�ݴ}�^��n����n��M���|׸�i]�u]_�@�LB�����k{����i��s�s��q������s:����=L��Z����u��w�����u�y^�y��uZ����i��y��w>�s��y>��:���=��6^�t��y��yM�b}������Ž�{}�9m���w��������<��9������}M���|_�z��:_���o���=�������<����y��s���X��k��w:�o>��=m�1��uڶc���y��y�����X]�;����ӹN�b8�������y|����������:���]��m�{۵��:��8O�;���z����c�]�}�)�8�ᱝ�o��m>�)�{,��x��p��qZ��z,���M�n�ڦ�X �`�pގ����c�} ������������y�����o���Z��]���o��u��)�7N׽N�=�s��{��{^�c}S����w��w}�u��y;�o�q����o��)�<��v�v�����t�ۺM۸]�M�v��;��]�m]����1=f�����t��v��7�X��M�v_�v����;��y��{��M۶^�n��s[�u^�i[�k<����x��}�vO���{��wm�w^�y�������������뼶���t�����8_�y �o;�qۦk;�뜏������c�n�蚿c<�߱}�uz�s�k��y��q}��v���ގռ�Ӻ�����u�{��������<����o�m��Ghێ�:m�xO׽~�1z���~�{��w �G�;V����1���������XS�����v������{�mܮq�o +4�����6n��8��h���w��t��8O�8^�<�����7��yO㷝�{L�sz���Ž���8��N�8��<��<��1��)�;���M�r��c9^����u,��:��s���:�����ܮm:f�zn緝�������;��1���|����s<��|����X��s:�k������s���\�oz�s����s;��<�i<�s=F�1��뜏�t�i\��Z��=�kۮi[�m[��6}�1��o��[���uܾ�[����������|_�z��},�����4��vo�5O�8~�z~�v]����yۦu��u����������zS�y��o��|��\��l~�ct^����h��i{��:N�v��yN����>��5�o����i=��X���]�6��5���]�;��������5��5��t��8���M!�{���[�qZ�y���=vӹ��y���N���������m���ݎ�t�c=���M��M��k^��]�k>�k޾%=�I�����������<��:����߹��{��=��=��nz��������{z����{~������X̾c}��bz����^����8w��[��9�Ӻ�����a��:��w�����w��k^�c���� ��� v�c;���w�c���z�m��c��鴍�8n�6���M�<��N�~�9~Ӻ�߻��;}�y�m��u���ܾk~��]��������=���M�{��8�k�y���[�s:��9����vw�q����i��w��w���}Ӽ�����|��5��w�����{���ڎ�u_ӵm�x_�v^�w��k=��t�ױ:�{��{>F�|���>��[�y������;]�1��i{�m<��6�ӵ]�xN׸n۴��9O��-A&a��훿k���;m�6N�9m�d:��ݾc<}�<^�}��8����뷾빽��}�7���i�����m������{ 2 �c�m�u��u���;��x>F�n[�w:��t}߻�۱]�vO��\��9nߺ�۸}�y��w��t���N�<�ߺ~�m�5��^�t;��X��m���������7�����X��|N��{�����4��;��蚷�ݾcr�>��ޮ�ح�1���;�k��w=F�}�������@�{}ﻍ�t����w��o���X��8��}}�7����{���������5N��{�c6��t�w,��^�t��w��|n�{}�=���M!F�5O���B̮q��i{�y>�i[��������{������ݾ��c6]�u�v~�7��v�ߴ��7��1Z��:�oZ�ݷ]��}�wΏ�ꛧ�LB��w�����'�{��yo����w^�c�����u��v��m�5nӷ�����vS�I�{��{��w������������o��X��&�=��1�� �jG�v��zx��p(�H�5y��3�8u�IN���[� ��g�#ebb�+A#+��) ��%����:� �LN��X?F֗t�m�L`bdTi�h8�� +�Qn����7�c�� +6�Ay��^?#� –teӃz�Z��HU�AN�mB��6��7���#b�>?�2������&��>Y_��~�ɫ(9un�uFa��OaZ�)&�E�l�^�O"��)z����,�����ab{~�5qGlEW4"��'�fȉvYn�1/8uJa�� bj�t�'�C-�U����16uQzMܙp:��� *�E�uL��:���9D�/aR�ܘ�D�A�B�9�$�&�����0�%����=L� �0�Fܔ�D�~|Q��Iɉ�O �f���5ø!U���kdQ�"��I�lC�8�����-U,ӣ�e���4BÓ�5`����Q�#�g��yK�5�6?������|��UH��0�`l�鑍����I ��ɋ���{�����_6|��X&9�/�]S<�$Ɣ2���1HZ)8)x��=���Lf�Hh;�,�klL?܎�vV&�%.�߳[|vu��/�I�r"?�HBG)�� LR%rOޜ1��0���k�EO��і.C��V���M�9}� �ߛ +� �c������ + �ɞI쎮zK'/��8W��yFj�H������4�M � ��������qM(�Ό�,�R M�$�. 6(�vқ����Y!�$��Dj�A���U�X�=Nd}��+�Y +9GW�c�7��=I)� �-YG�T�E�T���%��Q����W�T���~oA�߃�:�Ta=J���Y��x�d�r�� ��z��&��>b�� J�;@�?�i^v�Lf�^qʝ�=�`Y�G$ֿ��4��|�s����b[p[��e � ֠ӑ� �Z�d�S�� +깎�L����� +bj�B�S|C6�>��G�E�r�^�-���(�f��:&�d!���?=�� + *Y���U� Q��`�t�+V����������l��� ����C��$/�1?gXw��������� 9�Gx4�B��� ����U9M�,x�wĬyX� +S������(�W��C̘��� *<��g���H� Q+�G��9Ј�(�بJ�1��Cêf��� τ���Z����]vh]�R�je�ĝ�A�1P�A��J��������e3&oJ� .�!y�U"rFY�Ώ�=��U�� ��������3ZaR:�4�+��Ó�9�$yep�Ê����i�����)�F��i�J�_,$��E�)uAؘ�lD�X���=cշ ������?f���[>}��D�4�fW�������W��G��/����n�O\jIX&8��x ��r�\8�|�xrM9�3������e*�f��R�����>S[�!�=�ʚ��Z��.*�sd�#�z�F)� +f�=R?S���^!�:f2�~�!�x�Et<4j�AJ�s ���,X ���bT���].�� ��%�3J^$3(�����ʬY���jͽ�Շ�E�nD)���TV�3=+x'�*���0,J ��p~S���P�Jŏ5LTJ�����ü�=K,����I%������a�p�������� ���,���DF�w�*Y7̖��(!'x�g����1�H/��r +攐�0�|Ë2����.��[s�k*�c�1:&"��=�?G����]�bj=X�G��/�D�� ��L�� ��4��sv=ؐ�DnN^$�&�� �� +��f 2�/�$�ޑj��9�+;(1 � �����FGֈ +�*yg�g�-u���`�kv�=�3<�/Z�!�j�YZ�D�|��=�� +G��e�����0L�V���$q3�4y}I�O#l���a[Q����ĺ�nDbP]`�#����+#B�6b������o��� ��fH\`|pI@��*���5�>�sH(�f��>�}z��a2�����n�W1�"�7�����j���I�0S��P�"�zfG9$.�_RMq��\��A�[~I��$����ۈP?ikìI��쩫� ����'*&.�b�� f*��d2��U1N��q�ʝʀrs���G��g�-����̥.!�U�����Mѳ�}E��蹞% �H��A� �a��:��aQ�̃�2�(�g<[sU�+N�Jd�9y�:��d�^T�IF�G�\h[��%�Xr��5�> +�m�F�������Q�3au�dV�+~�n8g�q�ڠ��ETN}�|�{~_z�0�X/�Yr +�������ȭ���Êw~���%��� ��~�r +���c��Qo +*KG(�J�E�"�gW�7�Z��'%�%G��9y��\`Q[N�ξb� DN�<�lY7��Ut��Mo{N�M�q��� �s ����̂'ꌂ)u>���5Lb6�V��~��פF�XPv\�� �Ȱ�䞰p��.nx%����!jH^jM`#pN_*:'N��]zRoN0�uR�%�@��O]_��ì���iX��䕂{vwC��bYU���]�`�H��,Rsv���ޙ�:F�Aukz��N��������F�\L^�Le�|b)�ڲ +)3�X����F��̣��;��8�G%k�a�j�A��"կB�%p��SW ������� �9�;�*�W��4�)��W ���n��}A��OHu��U�����b�Y����d���1�������o��]tU1K�*���qk���g;N.1EUfP\,;��$����_�qFу�M�`����,$N y�Y ��M�sB�f �V����7��ar�/.��KlR_T\R��ozT1-����r�u��g�����$dO�>��r����ļ�e|O�]����哔 +���Y�ZA�vGnN��H��K�ه��s���K��a7?�p3.��Wm�C�"+�1X0�g�w��#���ӛ�Qr�pYR���#.�&.����kz]zϱm���#�,6�"qQ���(�]�#+e�����?-h-�������u�!������+ Vv aƇ�I�)~�A�4�ɁuA� +�I��k��F�P|�011���ŵ��S(�(�V���J�OӼ���\9�t��s�0G^5����.\��lV�a�'�K��K�"�ajD[���V��BW�E�c�䜺2�&��S \T8���Z|�. 7H[ 1C��<�D�qzMr�oL/*��Q�.=��Du� >u_zJ]-��W��1�a�"�k�z�Hm�E���������1�fXe��蚼�� *f6�7�$+�� ���� +ѕ���n +�����~ :V�A�7@)�4<�I�� �]�2�Ď��C�o�N0!���aBK���u��0�� +.a�~?О�dO�t��,�h�XԒi��X����3 +�6�6��i��n���W,� �!�-����g@+xH��B��%��~Re�*�IuV�en�-�W�� V�{v�ȪD� ����GМ_ 7Oܔ�<B�I��<�S=׆�1nH%�����. +��>O(U.��C̭�hH����@=՟W��i��,n�B��H� +�AR I"�ˆH�+Z�=K�8h����?'��7�k�$��ݖ��KTR}=���8��*6&��^[�V�-;*�� ��0��1M\<*��M 1�� �`��쌶8�4m���^��7�����o~S_6��{x�c(��^t����w~W2��-����_�\�Yz�� P*������_fN\ fO`(�(��F-�����2���bju�YA�G��V)3�&@�Qe������h+e����N�,*��cd��������Ľ���岓�;�l-� ��a�l�i����h~Q�9L]�ƩK�8y閦���g��f%ˀן�7 �ֿD��� )`x��ea�Y��)}eǦ��l�� ��F����n�ma�i�࠸ hM��Ӌ��yx�Bn�M��F%�]tL���9�"jP��Sw6��sF��7�#0���@K���]�RW��Ap%/;O`^3|;:��?O_-?%�����^Tܲ��'��_������䠺6C(�R(�kh9U��g�� [��`FV�����8L`�'x�d f�_�u� �?��V,�H+�y�OnS���Gl�7� +;������=����@�A�����z[sʍ*V�I�dNo�N����̓���E���eU� +��U�8�U,J��a��+Z�I�td6�,;(��1k��Q�:Pq�N��T��(�m�P1���� J�#�&צ��u��3/�=��۰��z&a{����e2[��#�f�@bT�X� +[��|�m��'�����̓��C���|K�r���o~Tq�. +��QŴ"4�+J�2��WE'�SC�G�!�b6��MSt�#��$hO� H��.�P�"v���,㋚kĩ'(�_z��N�����>��-+��si�Fj�������;���ug�k�A( �D��.#2l��8Ț]�Sl#J�l;:�lFZ���FPCʁ��U�szStPo�Z� ���V�e��A�-ue�%um�)}��1qItN^���׃-�+���6���t�CF�2�S����J�t\����A}w�S��:��I�[�Ϡ��U29��8<�4В�4̔�"nL^��w�ٰ�`���!ʊ���0S���a˶`֜^}�1;^�3e^�cۈP].����*��Y}�첣�ozڳ�ւ ��(�y�DUXּf�d=�yǷ ��U����ӫ�w�똨��U�d�*z��ʥT��J.��_q���1MO��IJ�4|��.|��l��1d�&��~�Gi�����a�2 ֿ�U�.|��� +,����e�����ܛ^u�����#��bIu>��4ߖ<ģ��<�PvP[9���GĖozY�8U^"��-x��2|��4|��2z�–�*!=��ԞYt��ɭZ��Q ��Q��|Q?���?(K���1[RVm������(k�������hƂYubn�;@���g�oB�_^�9?ky�T��hWF�=�XrRi�Xr��:��_�����3>��&��y�T#�ٲ�8 /�ձ�)����,h�EȨc 4Oo$d\'�qm�9�Ge�bf�c�����aZ�G�Y��4��s~izTq��8q%�8a5���"hK`+���e����TL�s���c� +�c�p���sl�k�KxK_";$���N 9��€rY ���>��+ʊ@d�S�W%��0"�ֲkrk~�/I� ��!��P�AUK.}��)m���LrO\�t����%B�# �� +����]5�������6b��!���8ۊ�.�(�چU_X����-�緥��ʂU�Mh% ��sИ �`+��P��%�;��>�"pK`jLݓt|��kE(X��� �C�"�5qg��o j�:��G"�d�@L��T^�0���W̚�G빅5V�5�2;���� �ܞ♟�|+J�3C'/����O����`@�u���׳1y-��0�� �!�Tj��ϲ���{�Y�؉z����!4 d:u�@O]��M����R_�7�uY1�UfEW8"5 �Ě}F���sr�F�h�=��0�!�'8 ۆU��EJV�)�Tg`QK��~�H����&����uLV}�T�F���P�2:�Buk|S�O{��c�� +�F�5B�o����?ɩ0%2�_"�����y��~F�7h�?Y`�1~�d��J��޵�A�ԥa�H��������nG8��€S+����f� ��i�r~X�����Y)x�`&���֮���GKRN ��d̪s ��� gAY2��o$�����젶��(r-H�䞼jzW.���Z�P6�"+�!d��P�>�,�hĎ�G�x�Ć�J�W���[Y�>RP�-LD�,�&-c ��_���%w׀[��R�l$4��r6��*/�۲ �����p� �Ta�c�p�� V ����2{�mpL��Y���?hĚ�Ʃ� ���FP֯�-�P�;�g����(��2�-���ޒޒ�Hn)KNi��g�yès�h%˂�?�̆1�a&;�,��t�8�r�A�fB�wF|~�T�,X���� q�Sp�^�"��ox\����JF"�eC�/ �+٦W�_tV� +c�A�5�hX���.��gB�3���٘�� hM_�"��TFϻ� � '6�.�,yqЁ�����z&����VP��R�s%���e0�N � ���J.�c�a[� ��� ���݆�J�'��Yr�5ӆаN�� ��r}J(0'�`%J&ak~[rQq�n:��EŻb�"�������l#Hknѣ=ӆQ�6����R�q{� �d��*��$��E�T����x��q~�q-�-�[!����̞��3 ����� �VH�=ˆҮl��dO/���!��^ A�� ��xc$�Û Vi`�Ӛs��X�g��_c��hʌ§ +� ��c��l�Q��ܲ>�ٔ[�� +���H��H�Y�� s�5�nB�����qD*��W���~ �J��m�Z�D iT�Y�J]1¥���:�p��������i�����詞m A�=ʭ7��� W�E��unѳ��I-�E��9g��аa�^V�n��d��#H��$u� �a3����48���+^�Bc��A��� y�ֲ��9�Wv�`$�v�9��a������5DR*����5�ן��b�i� +Qk�Z�5����\V��nã�&��[pOa 4F^��a���җ5�p̎Z�aZ�ЌL^|'�ˮ�գԖqzѰ��%���;�i�B#֌�gk6"��^��R��F��r*,hĒEhO.��� �d��bn�ƣ���-x�yM �&�ܒe�P�i�L�i' +2m�'�*'�Q�����LZ�=b5lb÷���gi�옶2̈�|��R ��xí9������+Z}&r*L�+�[2 +����O��P�9O����;����V��BK�In��Pj�ԊAК�.�,i�؜ߕՏ�M�6?j�'��S�\�9"�|��2;+����%��?K�7x�~���m8y��E�q�j�I��`�����evR7���b�� �2���ǧ�� F"��etZ!2�m�Ȍ:V�U�/���h؃�T���Aʨ� �_>�0>(8���i��y�F%�5I_��:�=�>�S����=�*9(1�N�����K�9!�$��<@Q���``�[�� +��a�2+D���a|h}�B�����E�1m���~��Dפ��vy�Z�1� ��Y�;=l-h�g�iX���{I�g�m�Aqi~�p.8�"�Q�A�QV�Y�ܒ������m8%� ��$�#�Z���!�`���W��%���T�#b�têDJ�@�T�3�~}�Rd�Q�� �� x�MhԯoK��@�(3�R[�Yn�/|��>L�Y'���"�_�3�'�� +��3u�A���)r��%��=�f@k�7Ē}�m9(I��gK�1T�M.`��'[��M}����G���Gʼ�'ʼ�'�l�{�:*�^-��b�q&"�~O�Gѓ�S�`�>�?>Ѱ�����`�����A�=̜_r��r�T�O�ߡ� ����L���]���� kAWcB �*��H�&�����}���m�����%vK`$;&��#.�]ج�����eT>���,B�/�'�ڏ�f��LrO[�"�[;Bq}�Z1�r��4N�{�UB��m�W ����`�{Db�A��9��6L���0��4R Y�~�7��~Wq -yFPvl�� '�Z� �hĖw�U2 +�-�e}�� +&BQ�B[`�2��c;MX38(�CT2��J�e�J��>�R�E�����l9�̖K|E@T�FU7c��#j�Hd�����ʣ��M�d}&�*�q�:9�JtN_6��WG�~y�Vp�(r �?TF�j>�v�N0�" #8&,�s�����������цՂU�e' �0�g�`�W��ԖMx ���/���@ٿ7̚gvX��� ��'���o���Qa?ʨ0 ���%��&�^"�0�홃��p��0�!4b��0[��U�9���&��w�Ұ��lX����}��є�H�s�)y�̞gD����vsGg�x��kŧ���_�K4jÂ�RB���#|�b����^;��>y��Pz�L�����KT�������������#lN]0��1�A�(���+N�7�'xg3��x|�9�@q�..�n4�j�<�j�DZF����!v?�(p�&��(E# +�!��G�R(�+w$��ofX=ܐ�j".`p`}03H -��Q�}�zav�JT� �t�flPi�9�:�-qMx<�>��qf ã4�ƃ� � a�bB��S�-�^�΍�4]��S�&rRP)���0�Г��1ɂ�!+'@�7\������Vz�(��C�-�+��a��gĀ���<���R@�D�Gֆ�L�O���PxI[!����`� ,0�lF\%��/�sL 9-� B ;2� �yTP��1�A#D�H(,��e�B������Ƞ3#*���X�f�TmSc*�ՠ�A��,�c^`/P�������e�٨�p�aՁ� *D�MD|?@��qzص�"��'CM#jO\ �#.1CY�� `1&��Q� +NQ�Kg��`������A�����0��%�,�ԉOG� 92�8��T��c�B��J�8����g:���X� �� 7U0A"- +/ˣ +2!' `ND�["�,}-� u{��.]�#��.�+��Z6��в �EF�~I +�g5(`��� ��6�R��H/�1!%�����Î +h�� �ae��F�&P�qRЂ� +�� i++��΍*�[�(�#����A��|`�a�� 7�p�1��f�B�l��݈����@�A� �mX $�@I����!�-�A�M )���P)5�온J�G� ���ܨ��F�R~�F ����J��3�� +<�@�� �@� ����4*����B02����C�F��)�Rs!� �5ɤ ,�# R|�.�IQ51֠�ءE⦢Z�����Sׄ�S�Sm���V���̐�P�QeS*m���^�F[;F%n�܏.`�APr;� m/&�lDXjh\ Ё��� ��WhM]��ƕ(&�(Dac����t�J�6̜(@]b� �i.�a� �� �YlhHq��䂖�'F����AJ��n�'-��и� &�Vٍ+#V���:� )(Q�ofh�A�d�<�|h��i��NvM^wG�E���������1C��HP!FȁA# T���Ic��=V����@���D�G�[~����� +XV\y� ��c�n���oZ`��nbH]�{A� +��s�J��$!�L0I.ݲR��*\0��`DO����׮��ˁ��>�p,@d�C�՘,�u��䅲;���v�v���Ȱ� � lHF��QA��=PlPB��|xe0�����UP�D�g2��Vд�n@����dH� w�A�Ȋ@���J����铰5�lJ\l<�4�pX����0�n\�93���� ϱq�f����{�\����R� �Ԉ�, J�`P`��M�tZ��86Q�� � ��@0�r\}���� D��%��Ȉ +�n`�~�I@�� Pz���<)H�i�@�a����i��AJQP�N�0�рA$ ���^@f�ԞS�TF� l��\@�dlf�2�~0����#L�> � +�a�Á"҉��&�u��� `��6��.��(�I�H�pD�g0�7F$�-< +@:�/Jv�Ev��� jNT9��qVН�R�Y� �� ��+���"=P V����ȂPs�J��+��,��Q� �!��� ��+?� ��2�J �frd��azF���Q�L6�\\d=��QE�ȸ�knh}�-uw�P�[r�끌2�~�i�s`l'���Bp2���Ɋm6�pa���� G���������e� +37�H��#r@Dp�\� +��z`��d������ay0sZ��#�BN&5'��)��@�V �$�O �#������MǕ1'��`D�S�� +bLPX92} ��R��LI�n��Aˑ龁A�A������T/?�`PP3�zhY ���A� +k�s�D�O�Ό)`Q� ) hRT%��yz����!�㪞�1UA���#H*?P�� +���BjX{����U�ޏ�]��L�냎+`�qJ��(6�:hyE����� 4M��������BH9:�᧣�F���Z`Eh������� �GVN1 ��P�7DY���Z�$(Z���%�G�0�&��z���a��ʁ�� {1A�r�� h2*�� ]�S"�pX�9� +�Y +��8! ��`���@�V�lV�=X �Ȏ���R��5�$���Iw �m��b{�dL����e4�v� + l|���tڊ-)L�V|�̨��f��55��3"�"�� * �h�����Ql�f'AV������x$��#H2���`$7C$>� 2T�@ ��@I�S�R���z��E� ��`��$�F a��vEPA:-�įH$|?0���AL��� ,�-&`AgH��D$�$0BH +A�SfhPa�����dZ/ +X��H�9�3`�Q����m+:�4`�q5�I� 94�Ge�lAe; �+!��h�씾􌌪 T��\Xl)���9Z���;B}KzI`��l��c�I��3:�2�0u;�<}'8Y�McS�B���e�(�pk�7,"��tFXLHO|DX>>P^��Յ[ �oi�%�+�R�� �AL�-+C��0�ĸ���ݏ-!Ì�(£p�yQ��N�N��,�2D�pS��ȋ��V�����Q<��E�Z(<$�jZlH]6#/9$0 fRX5�r�`���@I��@�l(D-�H��$h�j����-uc40�|���f�I( ��H!pY>`�t� �H�77��4"�+����sd��`�5&ԝ������ �,�VO��EBW��0���AM���S�*��� +��U3*�lhLu��Т:yF�B�f� �� +��FP24� �U8N��\gG� +;?�.̈�JtG]�<��ħ)���ZLT3�y�a�����SԵaw���#���� �S ���R��Q�����k��K&x����tj� 둅���U)J� dTX=��a ,hl\i@�b��7��B���#�02� �>P�s��H�5$A�jfH�h!��;H�� /(��� -�f��*,�0h��UA���ň���QU��F§�{� �Ir8(����@��Y�S;Ǖ^�Qe,�j}�����R ����Ť h��!�`TY0s{������U��Bꁑ� ��(�;, ��v<0�D�S���2�-���Ur� �����G�"C�N\Lq��� �����o:.13��K�D�� ,��K!�%�� bbP�74�>�q�A��F���ݞ嵬�k�7x�a�=� XfhC�!ʢg��Bx)�j�i�.���ی���Q�3r������ +�@n� *�!RWP��Wơf�v���A،�� e)xA��ƶ����s�ΈP� 9*���<�:5�&p9a�@�ԃ�TdH^h>�0Ј�`zNp̮�Š��i$�#����i:�6�|x]�q��%y����<#�bT���1�� F�͆4'�@9:%PrtV�2T ��32�2�rlY�"dE�`Q''�����ohP�j��6̘�1>hX�״e3lr{H�������dbDMpq��e:�x�-�`(�����.���[6�jZl/@�b�AL +m-+��Ԙ� �aZ���kv_x�� H%��-���cY����`6&. ��e�AŴ����C ����`#���fF�2*�!�^D���1�aw����E�q�ΎL�=�G ��ї������ :E]dt���F�ڑ��( �pc#�%�J5��s���}�5=�@�ɑ%"g�EB烫n�U��㪂RdG� ;F^ +36��pr\a��b�-}���*AAp�J_fn\Q� +�X����k8�,�rX��yi��UȹqE���$Ƥ�X&i�2C�� � �["�]&���`�W��G��\�. �Z�� � 8Ah�S8-�� +��� +!�ă��/?R bT`i�W�N�^F���C뤷�]�9ye�M�����-|g]gV�4ܢ��GjP_ ;J`.;��;:� v:�b:4�8�q��sjL��u���DtH_(����a��3^ɸ!�ܡv���qe��b+�J ����C��K�6%��2P������qC�R��B��:�(����b`3��`�dF��C>�D�Ռ�MtO`�,��ԝ�%���^�GV��� :�8�f���=�5u+����sr`i�!}e�%}U�9��5�.=hXh��H���6�u��b�K����)�&�J +\���S� Qc�֕���bXN�!�A ����[jfTu@C��@.�vxu@�"j �~�����ΰ�@;��s|pi�y�蘾l���W�f��g��i4�(�Ԡ�����;GG��c����������k���5����g7������}i������� +Ak�J�5�4��G��Ec��(��ǫ��Ěw��lzeB*��7%�蚺hJ`�`�l�y�Y���v`3CʂWl`hW�I[��X-��U�)qe��xf��5�)u��-Z��k�X��B�������� �=E�~\�7D[��� V0;�t�"� 4$n�]WD��A�� G-��������*���pS�� >�9ǥ��c׈�җ6O`p����B��)pfH�99�:Ԕ�.�'y��VLP���#.9�.:^f;��A<ܐ�>ܒ�Z~M�іX��D�xT}�i�`ۡe�̉l5)�x8��}p������E��r����`���Ũ�`+�*�s�����5����34�*�;���u�8��5G]|R�[�[�w�5C<Ҫ��"~8���fW����n�����9��l4Ja�6��pE]:B'����@�!�A�c;�S��=�v���淦w5��f�fG d|�z5�X�Ѩ�i0�D��*�s�Z�E�9����/:�8'̆ )�F��=�"� ]��A�����3�#V�2a����y�I�)�g�$���_�Z�[f�����a�����^�����������xx-��9y-�~lu�q��`��SLCL�*uOxL^��w��Ⱥ@��E�&�5�c|O��p���33�=����f>��[.<�X� +��#����"�%���+��u��k�!��5�dJ^!lL]�S�|�S|M^�%�KB�u�Qq ���9qK䜾#�'p�*��f��Ռ��Ǫy���bߑZ��a+��8%7%���e^tl���Ej�n����E����e>�@�~l���0�%������5Ħ0�������������s�fK_ Zr`Q�ف%d��tjTu�q���7�A'ɋ���5K^ :N��sl#t�G䊼. ��A�C ɋ���AyI���9�Վc�Er��Iܚ��Ύ,pfHi #*���M �$��;��wjXy�i����l:�FzF_n?�:܊�X|Nޒ��˲��Cؔ��*�����v�)q7���)*��ب�P#�J�)q9А��Ύ !pH_����7+�jH_hLޔ�t��Æ�QB��,�w��i���A����������m��NtP�1*���"2k��#u���S�D�*x��9B�X�-�ܠ�T ¶�� N��{^&�f��Qa�{#R�"nH]$���ͯ:� ��M�%�;=�XzL\>L*X�' +�;�� 6�hC(L/��F��̶`Ts��Ɋ�G�h��(��4����+8+yf����)3�H�f��:���YvQ�L�g��`�1�<ij5�h!�l����ţ�|n� dѮ��%/�s<�m�����Ok����;�s%�R�L8�w|�Tt�?���J}{6��Gd��+V}1{��a�/��O�gA��T|b��%nO�IOI W�ri��8�%��A}/�4�Xr��Lh���q�-�����%"�d6�/�eW%���gޏ +)6&��������bb�<۰\0j>�����M�9���v�0J�x-�Tr�$��������q��d�_5L��-����`q{����[!*���A��Av����}�A��s�Z�KevH�5��LtO`*8�8����9v)e@K�cp0Dbi��3�SP*�:���.�B ,�w`�_6Yl�\������)�J��z�#���AN�]o� ���o���6�\�A� :Ě�z�2�1U��XF��?�L�X�����ܫe�^���~�9S$ম�B�M!�6W Y�C�2I����664�{C�ԥ&:Q�B�)�`���ǭw������Ʊ@�ń��ȅ���%>[�>E"�@�넄�T�+n�" #�Gń��d�ef3��r��z���GR��sI� B;ًn����O�� �_�!ut���;�)�aPAAhZg�}��U(�s�,�����_�z��/x��U�4�x�����G�F�i�N�z��x��:ߦm��3�QQ�X�&�d�_t� #�D�s��>��~�s +)��d����P�r"�ft F���H�tV�F���a�� �|�=r�s���}Zƒ��+H ♍��[a�TQg��ӽmfb~�Jw �v* �s �RB���k �'9R���.��yq0��֥�Li��= 3�[a a��/� H1al]s�О��Y��Tqc�,���X�e��=н�_ ��@#��Vx�����^��D��Я���K��Q�И���_C�� Q�V�%�[{c"�y��riy"�&��;�.��%@��L��� +F���=���B��F��F� �S��#�~fhOs�|~����]sD��T/NJpY�u�0�o�� |pQZ�`�/��ò'��$Rk�� +>inDF��� +'��1{��㮮Ո�"��XU ��:�C��(ɓ�f@�� |�V��J��)�F��C@�\�mN���skf!������|��@�xܠ_-qS��'�Je�=�`!t�c�#*���V���׃�|�w��s��q�S"�n�����~��4�S'��$����j��ű�%ʇU)�אl�V���t"R�<˙P�?ӉYh�R$��QBqvP�ͼ8��"�I��4"��zm?_Ub�r ��sa5A|���v�̡C�����G�.�=�*�]w݄U1>����5��{�Y�@�;v�����[�څ��4&�Y����͉F���Xj�.Õ7B��;U��V��� +�=�"�Nsc����#�O���sֈ��܏��z����Q��[-�����D�k3`a�a;~́��.I�D�ƴ���(Tz�ɖb\ܰb��R��@��KE �쿽�������X_��S�Wg�y��'��@�C3�>��wS��8�t9;>Ѥ,�9�Oȴ$�����?X���V�Y5!�q�.��w�&�X/a%R�}�|�ʽ��{�l/y����"��L�3�Li�B��rh�s��O"F�H��[�Sju['�e�IdxT� jkQ���[(R&Pt�qTR��� �Sރp���,� +p��Uc^tv��7�">8�0�3��>9���DP�EXC��a���~ +��0ӗ,�w� ndG+i��Qw!� ��G���O�._O�%|��t�� m�Ձ�a��fr���(����'cyPr^�o�Y�:��[�E ���T�U��j� +��u�/@�����(yb*�S�%�F�����bZ��9 ��g�&�6��M�#��:Қly� _$�E�'A��g2?�.��1$�]���/%���R75������=�e�u‰�,�|���7���me��#`���q�9�[�J����8��`�I3��E`b���E��f��Ҍ~ϖ�{��[4�{%�Ξ�n�؅�`���Bf&ϿE7��7��׍��:��HK�Kp��RwV����_�h��FʐT]�gt��;N�o�j4;P� +q�"�s"����f��? �T_���0�b��>m i|B`}y��&�.�!l4���ȩT=Rqb!.����+k� �F�&L�� �h�t�|�na!��DŽwʌ��QF�l'�C�pC\� �����w�x�[����N%4JzJ��I��OخHʂ��K^��L�� +�#]�Q�OJԳ�;x��6;Y�5Jf L��Gz�bL�6.]~mb�3�O��wO�q��2��oʹ�@ (�[:j�u���i1~;Gp"��W� �(\{� �yق�+�~����0_�³�4��i�12It�o +@/�hL�}� ���i$�%��q�:��u׀U�٠��U�+�,DK�儑�Wt�x&P7�&<�4�߾����/��{j`<�D�DV_�O%�u�7/dp�2����t7v䄣7+a��1b�{~y.E�S����VBZ~��)]��qŷ��hE���� �@q�}9�mcE����/�����1�b�"� �� +�ɱ֡Y,�E��D��1_W�_��\kzm���R:���u0���$_�F�!c����忛V���}� A�?ټŠ,�|I�s��O�p��5�ZR� p�G�mdR�(��Wй�UB�gٗ ob&�B�$ �`b4��|� r6�g,�D�z��"�]<}A;�GlC�1'�|xrV�<�`/7�4S�6t/���>Ǜ��M�P����D� ��'��5,��:!K\��<�����0�3u_>��D�F#�О������zX�{$@��r � � �`#�7/�-�P����ĕ�����h`���܈V#|y݉�h��{�y���=�=-d:��ͱ� :�}�e����\iI���Y�pf����մ��.Aц0�.��~��\�f�>��߭��}52��/�-B�k �L~��[$�9,�.("��>���L$�A�����M��ͼ��Y��� �p ➊൦�����ҏh1���l�ɉ�]�y��/Tr�p�x�W��J)�*�rc5�V�Q�2�rÄ���8Z�э�>9(s�_�7+�U7���%��u�Ƈ�逝S��KeWf�B�a��KX3�n��A�X�er��.�#2�3��J������������szUY��`�ގ�H"G����G� 1Gr?�0�6�s�c-�����B]�s�0A� �3$=pg���YyZ>�Yc�B�C�b�H�@Q8��iUd�A����o� �-���"o���) yrĕ&!|�Ȉ1U�^� �T@��ʃ�өϔlY��K���?Z��@sָ)����מ������l�o�'HX����4a�0���wS�KN�\�ϛ��71��nKx ��ғ^W/b>7.ST��3Kt��6�dxHڿ�,ӸQ�#�"��Y;�Q諳l�ۘ�ﮈT�$D��"���1H��0ӥ8i�!��1j�5LZ�¾פ���IT������4bBOY����qBA�IL�.����nG����dJ�� g�RRջ7�n7`L�K�o�d��� �e,6��*uE +���Ώ�`ekn�bk��N��ζ�^i>4iݠ�W0MN�6>�� D���� 1�����\�].��leT +�t��Vf��9S����3[��W�Ō�,�o��=�p('��Cb�����]���n>��3�M�}��J!�JKdHo��� ���d B�T{4b�l a5Qѭ +|��d�)%��c�H�yy��=*�%r��0n c����2����L�,��f�n.O(���8]����tXX����GD��,P�:DMۚ��W�p7H������ע,��^����?(�A�)�����=��sb~\&Gǐ�f����Y+rK�b���o8~ +'�)��K+#����h�'�ϸ�? ��[�|�xI�IWp���EFߗ��U�KN%���تRr��\QX5�[m�b��DH���][����5t��q�N~'��l3�ȔA��L̜������Fu��{A[���{�ɞgX(�~*4�k� +�dDg�~��/E�%^�G�i��X#~��ߛ�{q�$�AU�4��/ �v?��X��(�!圤�JQ|h].i(��n;�<㒁S&ѐ3�����m��~��g]��n@��D/׼�Nm.K�΂ �I�]B�7�������FMl�W�N�Zu��1�ȍ�u����ۺ��-[��r�,Si�`7��|�aR���H,J��ߕ�(�D ���MH |5�e��;5i���� ��IzO�ڈ����e�qc��n���`@+�܀�^c��4!"���� ���\6��=%������^��X.�y#\��E�Ok領�8/ϴ�UC,G��-�� iA�?�_��BۥA�`f�z���CpF9%hji#'͑�t�2�9⸰��t����֜6�\� 0_�� L3�m�Z���Vk�XY�yEME�%������j�/p5*�)��X`U4&R+6 ��LŸ�B<�M�5%��)�� +� !m�ţ΂���tH��b���4�Pi��d���)E�Ԏ��ha܆�JlH�,K~�����]��aFm�=��pYèԆ8.��u�T�6K��-�]�$p?�Q8�`�6{�W�k���� +`����g�����,(���P2�>���z�crf�1OF�V������6���c�����p��3ҿ�웝�7�����Q�U%��N�k��H_����‚has�S �n�/�m �|��i}U +Ëf5�~-)����9�� �vI�}�L����X�\��*�4[���BYG�k���K� ç�B@�F5��F�k����Ċ���Kn���}$�_`ى�����Q~�B�`���h�c|6x@�C�`��3]�����,%���c�� +f���0UNB�ѕ�����U�I\��3N���2PXKm��P��#�bt��'��C$]�I�jn������\E�����l!ndTďix�;� +,��Whgf�U��Om�'d����z*|H��;o-j�”�c-����5�E�S3}��]А'��~�V�cF"�'.���I�8m>��o� ��B�#� ;Lc��0"�=�HT�L y� w�n�l��,%��8��L����'�LGS�s��P*������.��S�AH�q1UhGE1��f ��8���t���MG�Cؽ��+8�3�.�I�" �J�nz�#�����[`�����U��1)�n%&v��_lI�:XR���X�E�bm$�a��O-��]��XЬK&��^3"HP;-{�vt2e��9�NT�CA/�3�v(� &�r��p+���@� +>���F��q�o�L�"p~ �?�UC��4D��ꖬ���7T?�G�Ԓ_8�*�d_�U-���Z�-O +��� ��ģ�ٮ�h^~3��ov�m�ʱ]F�g0<%�ә�����3�X��Ls��R^���m��*K�J��+X���YYk�+�$d����?��Fdf�� ����H�3ɧ���ƍ�j5������0z�����s���$�Z+:X ����:���Z�920� 1�Q)/� �&�w�0�x��0F`x��{��vt�h/r��!Ĉi4,��;/1[��t���:�%"��V��⍥�G�m�8��N�? ��{��<�=H*Ml���%m]?����Diœ���!p��o@����\�x��\ľ�M�s�j�&t4�,k�2�����%��<�a�Q]�0f����A3�q��������ŞPhvk��wcxq�|�p\>�v�$ō�ί�l���Q��ؙ��'��W+�����_m�5.�@lX/66�/���S���38� [.�����`l������$��� �.�4������ȫ�3��-�n�&�Q��X��.a���t�ݱ%LN��L���W����/���I�-J�Ȉz�[ }Gsj��E7����j@��&�Ɇ�ZT���2���Z���������w�����7d2�}�t�m�������M4�Yj��H����Di�"A�/e��g蹹�> �X*P�=O�$$i�5�6� F���C$���|����3�aȎ�N�e�ŝ p9뱌�&��������hP�~7�a���s�"�L���Q5��j�?� +-(�b?��b"�fe�g�2!���D��CnN]����7�Hm|e �c��>�����c�.&�����Cu������]F��&��y0` +O�7v���!a���?�m+B\0��|6V5|;���R( "��Q���P��sO��w]�jANR�� +�fBt�(?5a���q[���w�m��p!x��&cHa��ɰG�ʧv�z��I[{�G�acA��j"r��R�Y)�T�=�� ^=�ӽ����84T�t��4��AY�燚Ccp���h�A�ւ�`�1YP� �� �|(��s��(jk��ʼnEW5 ++/��D+h���;ߖ����F�U�R���E��O� ,��—C����~o�2�V+9r�m܈�x�؅c��pɰ��{��=7���6vr�0� �yՌPyF��b)#*��n>��)����i�3��O��ND$�C���$��_���J�]���6�Y��nj[�(�V� ^"e�O<�JN�*��>����w֒�ڍ�����E(�{�c�(k�u���UW���>r�IZ�%l4�['V���^�>J�D�Z@[f}�5۾P-'Qc+H�4��`���� X^cX���C�C�� ��(K��/��$UZ��v�l�]09��w � OqMEt�mEYrTM�.�v�t�6 z�a��)RX%(W�9�wg����̱J��I�E���;t��:�X�PQj?1*Į�Dۋ Q�5�lM��6]��:r�҄��t�bC�2� �in��X'WI�8�U �� `)�L�c�� �h9bwL� �fN}�h�D~KBx/�����ܱYC��;/���=��g�Q$s8٫^7@x�OD�HpW�5�ԟOr©ϨRcW{l+�u��G���x����5d��s����Ae��,韧�a,Z_�R &��¬���u�{St�VY�P(� �e����dm�$^@��G~�3���P u�VF���-͠C��� ᤻��m�h�}/f���(�W��]wʭ��F�]���*�c��z��&�Y�84��#�W��w���Q�;��E>�A� G�#��X](�f�yN��nQ��OUg]WѲ�����{m���<�E�;�̯��X ו�&�9O8G:�l�0�ݦr ?9�ҙ��5ܔ��s'��n��o�e\�=�K��x J�>�E��@qL��Ҳ9ޑ0I�t �s��/M�w!β�[����4SA,';T1����1`麡7\fZf+�N��?��~=����$@+�a�Ֆ�H�|���(�3Z>�4�\���������hU����|m���?hauit���i��W�.��A$c��)؝�d�FZ�j�d�� �U+B��~�q�1� E�i�='Ru3����tf��0^��1l�Qȗ�Ƒ`2b�R�P��'Ͳ(��7�֯��[u���zS��1�o(��c� ]��+US���a�u +Y���.�?>����s��Q�s� ���E t�I�Ug}�J=��A�PFW���^�}��}1h�dE���_u���Iy Իy�(H��f���f��$�=T3UO��������[sx�A����h������Z~5F��� �ma&�yu#3\6�n.)�Y0B�]ȁ�\� >^cS� �`h +�G��$�����3��Ù�z��l84X�˒�+�B4����B���G���A���1 +�9���6� ��Mx:�U7(ru�� +�d � ;l80�> +P��Šz��(� �O{�n&�[�&8�}1G���i��J��6�d���~C5[�����ڥ��6F�'Y���SD�qS�3qq�� �M�T�4r�_:�����P�ŝ���5�~���ƻ��D�h0��&��c�uʢ��0fk�7t�?&[)5�$�0������Όf"�����ψ��)0/���^ܬ�@��]�T�,� ?A�u��ywt���3t�0$p��[�x,��]h��� �C�!,I���}��^%��ȓk�f�y �"�[穠�1�n4�,����'�{�� ܣ�A�؇S�Q> +q�,P"�y`�J����צ�3 -��������Y_��i�?���P�t�d:j;��2�W.�4/|�7�o���6)�s8��fؐ�$����RA�٬���� +y����l���0 �h?(;�����.�'#k�2�*�j���Q䟖�\)k �l0E�|^��d�"NV*���`����j�^��?��;e�J��ѧҳ�" +��X�p�|���D�=Z$�5A���7�Y��H�] �2C�(p��ZP�@�G����iJ5��fy�u4FP�b�7�~�-��6�*�!������J3k�� �d�&�� ̵ˆp^0�88��An��긩�pI�8���У +X�*����k#��!fg�LK�� kLA�D���Ye��'�­Ci�)�#-�?5Ej��-�3�"g|�iް���˓�" ��̶!�� b�K�0�WZ0��[�IM�L3@Tm����,B��� �\�� �ͬ�GE� +?��[�3wM��x@���6�MI�8��P4�Q�"�h 9��!����b�%Q ~���_�@��$��%^a%5 �u�b��A�G�� �"@��Mj���ł='���U��){��k��E��(��q�1�³Z�m8w�:���E�G�� ��Y> +*�q����(���L�hdM��FۘҴh�Z�XU`Z�ċ[��d1��n7¨����w�}.�;��80�Nwgr�_M N4,駫G�&,ۅ����gm(DRЋ�e�,��?��\N���`��{���U����e-��Z�/d��^1��*� ��Z"� �Gk#d�n�t-Z�k�:RecP�o&�- J��$�^e�2�tJ���X��M�|�8�gG),A;򇜆��^��<�±�3p�����<�zN)*z�g��(�ď>?**a�!� �h'Zµ!:S�1"�Pٛ�|�H��a�=����¤)�p��S����h�!�ʞ��ȝ��a��T�����g�f6(lF���K�*1Z)�w2���,�4N��l>�M�N�sb����EL�V��^�v�F����c-�W%� �d�H;�^������n��ſg0=����B�⥫�բ��i9t%�r�]��3��/-}+���m`&k-���m*)0ӁT��/YI��LI�}�:#���%��嗤�Ŗ��vJr��h��-��]��B��KH�Ń��1���O�\�����% �T<�M��L�:/� �ha,�4�B_,�!�Ǫ�.���'qK����_,�^� ��U_I��+���U�U���;/�O��8fh��t^���(y�w^�v�ElM2�Ƣ?�UQy��ʋ�����]��S�ꮤy5i?�b���u2��  �#��P���C^�1^� y I��D�������(b�������R�J��Y���+ɋMp�p���I�*M���5ú�y�/�:^_��w�bG�’���.�8Q�K��Xo����5ŋ��xQVS�:����X�VY�v� +4c�v �˫��8/�����%��7����+{�4�*Ω@�e�΋����9D/$���Bv^�(ϋ�z�m�=/�6E��6��k3��Wڍы^=/3f|�!ϫ���� �װ4��������k,>�,z���ym~i�� �|;�y�y)���v�%��Y��|��� ���Ӽ���z�-,��cg�]�^]C�s,��b֌�c�Q��NL�Q�E��=��,�c!��B�2no �"�wYv�2�����ؖ�I@�{W6� �x}�+ �̾s�O۰�0;IJ�ݕ镕1/uM����薕 �I��`��,���Ƃ�/e�7���i�L�h)�"�d|�E ��K�v��J��b���� ��O�J�2�(�5 �=�A��_�X&jW(C��>���������E�kS)Q +y��l�oS�R1�({�*�RȠ�2�����E�F�����"�*{�M�L����”�eX1���p,2��2w���Z��N��XT/b�-�Ƃ�Yֲ֙3�2�2�5 �E-̸��D��e�Z�̶[F���ef�%��и��{<�|��� � ��e��*0 ���ez1�XN�e���i�Wg��9��X�@m7�p{P8�2ot|�o,�e|����Vo�X�&�/���X,ߍ�m,�,|g���"�{�i�e�R�0+�Xd���_�p{��Ƣ�ˌ~�!Bxc�ōX���©��7��,���"O�w�w�2��� +��¯����u�ɴ�w���D5���l�����"xw�\F��s�K�G��e����j\�|�p���[��;����'fr��xa�� +�� 3bƂU +�*I�a�[b�s��'f�OX�N1�ڊ���=�#��+f��?��]A�X �O�Y0V�Х3����3:���2cr3 �g�f�h,�푚!�X�֬od3��W�f\y7�F�3��Lr�(>�*9{��P�m�9#�X@w��q� ۙH���g��A>{u�3��g) ���~��M���;������4�!g����a�M#�hgEѐ�M�1��\ЎVJ�"��H$��5i�75wQc��J�� M�4�4, Bz7Goc����MC �4ٕ鴀2�܃}� +j Ρ&颖�Ƃhlc����Ԑѩ)�XP�:�?7Ī� �j����5��j��W�3�Ƴ��C�f�(k*W�X,��7lOk� ���5˶��ʭi�Ƃ�R��#�,j,B� �N MhQ���x ��B�׈��&¿�1(l76��1�R�&� ]�vl8j,� �u�d���F�/D46��`l,|�� �4�ַM���\c��i�Tȱ��tm@���T�6�Z�6��6� �dn�w]|�7Kn���Y�qOɍ�.7D�}s��Xdt�~{�m|��Ƣt����sC�G���A����Ac���60)�P�<���u�:=�n�n�h�4�c7o����1�X��� ��  $�7��nޠ4cIo��zS�� ��O����W���6��[�ٷ7�߄Y��OB� c���N�b,�����0KܟYs|r��c!�c��.��ӳ^HC1��S�|�)�}e,�s�e7��X@�J5c1��Nx�3�Y�Ӣ~`��遛߁�a +\������ ��{�� +��`�t�8�3� R�� �����0p5��5�k,���t5��a�4&�Ui,���U�oַ���1�6&I��7�2���v��ߺ����f,p���od�o�X���g��G� p7��t�4F���e,�~�.D���##�q��f,�����E\t��E����qܖ��p�� ��ٌD�D����:X i����>f,� �*1p�-��/pʄ���G�f�E��jY�v������O�ƢQ�`�ǰ � ��`��X%��Z�C�� +���pR��_����B��8��i,�%n3(.C� �X�{-�K..\� �2,@Q38���(+qo2��we,4��E��O�����~�_!��D�'ca�Q�!wg�b��k��\q��% ��\Z��Jz�B>�4c�Y ^�*c�f�F�ƴ�irh�'�R�_��J25H�M ��Ņ���I9v��~L�r���.{wR�j�^&<�+tJB��X`IU��N^�H4��Q��(b,>���r�u+�|�J5��a,�<-"�p�2]�ł"�������L�����r� +��<�a,�� �3�*Ax1�[�vk�ޭC�v�£��s��D9q�Xh��Xs�ͱ�X c,RZ����7��NI�m��XhK��s6���`��{�p.��w97.����Ν��)c���{��9�� ����� /��Љ�&:q_t�8:JP�����)�J��Ց�0i�a�XP�N��O/����Yh��'qL���M]�ܟه��t��SJI,�%��C��A0����!�h���0�@�k҇�Ï�zR����Eu�:ь�̪�R��3���Y�U�YQ��� +�.,���5O�������(D1�(\�U��sJ ��cq��D���6X M�0>���b��~ �-d��;�8����h�X���Rq��kϲX� }���n\��N��p��bX��d�.+�ҺLDX,��+�Y��� �3�b�ut��$�E�[G �ř��9�K�&rV,�|��I��bZ3O�bac8U�؊��K���[��Z^8ӯX�ñ ��bADY���X p�J���I�u ��r�Dp݌R���b�ֽ�� �y�u��`�h�n�J�����^��a��v�� ������ +�i�!�X����p����ڍ��C����ڎ�C9�������Ţ.��X,�s��m�Hr��r�bA����.�gw���/w�l7//w_,j�� �|��JuVN~�L��@����X�Ђ�c��g�LJ�0u�׋���K����X�D<�d♩��(-�ć��C3>�x|��Q��F��ɗ@V>�_>)�|�%�|��|� }�0�}��> ����P}����������wJ��i�m&�ܰ�d�a�8� bh� +�X&0���O��a�!��f � h��_ �$����d,��}TO �q����8���%� �&+��E�K���j$i_���>*��2FpX�w�����I��a�t����O�i'��Â��~r4� JoI����Q�?���nOR(���w|���4���Rt�E�s!E�Q�� ���h�xX\����"� �ܳ�����Ҍ�>J�g�l�W!P��K"k�X� ��luK��� �b&2�O�"[C,�4��>զN�["�fa!�>�S���/���d� �¬e��F�̐��/�������L�e!��i��Ҿ~���>�O��H$�L�RV�F�,1�Q�о�x���?L_j��.|�}���[���:]2�&�" ,C����G$��hq��8��J���Ї���C�[�f_9��@�,�FbQ�����z��� )�V�`"2b��� Ab�O}hqT �N@42I4�Y̾�E��V��̸�W%��7�o�����X��dAbAߩ�đ}͆�����>����>4���Ww?�Xt�*�x����G9b߱���"{o��#���� ��ĸ�y�b��Ab�� �H��O����s$;�\����h�b������i}�t�Xl�=��G,�v� *��X�뺗ml���B��%�48b���� +������Xjz�{��aZ��Xt��މ�����������>j����"��w�����Yf��k}���֗�̈E�淛݂��í����3�bĢ�"���N���x(2�"�Iӵ�C,��c����i1n}0���˭��ׇ��~�s냂XX6�cB,b���ӻ�N�j +b10��|����'���v�OȇEd<[���S�a!6���п�����~�l}R�A Q�n��ǜ�a!��e�א>������5����Σ��g} ����2c�6���ևX��@,�i}���cB&��~Xģ��Xp� ��H�7� _�>���7j<�>�z�~ �$fpQ#yZ��r��Ăӯ9 ���X����"�.�> �֏t� ��'��E}j�X0��0�b�� �U듅X����fb!̡Lq ����2���f����8��'�b8.b!�� �" nA�b���?G� �h"�B@;�����Rv�W�h}��X�j}� �0��M��� b��#�@��D�X�����և�4��ply���X�GZb��w���B��t*�������fćŒ^�X(���>�����!����Ijjjj������������j�Z���_���_�3����̜W�>R<�;ȯ�^b� +n��+��?۩��ײ]�R;H=瓼i6�ٳ@�{.�Ãj�u!ë�=Xm�i��x�G�܂gj��%W��� ���ZS��@3��PC�j�y�i��xŶ�T��U���w�I��qc�&���TFd4��x�GP\���`��|Ms�on�u?T���i�(���j����1|����ĩ���i�N�� ����낆�v>*Y���z�n�������<�s�j�4;�!�E���}���> (�A$x�k��<���P����B��B��Z���GZ�?�o����!@�X�D&M��=Mc��H��?�D���rD�x����<�v����n��<�a� + �8@\o'zZo#E�zQ����KFÄ�Һ�5_b�s��MS��������!&;� �M�J�� �� �H��0�D�p�f�f3�2��n9fʕ��C�BCa~�S�]r'�Qk G���%�O��e�`����bx��3-߿_�ќIR �L�O}Dh��@�}#�|/b�v��כ��������Q�A@2 ?Pr;Xj?�c@skD���� �k09J1ТwMqZ�?���-ڴ�"��>��뒌�u]Nm����YDM�X����V�Lq�W��B~m}ȯ�w9��6N5^�]�w��jxM'z���w@`�@^v�%y�� ��@R��,��A+z.����� +nD VŽ�On���u�q��: 9�/���_b���:�����4A[6C�5�.����ӝ��b�y��1õ^��S��4 +2Pm�0��E��nB��)��.O��B%u�k�[���A�t"n��)ı\���g����\��1<,_�h�XlٝP��F/��3q�ITL�!U.f� � �|���8�K�bt���� + �3-^4�#w�n�'j �����K������=s��z�@��@y�@��/��Y�`����+�`<�f7)6�e�`hJ�o���C��嶣��R�h$�f4�S�2����|JtKm�%�i�p����D�Tڄ.�� TZ������ �I�+�7��g���CE��8��:װ�Q��'��:��Mw�v� �����^IJ�O,Y����Q��4̳=He�{�l;R���E�V|��6Ȳ^&��k9��z���h��}��Wu��)�֫��Lm{o���!j�� ўg�rAi�������9��:���2(�.��0?0�"VqV�x���@����}��I������\����Al��t�O���(L� ���.�Hh�F  �C�2�Z��S�?‡�̀ _*߶���5b���j�u<~��G�%ρ��2�,�5@"=;�"UC�!2S�e�=����(.���Zi���;v���ǀ�h.��P�� ��{N9�z���j��48�/6#�[��� +5ݵ*Y��%X�����L��ʷ�Ѣ-�H��V3�y]ߝ$��b��b�ܖX8�U� ���0��1B/�j�z�����<|`o)Ds�D��Z����M�|�p#�ڀ�4���U?qS�.�s$�y���.��� 큓��Ȓ�|�Ċ��#��������� ��E1 +�w ߓ���l����� +��Y��T�1�[\��\��=R��+例n�v���C۵_7���+�D� +�$�6�H�� ��:O�\���z�s-�Tf'�-������F���=�fȽa)>���}!���D��Ԓ��B�P�� +Qn���j�sDV�'�֢hŖ�s�n��t�b�>$� +t��%�SZ�s/ʰ��vӑ��d��:�sl? +��)�g� +6Gr X��+�q�O č���8K��n�K�#B� aE��!Gi�A)>�EWi��R.Z�$46����̭�����5N���H��,�vd������m��D�_ +*� ���OdtY������b�[�f=�ʞ;^�sɫ�����h�cz tL�a�jC!��4M��Ɖ��0�ŵ$�����F��C ��5��; .M�&Cl=\p#��^�΋ȉB;ѣR{q��9U��5(}WBb��c7�!7��+�V�{c6��z�uE��o����v�(h�'^�u��ه"� �U[ s�e)VWa��$I.8�UP ��$�sj��&� ���q�]���3��E�t?�������i��:k��OZ�u�i�ʑ̏q���+�岟4��x�`o�*�oA�荀e� S�0�w���;Co����bڲ�#H�QL�I;P1���wm� +��N�_"|�Բ��ߩ���r�z�UZ �˭� �sș:�@�$�R5F������b��\��Hw�@�f�mV�����}�u���t� �D�t�d"7쭅�H.b� +n�4�w(��J�^tǪ6�+6(��������8f�m�-�K�`p=i�n�y�S!��A�,�A��E?p�U��J��XN�s"x��R���r��<����y��"D��;Td1�Xf�!���S* �'\�`f��t��&�Tl1�Xq(�,8�f}��B�2��vŁ�A�g�Q3�{:{�z�1����[v����j�g|�ۖ�v�s-�\n��5���к���{���G��2�$�1SAcd%�<�]���D�0��J��R�y��(|Mg*~TjT��:Ti'�1���/������Gn��#$�>,�ֻD��C�9��1f����L�bp.I���:�"B�c;��-�k> �+�ˍ�s��� �]��R�a��̮��-��u��%�c��������:~��H�Zt�!�� نә �V[��,����FAᄡ���T�z6G�0_��V���W�dfIj��H�q��]S �� ��R����*;O������9�O1����式4�_A�����٦s�F'�-PםDΔۈ^�Zɒ���U�#�8�HA��C4F�jKY��1�[o!I/8�(o���Z���ݏ��2j���"J �!��45Zq.za|ˑ��j�j�0�{0C�@���`X�Š�\�L�� �X\J�mH%ӛ[�^B�ր(DF�l�j�^q%J1|��#2 +7Bp +b�� d�� ;�6J�*�e9��N��oi��iLČ����6�d�]�f9 �:OEdfc�Z�C4�i�ႆ�5��� ہXp\O +�b�t�"��y~���!�?p�E3H��G�D������c��<��%J�zr������U�b�*:�3E�E���Q���D��h��4ϭ���8���� ��ϳ�oN���3;"���Z�tU��N���k�n>(����5�z���OBjxOCgv� x�(h�wA��Z���:Ҵ\�VÇ9f�b�L��c��$��^3�b�쐼gw=N�� + *����'z��:�Rqp��*x��.Np\�T n� ���{�j�|�!�\o*��@�����^���LBctbHgx6˪2:n�Q��.&�ŗ`�vA�bsq��/Or�Hh�:���Bn��V��f��)v�����Yo�$��H���V>�����ȞK9��.�sH��_�r��Ԝ�^�~��D� 1,כ��Elz�Ԗ�|U��Ê�#;"ħtMT��§U��EHaF^�(n!�h�T������b�lA�L� 0Cj f\�X�l��0�z�i{���e��hj�YX�f�4�l]�܂>Xp t��D�h����R�Q�r롊�=�W��.[H�P �,���X�$��ն���@�}ߵ����H�Mf,�M�&�,�1���Q�sB�O̪�CDl�xi��z����͏ +B��Ӕ������;��n+R���oy� �H��A�~�� O�=�{f����������+|o���u�p�����m����=�r�7;�K����ֻ0����W �ON�u+��5*�1�"9�P�.��i ��3ͳ�OZ�������nu46�T���X�n�,;�ݖ� q�jd�dw>h:��e��f���8O�� H�_d��3�`���Oj���W�'���j����-����BxE�"赖�|���l8}�,�J�5�V� ,x5�5 ��V�?��ԘQ+�Ɖ��H�ye5��z��e�V��Pjm��V���S-�a ��d��|R��w��%�����ng*VIn��H�p�k[OR �E�`����3�l9$"�>+i>7�3tf ���bhXo���G�� �,�bD�w�m=Q��T$��Ab�I9y ��^��; 󬿁���+�T��S����2*ޣ��E�7#؛�!���C�[�l; iۮ���Z��w?˅����s4S1�D)��� ��@����=g�$��Z��-��9Sr�xM�Y�G&G��R#Iz��@��|V1}�3� gJ����/�L��ʊCY��e�b��%���.#�[�_x�����W��z�Y��7͵��η0�t�%�^���D[4F*;�ľ�Cj�F/:������0�v�-Ot�әz�'pa��p��2Q~ř��b�`sDF��i�Ζ� a�ն�iH�VF�FDk���U@�WM�j�Ni�Rjڍ���NԚ߰��z�Sٜo�����=Rw /�(�.JH�f������z�s)�08�5^�E�C�YgM-o��S��)}��TDf�%��(������ά���,�G�bn"�0��՘�bV�P,N)�3�e4z�2�������Ai�n��7�����)��e�(��M�r;j���v��+�9_)hl�'��[��;�m�Y��,Er=� �]�x9Xp�V��ݟI��1�u?X]���6�r���r�sH,�4�������丯��-��y��3~b� +����T�+���Jis2I3�d8��v�hL�r:�'������蛎H��1��:�]���ŏ�K2=W��隊�v?)��d�e��{��k�cv,J��/��_�r����_�=׷Ci9��� �%�����JΟ�U���:g܎���j����\� 3��'��c5���k��ҌA��v�軏�|z�|!#���H�!J���yj�4�x:_p t��<�`uhX��%ۇ��~-��\�;��`Z��L�k3Ͳ=F,.D�� �x����Dߓ]���S��$���F�iw�N��&�ޫ��?ر�Q��o�o���[�f�H� ����̭�E �W!�������n�d�7 ���a�� ��zS�����<�rKݶ������}��۴?�8 �g��֯�i��j��,�vf=��7—oP�E��Y��8f�� ��+J�����5��t�Rm9ש�b֌���0!��)|��\��°���\gr��*�9߉H�b�r_�E�#��mxy���{[Q��8Qt�Y�s�d4|��8 +/ת�!w�h�ΈK6'���P�[c.I0�˲,G�$㿌��Ks�‰�k�%"��-��c�L�;�H�1x!b[�Y��T�u������抍�H�#�q��4n����H��;�T�Fe4�&��B�,���:��]����v{�OZ���g�܇��'�Z+R��9Ym%x��h�g=�ڮZ�~�WN�UtV7�' �甆���f�_B M(��ٲ���ZTCixaGi�#o��g�~�"�賂���lO1\�� R��@�{��w{vA�W��V���vl�']�_��{�>��$��1�c��'�Ѩr� y��9�n~���@�u��-���G��bIfsc&�:�P:Ē�A߱��4~�2,�{�l:�XΣ���"�f���SJl� ���¨�6�Dߗ�w��e�U3އJ�b�vl�z�j��^�����r�j�U�{kP�T��o���#-�8՞z�v�����L�%�D�y���q����nʍ�Y���i�X�&y�VA�i�bo1�[o%zUll�ʐ��I)��ZZ����$�� +�m��k��E�U�a�B0� +�W\�,gB믔��(���(]���3�l_a��X�d8������y��v`L�9��|h]��H��`u�oY��8ϴ�G�֫0�u����S��o�M�$�M���R�`q1Pr�gU縉�y���>Kʬ�bb���jx(|[l.�]o.�r�����H��#���z�}�֍7j�oZGfy�v,o��j���;d�D]ߧܷ���U��:�t�%1���^%�vgC$�M@ *K���z�!�����{��d�oZ�p>$p��?r�a�L�Eі;� �+�D����rs��zcb��lw^7̞�Fm�#�C�]m A�=$8���!��+��olv�u��^]��o�n�X-��(��D-4����,���n�γ����DI�}�H����~�^m6K1�%��� �&Z�;f�qFCc�($8���~r�[�^�Eۋ��}#V�����r��{I2 �D ��8��[�>��#�!���U�ao3P�=t� *Z㧐�}2ԛ/f�F���עHU���^v��E�Ԛ�<��Z�`c˥0vV��,D�2��:�[���)ߧ�L�Uyn�k�.�#=� ��}�Iͮ��ϱ�q�1HB��؜]���R9��f�3t�N�B�{NT�&��� �Jޠ� T˂ Qy�)���Z�����\�ȤCf���8NG��6��J#A~����vn�������� �Y Wk��6FM�C$�T�AXU�0�U�-�J����DT`c?DY�ڥsɶ��b�b�@��t��7�}�r�|$��~����T�?�﯐��g+u��v��e +��*��n�b|��^l�N+JCT���26H�����LB�D6a���@�q@S���%��2�����rQI����/����{ �l��r�����B�Mi],J� $,���� ��ɩ�$h� 6)+&˵na��F�^gPm��TVc� VWA�B����a��#�\��ՀIYb���Z�� ��� �a)�z���M���(MHb5LP坥)sLQ��GH��(�֓�R+yJ�c�Zh� ���u���w�U�E�=��yO�d�7���d�����& z�"T�T���e jee�bq����>��2�oUZ˵�)4n��ݔ^2���EE�!��A,��C5�Y��y!#���-�S�XnA$�����v�+M�� �+fƢ�r�\��Ĥ�1%Q���5��e5�̒ߎZ5]�(~??���!5H �Kz����>-ۣK]mY)-6�ԙ ��b�k��mB�"c��M��lأ���͛}��5߸��Ys�VKCPI�L�р2\8$l8q�'`1��0���q��H+P�$p��tPt�T��T"��P����r�i|W[6�����"{`��0&�W0�T���>�,*5���4�Y� �*80l8��Lj ,4�BFlX�bed�eQ���, +��L��&�M��W�/K�;���j�N�j��@��|C�22�^�9�D�0R8\�(���E0X̐  r��g���6C�ɴ��J�^�K�Y�"ݶ$D�2� K*�g�o���\Z�u+י� ����>p@�� ��q!�'d`"�����)E��k��V"mɃ߯5�V\n���6��� k;J"שFWf2�ܰUlU%P!xS<D +� L�!��*F8R��� ���XX6�+JHZ>#���(�j�sD��ߘ-�{�0]�ƃ<��L�\|��;-=bDd �`1b %4��h 2p���"+2\ ��O"�,��WlDR+ƀJo�����j͏�p\�;��d��N�Sd3�$����iO �)Z8$P`���@��QB��jDz �s���,��P�ʐX��/���H� U�k��Q��o� 4}D��vX����J���S�R``���,#��a:��қ����̙��*�&$�E�ġ�+� )��G*�E�eN�ф����"7^H�o�߬JamѨ*�Ъh��d͚ �����@�@�#*q��)5�� +�}V�x��VT��J@��`�[m +6JlB���36�:T�pDx��cB�&��x�� �� %8R�8�8A��%Rp�RT �����:z�hEFi�gИ-�m�!�p>Q� ���� +� +-=">Dz8,L���B Pp<����8$��G 0�  +0���0�!q!J�E�>�S�)��ZU6Tt�{���f�Xh/�G�'/KB@t80P�!�� @pH��`��A� Jp(�`�! %\8X�� Ȍ�_���xT^q����<3 �c�c}+7��Q��7X�X���!�GT��� +8BhP����q@��@a� ')R�p��x)@d�'�^�{AY�ʀ�j�x>�;�Pd!K����W[�t,7��*{��'P p�℃�<���B � 0��0a��+4��a�(,>�I"V�.��z'+�6%�I�D��8j��P��k�΁�%�b3�a��#ƒ P�x��H��G 18D8�18$D��a���45��F!|�B ��(�T.�D`9ޫ��+MEz��pD �� "t�qB��Ĥ'8=St�_ +��O�B]X�t�0Aq�P*\�8�Աj�@�+�t�%|Rc8�4ީ}��ش~� �63��r�}dV�R�|��U�����2�� �8�pH�� / �1��!@ Ht�j�U!�װҮ�E���m���bq%ͮ6D0��#�m�)n�n�zdU�ON�|���#L`�8x!b4������R]�G�@�|�P|V�x~�-ک9MV��9�FҤJ���]�Xm%�^�bR���B�phPA2M�H�*��E@�����l3R�992P��R�KFYHZ�0�a�"1 +��XER*�EөY3֫8K.��L�A +Б�2��ЕZ(�>[n!��]y��1�l~����D�w_�����ME�"92�΢'��x����GO^���|b1�&�V�N̞�T�a{�����K�7�j:�V��a�����M�:^sv�pWFc��v>��-�|�.ժ8�P���Ե��6����y�Zr�<�H�ԛHu �ۄ�4�2]B� �JS.e��p��$�p�#|��x��u��zJ�\�~&��QԂ��n�w�O��h��3)6 ��s�PpA�,��� �jdC��V��u�l��l�_z=Pn ^�o )Z� �h�t���Y^���YJ��sD6�w�r�~#�[GP�-�����?Ҳ���1�Z�����ezSҚ>e4�R�z�����$�W������~ ����?�R�Y�����^����{$�4�A�*~� c`��z�B[��a�Wgڤq��:Ŷa�i>�D�Ӷ]�,G2�b;������.2,��7t�Ke���>�^ʡ.9��R . U,A�ea�H�a�zCv�{?Rfj��R�T����V/�x ˣ$��L��|��*O-��7L?YN�uz�D��|�^u*~�%c ����~@�Ds��3qr�C�]q1M2~�Z���>P5�穆�ױ�CX���w5�IJ�B�Y�첛4��b,��:�Mh:\,�3IK��XUOhQ:�4��L�Yo/Ү��u�j���w�/���,���_�QWN'�%�f)~&�l�M[��3@�4���D���8!q4!2�S�r�s��Z��:�0z�Y�q_"���)>�v�'`��]A��R^�w���$�a�fԖ�U�r>�=�B��#=������ *���W���E��I��o9��!ŭ8i�$}�O�d���,7>Wo*x��N�`tb֜or���*���,w���$Gp���8̐��Z�Q�Y��2I0{ R N���F�Ug~�x���J�� �NS����yG���F&���d�b��9Pr�:Λ�i�PCľp�G�r Z�z.&����/9���g������>J�����2�!��Y�au�k8o���j��Z��$�|$��O��`��I�*-��'����B4�W���~������.M/9�#��+؁�* +� � +v� +�ԃk��J�@�3��MP;F��vR�Zq�����;����!��,OZ�Q��q��x���<��Ǜn�D��i�yN�9���J r�A�5����� ���Ě�|��%˭���/C��'��C����m�ďI����d��"�0�&8Q.u��/�Rfd����5�+z�"U�"\����B�j����ƫ{��I޻�6[o r��X��)|Xm8O��HH�DZ��]��Rq��@�t8R1���#���+����ͦf��d)f�8r�[�b��V=7$�k*�۩����9�~�!6 �W�/|��>����ᓲ�|��?�-�V�D͑���J�e�y�l<���>�s�h�߻��_���+Σ��N�Z ?G�e��w�܂@�w��B�(z�}��T�`�O������&a��YZ���8_��G@���Т��M���=��H�u���?�Z��gaz�I�bw��6?�6;Th @��^,�\���z�2�Š��/1��d��<�4�qX�!�@�>�$�}��=ɎQy���D��6� �g��:WmĠ�E �ECxA"���6���b��d� #�8=ϑ�y:��3�C��P�D���4 CL�hM�c��@�Zn+I0�Ls����E�]�*9_�$�G�l� �g~���Bw�ْu�`�(�\ W��x����j�P��Ab�!�`|� �Z���6H�m1Do3_t��l�m�!!�������������7œB��#�~s53P�I�0��4��n��(`��g�[tj��D�)mE1�m�)��e��~����2�#�]ׂ��tgz��L���-8 ,�6+�Q�6�8.��[/9@Hp#U�?�h%��۾P�U_��=�$��`���= RY��<\q,zYm2�\q$K/9施����eV #1�S+mE� +�CӘ !V��#�;Gc,�Nh0�Je"Ҩ2�L�z�t1�\t?���G�O�����I�`rK��-B�a4��R�ap:Rt�x���f�'� �5�$��jɩ(��C�Y�����Q�z+f�����~�Y�^�4Zn;˶?�U�I� ��q��q��#r�� L�\�r9`�E�@�M�)" zՃM.�`�t_��G~��0�d�d��2\5/�4 �V�R �B�Rk�H�^���3�5P3=��C�\��*� +3���+X �M����*^�牬C�Ҝ���Gն"�����8�1^Gj�� ��L�`�D��g��~��=��>��z�8R���!z;X�r��I�+��G�X���mř��Z��$�A��8�z=Ef)�#�+ +���0Fs9Tn%f��H��̓̏����l�Bf���h�e�u�A���‹�� &U-�T�P��`�x��&ͮ� >Gn(X��e�y��Rc �W�f� ϒL�y��:��Wc��k@���MFQ +�̶��w�a&�-��Z�%W��"�3+ރ��=�Lq�(8�4�O��> R�_Q��#�0{�S�O +*�ғd��ů����I�y��%rԪ��#K.� c� !��K����f.���NAtR���u;��c�ҀT�=��"x�r�zZ����8Ȱ�M%�Ua���)��/�|�(~��˦1���^rdR�P3����`�n��!���r�ar7Ѱ�� �� b��C��8B� +;G� 6Bof,���XU�r3yF�e�b�4��V-�$X��JT���v-a&�LCe$R+� )��g��3J��%�1~�<َ̚��u-��]�~b�n:Ұ[oJ�Á��l�a7�P:.fi��� Kn�qW.\��]� ��3f�M�r�x�u]G +"�w��=�n<�w·*�g��=�Z��H��r�c��+f;� +�K]���T��>/�ђY�{4N3r��r�`h9X06��Z�6lm�}'Q"�U��R�r\�j��@�p©ڞ����s�G���x�~BbۋA`6k�� ��q��A\3MD�?�;���߲ߴ��~x5�;�Sd6�0}�y����~N��q���)���{+!�뙪�?�w�f�Η �x��O���WEgu`Ift8V-�޶�}�DV�Bz�-��=�O>�����%O$5�M�vg��B�I�So�5-�r {c�f�'ef��I�W��S�"�m�iM��"<�A�D���9��PR��&�%8)&q��R�h��J�a�?\p$zTmd��2T/6/R�\�d�z +�E5�ጒ�qS�q����)F1~���k����}�l�R8V���� .�N�|���ᦋfA|�����g;Pv ��|j�`�̰An;��7��KPI��������Է �hھC ⃀30�)v�x��Ql����xJ�n(u�,xJ�x !>tH�Bd1b��As��ߣ ��j�����B������7A*� "@� +0�%%����妢�4G�S�v��MK��]_�Q:���t�� �A�L�T��f�X�i[ a���*�=Yi.I��X}���fvU2��5��J{Q�2+d��=�m�� ��� Q�%RX�*��a���@y%�e��bh���gi�CTQ�{Ԋ[|��D�ΠA�f�L�a�q4P07eWZ�ܦݒ�9�k? 5���+�~�J�c�We-�)3G$7��l9B��һ��E��7���`0��'O,4�*�[͵˭'+�sǩ0�n0N��x}�w�c��X�% +v�̾��+���߆Y��eY�N��� y����d�k?\�����VC��H��l�[h;Wp}�i����5aei����4L� u�2�r�ɂ�5��=ݬ5Ȧ� %�ۇ=���<�s܆��:�8f���Qr7�g�� ϛ(��|�i;�����>+����.�n��)�R�h:C����^I�ߊU�z%�[^�w8�4���և,�Κ��՛�{xI"��DJn`���� T��9DP).��2k~�z�&Yϒ4�{�� �����ڡ�~h��$�3Z2�Y��l/ԭ1����3��[�s;�^'��瀬f? +���?Jja �·d� +�j� ��I�"H�#� ��{�;�πŃ���\_i��z��/K���iΟ$��<�Xl(ƭ61Q-)H'�-�F�m��{��]&�[@V:�/��E��z�-B/x�_���vA�o,W�L�U6��� ����]�O�Z�(�P�4{�m<��9� 4B ��9y��b���!��M�� Z��� 2l�,�.4T�\x��)�1�&��O�evNBiwPBg5`�t�����ؙBs�*  61�RT��#F�5dw�7b�|.U�2�����z��A*+@�"d�x(�f �����9"�mǴ��@�ru�Ċ$��F�C�6 DOQ'�2����;Xo��Y�(����gk����l���;v`Fp�/WT(�L�p 1Er���\��#� (���fhcՒ�b��$��@�)����"6��*������E� ����['0����#��vxe��g5W��B�I�~:Z�*F%'��N;~�o9ְ���� �R|�-`�p�X|�� v�[�Zr!��Ɍ��T��(�6��~iF�@��X�U�+� �9�*E��j�}Zp�\� +��R/��Sk z���5?gZ��,��N��` ��Z�`8�h�����T�\q.�Tg��ٮ#5�Q�`�Q�a�P�4�(��p�bt.Ҹ�c�b�#��Q�B;yV��(>�]��a ��Z�Yi6W/z���%Iv{I��V�h;�����窎�}�$8����,��#K�8Q\����C+:����"��co�"�n�*[~�wM�3�%�J Di�F���l��ҼC�,������g��{�Vۋ� +���^ ��Z��P��D9��N����9#�YA�2;P4��f��v�ݚ�a�cu߮�P�����7+��f�s7���$)�C}�nu�vP-����I�[n'�Jqħ��%����.���D~]n3�[m9���9Ώءj�@�E��e����y�Q�e�ۆ�/�h-ױܶ^i���X8�ʍ�S4��O��%HE6�D�U���&WH�� �f�a�r=�-��ۍ4��%���v�r.E*�3W��)�$�w�$�K�Sm$d�b (ְ#J�,ҩ�+� $�- #]q�0|�Y��E� l����ʦ�`�fA�Q�U�� +(�r!zH<�_3z��!D�}� ������CHτ��KT+��fXL59�8�ƻ6�S*ˑ��@�{N��������Y�k� ���E���P������댺sD�Pq� )F�q�_q l�i 'N,@�U �D� q~=`�F;ae�������%��r�����`�<XA�,`���+Uf�x!�P�J�Qs;�)F`�"�^�������B�3k�ʬį�,CϨ�Ԗ��$� a:�)7�J��\��9U�%�UGaN�m�u�"~Fl�iX\GQj�è�&�ȥ�Sǭ@��X��/�]1�!�AK3k�2�-��J��˚8*)Prt�p��4��\�[l���n��A�rTFctYHctRFr�t����{0k�C������E�K�h������X}����COj���J-�GB}*� ���x��B��|��)~Vh&���J���Z ��0�+5G��H��|�<�1��;�Pe0ӯ���n#5끤�:�v�ї �ە��[x':~k^���>����ܸ_�,ӑӷ�7=�u��:�:�7}�h��l> l79��$D��b�Y�S�m�E�SZ�~I��i�>3�B�����0�t>.8 'Em?Tm0N��#6����!ɫ4��/R�rC��խ�r�� }!n�u�t1j�aJ�N/N+5���Gyr��XR��<��J�[n0Ӭ��[�Lz��;�,7%���i��A�z�F�i`��)�v�$��Dky�r�b�pc�vI��I�cx@�x�q:v��� �򺞦�^㌂7�i�G�� �MZ +ѬO��>�H�M�AS0ɊA�Z����ۥ��n�V������X��v �a��:|��@���d�We+p�U9�0:��� >�a:Tn2���ffWV�}�T��sϰ"�rYz�� �� +�@^�agȁ�h�$8�*�=Jd|�� 1B4`ËB��\H���� 7�p�J�YvU���7� �U��"���4�B � ;Z� �����$�0~Ml�� 1ǨNl��4��H�(��I�(��4��t�bt��~���PGp�W�͇n���h��Բ�د{4��ՙ��>�_k>ҵ�]�[��$��3�0�K�Yl$U(��(�� ���"w�r*n��R3�B�P3�v��%k +J� "�{�Xs 8Ld|��x�ap�l� �kM����8]�+�{""��:*��z�}���+b�����`�_m�,�m8%�m�ds[DjvXBnwN^7�)<�ݎ�}��:h�~ܪ�2�0\����m�i��(�0�iY�CH7Qn�E��9�e8�'� v, SK�M�����mZ���X��8���رS���H�x����%�Y�G�i9��v��]�q��;�u���~�}��(0ifQx�~�8B��T�ΊDZmT��7��X��k� ��|S󾃨�&��Z�����@��p�bo�,��#]�a�g�4+�ڢ�-�p� �|^������3��y��Y��ei���r(=`v8Uk!z��*��^ɢts +m‹t�eIUvԞ�4�3�����t����zہ��DK�Q����|K7� ���dV� Z���Ž$���ڿ#E�_�?(e����S���+9zŅ�9�1H��!x�s����&d�!h�a;D�V�T��b��Ԣ�&*�($� 3XY~9���%H�9M2���CTΐU�b������#U^�8����H`����DJ��X%̰����`�#�5��z���Y����㴖 ������*7_B�Y`��d��Z���&4 ��(H !:�P��P� ��(�S�����0�̦*F� +��]��^���S�%�h�7(�oz���+���)�������%Ū3 3׮H���2��"�'��D�)�A' +������B��9Ʋ�,�0)��k�'Kfp�=cJ�^j(z��>��GU�Y�Wh~�[?[�2?*8�+��.�(Z_͒�Y ��!y����as��Z����TBl5~��<�����A��z�R}?����0�p`��ϯY��(�{�(2�&8���������،�,��2� ����$ �T��(&���"�����ƲLߑ�1���� +P�Sc$zA��n�EߓW��r��1�}�$�n͖�-�k�'F�\��f�^j=P�߄H֋�I�;hqz0�'��ʒ�è�6����0��,�Bb?Z0[�,���֫�����5��r�sWFfw�mZ����st�#d�y��U��>�w�.h���,�ֈݱ��;����"���J�R�xq.�"fڡ�%[����$�]��;�Us)v�F���+5 6Gl)W�1��#y�hX�U`r�w��r�boM��]�_��R��?Wkl���o��z�ApY>��g��:���4�p�x�V��W���0�A�82�g$��0��!�t�F�b x��Pni�Az�t��p�_q4R�[R���h� +3,G� �?�a�C��#xe79N��0��zMgC�z +���i�m����(�������(�t-Ѯ|/��G�SBӐ3􆁌�KAf�K|Rm(p��.��3�x�`�`/�(K&� ^�` �8��l�r��"�,7V��z�y����m��J-Ԣ�U�{���n�^h#�07��=��f��AT +�ㄆ�Z�@�2��B +rѭR������ +�!å�7�0�8Q*p�`�EA�ù�[&ib����+�p�b��E����Lw1���y�q:�W�l��W3��.]�j6�A�t�J�p[Dj4��cv'�t^8]�X2:���;�]�ѼΙU�_���T�d��_XI5 )f�� �<��]�<���؀�����&w$T� ����D��J�P���I��8n��0��v�i}���w��3A�2�/��lG +"���h��F�p��򺣮� �t=7䇛@��V ׃��d�� ��5�>�^d�����M�3|�0��I�D��4�t� R�� 7Md)|[o,K�>H}��ܳ-V�YX�4��s\��{ΩeϽx�*CQ�-[ю)@ 2�P�q5D��&J|`�E;�1>čл + O�l��BIV�}��n�d��P��̒��C��jރ����\� �$:��$�h�6���)���ƀOt�y����v���+�G�ƛ~p��RaC�& b����4M��H5�E�8�V�`�h���mzD͑�C�E�q�����.�%��U�"e+&��N�x=ב��Eo +�A��6'�]���5�0�{T�\OR�l�N6��w��H�7�"�e���$h��\�r��>�@��0��$.�o�I�@ * +��5��M�r�ӱ�u4�yݲj�Ǽ��X��@�h��!��xm�� ���R���=��G�@� �av-��)@AG(��0��N���N�[D�i,��U�Œv��7���z��HV��&�C��M� �a��b�_pX!u�U�s�aqR��ݶ�B�Ymd��<�t�� +�S������g��~!�7V���v�GQz�=�8�Mp� ?p :��u i�_ R�X��������v��?�\rj�� R�V �� �`���I���V\bH�C��T��5R����S����P��}�A���P��;V���ϝ�)�K�t�?��7��I�a������/��>T���7 /Arf4� �@v5P�䊠E:Π�YN�m������Q�Wl�m��"'j-FO�[�� +���d�U'A^���IZ� v���q�� �u˩ٝԷ ���f�uT��2�kf�x���N?h�2;�j��0�o���kIz��`�>��8xA�����%������â��n�D�>�hՀJRKBK2j�/`6�(�D��pA����1~�y��I����E��s8�1]�֦����7��3���"D�]�X�sV��\�D��bd6̙�����B�Ҫ� ��n�P{�1� Y}�������hk�j�#v�"����6����8�9�rVn�N�W�F� +�����E)9/�$�[�b���GQj�?�Ł����1lO�ɐ�ʗ,"F&^��8����Lպ��/7X�@!�1C-��$?9��9�1�ct͂.�^,\��1����Z�qI}T����>�ޕZ�'����70�Z`��;Ns��,��0c� 8C�u�_�X�W���F��>)��ʠS�&j�� @T09�%ʣ�� +MDP�l�r�-'z����P�u���Y^���-�q�`������l��D�}c�[ �Uڎ�\�B*�c�Iz3�a3���zqb��8��h�a{ t,g��+Q�߂W���=�Q�Rft��h��7Bj3�5(M�A#y���TJiJ�=����<��}�2>H���2"��":�����J,���٫�t ��s˷R�m�y"��d���ϕY t����.�DVB�r[�òC�rE+`���p�e�4��j�^qBo���+�C������%�_�k���+Y�w�j5†�XF��!Ħ�"N)�F��hv��~���}2�����F�[e%x��G�Ϊ�;�d��ՌNz%�㉖�l�d9�d�~��:á��=�ђ?��i�[lD�����d6�GoI9H��Ib��XՁf�c�Զs�&��ņ�T��q����;v��NnZ߳�۞�t��9��<�vg:�}�u��4>g���d�`N�@A�0�^���q��s���sL�y���>|Vk@'�N�F�@b��a�z�ȥF�d럂�lL��~4�3��?wkF#%�W0�O�]h�-:����%�0��`�Z�`S �R�G2�L�m�p�#t������2�Ӽ��"ԦC��`�tf�j��J����WM�䶜�j�nX�k�4�t3K8?���:�a��ODs<�6�������9v��4�w;�5��������'Gp�B �[����e7 �͐@Gz�� Tj�c�T��D��bj��`�Zb�L �FfA�1F���8?�D�u��9�~7E4���S�@�4���(z����S�P��4��d��j��Gl7@�L���A�ý +9v���I�M��z�b��SuVr,�y�����S *Q0H��JIf�#�|�(���C��X��8���|������&A��(d9�*�M�j����#�cs��������2��e�p�yN�_�`n+ǰ��Y֧,���&XR�����*���R�U��(0I�!2�Z�D�$L,DP� ���ӊ�m�aq�m��ⳄF)z���u���y�Ԭ�Y��n7��f4�Ы2�4�q���24ד��|�����Uu��+���j8�S '�uˍ ��x��/�Wd5P�j�� �����gj�w"�\�i���5��"�Y*=T���'4��/�A !T(̮Ŧ��� �+�j���f��T g���������P���ם�v���T� �m�V�\��\���H�`�q�Y����*�Y��:T�=�I�a�;����8�r�E�jmL����T�(�-�%�!�ޫ8��@�YgC�4��ul�7]כ�9�����bt^���W�:�%�G� +�F���> +�m�Lt�D�t+F G�����zE��*�a�R���5{�q"����8�~c����砊�uAA�?w;���+�4�(-�+N���9��9�KF�t%G.7/ޱ��ʬ�:ƫ���� �I�l��F����J�^t)�����A!E �g +����V/z�$IV1@��!��E���B�Sil�]D�H-L0������4=����.hZ�6d��=�3���ũ �r�,�NYu���ar@�Y|��d��F��4�Ui��NP�O�L����Q�JSIvŭ��BK�c�C��6����4��j�}�e�~���#x��SJ ΄�%�C5�_�Kc @t�)|AV4U�5�U��j�sAݲ:����,��ǯ�{��YV�)ƫu����k:?0���ۇ�3 +\�� 1Af��\��V>�AرN�"�/� ���5��0^��<��9V1�U(�g@���0�M=ہ�o��Z�R��h��Nj(�ۉ��;��!�یP� ֶ"���8%VM�r�x��Y�I��/$ľ�0F��\�.�+���G^�|�8=�8��Mf)��z���vl�� D�@HiB� ���X�aG���>K�� ]ੂ�X�жAj{ d��d9�z煼e�d��ߡ��=T4=�e獆�z#���N�K��(��,�_�b����ڌ w��ZIV�}4��d�^k4E�4*�) 3ٮe��̢���x�a|�k��b��k�[�ݍX�n��1�4�q�g�9%�:�tȨ�.i��c$��d�Wi�k�� +� "�����G0�����0��5�.8�)�[� +���3=�V��h���s�g�P���|.�X�J��(��n��փ���:h��b���|�j��z� ����Y�(���8��$�u�����G�Vh$>�1;Ngd�lA�l�b�g@�|#H�C��#���䫶P�$O!|B#yR�y��r=�AZY~��ȩR aCuF���^9����H�$un��T=g�,ߟ�w���w���W�t�����c{n'j�C���5W�� L�F,�T�?ShH�]d<�X����R��pSuv�&�LE�%��+�C�%�@� D�茡f +�A;fA|J+I��w�����*-&��f��*�z�~#�y����!��[Qh��S;�$�#�@�x�ahI�y�� Ë��z+�c��u�(I.øՆ���W��#�� H����y�.�NZ���cV܉�~̚�9F���WM�lj�"�\�j*M��"��?�ρ����S�� 5矛��8R���*��i�l�hH�"jہW�����̲�Nm;Ϭ�㤆�}����3L����,�|*��o���1��9e5>7C��,�h�\l!;Kn/�2��� +)ʫ/ǩA�sO��V��7Ү5)W��˩�7j�rH�ݺ�E߱���g���6h��If���`fHCo~γ�-dyU����5Pp\ loq��~�h�ǏʌA�2��8�m�g�f��+E�j��y�# ���%��������*U�|����k�Nӽ߁��Nl|�e닌� V� �mG�SYIm�;���"�p�F�` +`��( Qv�.��h��B�F� -G����E�����-z\k*F�����O�s�� ��|M3�r��Ff����ݱ;��=�Ģ�0K�}'�� ��p�Vc-�HhG��;D� 0Y���4!��~҄Jc b�z$)er��j��C4�`���d�8(r!Lb+�a�� ��R�%)�Sb���=wB,�S�|�A����[V���Y ���5J endstream endobj 24 0 obj <>stream +t����3n'��ݸi��!�+6�(� 6C� +3Df�W� ��4`P�@��'j��B�_q.K2~EI��4�����$Z� t�L!�h���9B`Fj��Q�� �7�i�&#x�)�c�!2�,��>�Yh,��[��� ��XGdsԭ�_���ӯZ���*3!Tb�8��@�(�5`��1PQj]���m�:O��̂�T"�*ˀS�� �7A��i�b��TL�� �+Z�| )Y�=ۑZ��h�ͧ:���\4_�U��Ao�� ��KF�����������㤴��Zn�� +n��*���5�����/�V,ǽ$�r4N�Q��N�e�}׮���6��i�i���B��d��<��C��3b�����J. {{�n��h��`�_h�,:_�Cz�u��zk�m��-�T�# ��x���\gj���֝�:� y�zd���V�%������+� 9Im���Z sl�U�z(���t ��<�r�l�?���V5hU�ն�kv�b�Gd;1{�O��}���.���~�~ �z?�s�SE6�G�,f)�G�￉o�� +��#h��&i>I��`�떑���`��^��ǥ�� +�S|�ϓ����E�D$�;��`JdtPCs:"����ĺ�Ak��o�o~3����V5>�-��*23�yJ�\�Ɣ]�]*�[h��=HIJu��R��j�\m*�$�%�# +.ɨ=/�� �i�����i����GE�>ի�o�o��,��������t��ᔬ��=�B4�A�d��cY(UקU2��.�.B� +E菠��8��$�x �����/ϰ�˦�n��N�y ��4�4�1X9zg�a:�8R� �_� 5�.f�4���l����ێݠ]�}�%ën�wM��� ۱۹S��7 �����脼�:�t�牶�/�� +���zS�E� h� ���BЂ�A+�P�e�P:����.�Lf!|Mr�$X�C��Z����/�����T��� �뾐��������޷�q�aw@Sf(��ާyVZM�`��̂1�����4��,ͮ� � �6X<�8a�:aS�� �t�)������:��b:�(�Ђ�j6^�b� �%�GΒ:��&8�9�X�O�iɱԊ�T�Zj-�Pj/�Um$J�8j�N̢�VHq�Oڅ&���&f�v���ͨEס۷އj��H�p��9����^�U�a�_�i�Hb��T�~(����W�4�����mX�P+�G����ICs��Qݔ�ٝ7kf'�����;�4T6WEtv��u����������bW�RK��yU�⌒g`�FU��z���+�\�!|��J���Z�UkZ�Y D��AF����� &Vۉ��M&�E����M���ە� }�uOm��������ݾ��� Q|�"�A�g�O�� ��?��[ ����ɕ6��I�^m,�p���8����"j��<��`D��8�f$��0L��ů /�� ��6݁s5G�R�"�� ��>�T�F�Ro�UM/V�{_tޗf�tخ�n��Q��Z6�����7�Ɖί ���e|N%�sb�wA��`0�0�|�$�*7�+z��&5 0^��� �QY���EP�L�ыC�Eg1��5�u_���y�a���� ��FBo~7��o:j�Bh��3��+��,�KJ�.xV�,�j�v�m{�u�\�~˝�%�g{�P+���*�c��-�L�q����r�hd���o�֓�o=hZ.��vAǎV�!n����j�9j���Z ����� (9� X�I-~���0J=`RU_�QB�0n���2��s��>LK p̒�h�am�-ڮ���>��>����v^���5(AB���v�h�&9/�P�X� Z�f6Pd3M�ە�m��~�,XHҊ�'Z����H�bt��X����b�vWDi4�Y7?�Ry�0�����T�c����;Td"Ǭ5��X=������fr�Z����Î��Y��qԢ�0�z��8�# ߃[�� %�qf��$��X���6�WV�r�+��l�g�m~��R���"3:��L'N����o������/�斛3h�ρ^�1@Q.���k�`� 6C�(N�>��&>9P���2��p����ےa�^m��8�#�E|a�P�^�L����hHN7u$�� +��T��?$$��r�l�f5\��ezo�ǭ<��V�Xcޢr���}$��>�پӄ��<��'7�or��#[�i���hK  ��𙂛�$Z� $R�(=���]�Zp8�.�hՌ$Vڮ�8�z�d����]2�%�2_IexGCq�� �����z����l%��=�w:������&�E�lR�"3z�zD*6 2Jc�l�d��(�(���M��D��&̮��%�o����q�u;�7V�}e�ڊ�TY ���;R��:r�C�Bc��|��v#OV��� RY�bW]h]��뼐��F�<�V�l��Y���&���̆P���4Zln��<�Yl�.|Z��]��:[!#e��V���@�3�JR�/!f�a�ɖC�`�v�[j0G-� .W1�!V܌�� +�U� ��[�+��c��3e�{ذ]�M�u�anܠw��h��=��j�����E)�K���_�Yj��Y?�5��;fanՁW1�0;� �j�S���D�q �&8�+����)~Xk'J�����:��Q�iT�o���}DX��j��Y�p��*|Ve/Fr(E�W�>�e��[7��4 H�O&K-���,�WX��p��R��Ԑ�t^ զ�B��Y�;�-w24�A�P��$�u_�͏b�tU�]3 ��z�t*M07dN��9��F�l�a�I���y2��U�cW�*��~�[��dR�R#t�� n���D� �L�&�As�R �i � � ��8�UZ�9�LJ�vS� $��Wf�|�6�on�{$�����X\ +�L灾���nEyƳ4�p�l:�B��d��j���m�{���Ď�Y���Z���m����r�����~CYn2�Nc(�Sd*Ʈ8=Ohf�m>���%�E+���[6h�����5O�\P:�gb�~�����-��%��B"��J��Ř���w�x��Y��{��{CY���,�ގZ�� �����Z�Y�� ��f��6�L���Y�u ��>�[n@+:�/P�6��-����$I,�!�9��<��i���(H�On�����]ɋVC�O��D �[��������8�4������L�����4�/��x��4���$W��'c���,�xӬ����F 3+�=B�":���&�bX^���:��X�@�J��D�D�U��?���8>�}Y�� +S̾aGi��V��&I����H_4G�1��5�ǩ�߶߷������`3U�Aj�E���Z+V����aie��y��� >A�Q���Z(�ϭ��"PQ�}�9b�4��h�e� 3,7�x��Bx��b�嶼��ĩ��4ߝױ��֌�-��i��*~Yn'���`������S��/Cv�jׄZ�'2�`X~�Y��\���f[$N� \=C�� ,�s!\���I &H�Y ~Ilc��櫆�i���)�p�%ͯ8cؽ�� + �� �M�ܦ��������:�Vh3M1ܕ��i�� ĸ�%9r;8�2�#f瑖�ծ;D%�} �ԂU6�Gz���_r9S��H�3 4V�(L/\�a.P0� Y���J���R�q�z+Q���D�}�~7$��2�sN�~¬�h�ͧ"B�aEtf�ihn缾���{;��*�����Omܯ̺�?�t��i�$��aכ�R�-�u�U�]� 3Jg(zZt7Vph��N�_�� +`���.���+�r���ћ�OR[x=�{��@Xm"|��:�\p+Hs߇Z��a��*�ۉ!������AG���k-�)�Ñ��G+��8u��W�]1�7J�5��6��٢Oha���§�f�L��T���W��s�����$� sKZ�w,@q_E�\IЌ�=��l��<�:��r�s0|��,�,�u��$ڍ���n��ڌ�w��P�%ye�Զ�!Fp�#�7c�E79��I�\��e��g�+�P�F�d�|U13��N�Z��ɦ�b�*�z�u_��~;d��0J��V��T��9�/���oQ��+�VqA.��S�f�s3�\l&J���蚮� �;� +����} R|Œ���z�����X�(~Wm$H1| ���҂�1�zcY��2�v݈��y��)r��t��:��^'��kI��d��?\�����P,7���HM����h�a> `�� �8 ������=Lhf��&�+5��W���QD�i E)f���b�`�E+{ 4܇y��#I�z� ��U�=Pɞ!8ٞ)0)r��ي�v�Q��x�d��LZ���u=����́ʑ|��:V��.� 0Kc-~Zm%�Of+Jr^�h����C0gVKR��!�����M�_��� �,7'� og~{QtZ��@~Wk8H��(����~2Jf�d�a�k��TN�e�Y�罃�f�'�)5��X_Ԧ�;R0�3X, *P(�Y�� |Š��G����w�P�����L�f< ,�a�*D_N��r�n� -Hc>�`\��x��<�Wm>T�^�L���7���w��� ��'��dVae[�0S�v1�b����/�X���N�D��W�������Q��;��j�@�tFsd���uP��f�M��K�a�h�o�$��eR�S�f��0��Y��;Pv?y�ו>��4��j�`��Y�(@��)A� 7If%~��p�a�I2�B����G�m�e=��K.�N��$�u�Q첗 ��췍��kJs�D�`�4�~�S�d?�R��0~�c��L��Z�a��hy�a��lC���'2@��q<���nr�]��zTt>gZާ8��'���b���-�3R� 4Ue ��_F��1�=��M������$@?Usb{.��W��J����#FwR�nx�o��� �P�F~[g\��n�۱ �rH�Wf@�L�P��(~��,�q>P19 \�^v��'J/��t h �{��P�i:%�]Œ����݂\�A�g����M���ϗ\�Q�����&G��*���P*�(j��V�a�Qk�b����bg�.���@O�{$X� L�l��Z�,��8Ne^�o +2DcX��4�,���vH�[p��4>�#Rk� :O@��A�b�U���Mb�k��:��gQ� KP�q��$C�ބ�[���5(Hg`t�Z��d�i:e8��i��� +�b��lF�?�cE�̊kqs��A&� \NSM��#:7��t��#>�+Bw��|X�~+���<��(~Wj����}��@��=*4(�0 >�T'r��C�������4���.8$��� ��`�=W���)�x�2�b9���#Uϥ0�� j�c���{�'��9 F�� >�_b���#��ә�;���V�p��D�s%J1� �]��ڄ�"8 + �5H�5��V�W+N�щlF��f̪�R���F��K���C.��-8�8�$�1��C�(�_�^yh��hUOD�b�h>a���p3��Y�w��݃NU���� 1Fo������%����s +�Ӛ��2��� ^��p� F��t��6�8�a�AQn������V�|�y��N��? + �z ᗜ�r�7a��Q��������zc9��h��:z^q���n -�!4��Ow�g�֗xIZw��?|_p D��X��2��^�4���]@��]���Ր9��$~��B��������e��聚��1jw z���D*�N���8!F�E�ԲУ-�<���ؽ�JR���25Yv#�Ķ��m��EI�w�a����Ot�_��[�aB� C4&����M� ���9�5���(Jp��Hփ�q"��d��e Izɩ�E�y���:�Yk^���/����R�x6��\��U[ P �Eo�̂��ʄ/� �$��IJ����r$�_�by�X�r ���:3�2��`��HA�d�6a�7A#�7���=�4H�x�d���$($CFo�E��@�T�0/Rl?��Rm��d�`���w�� ;D�>Oq=Pht����Q�Y:S1��KA�+n��f��Z��J+��� … +�H�\� Z#Er N��,ɰ��I+B ����&c8�&BG��g�lCN��,|Q�� ��ȀU1��#��'24Pgr��T��|�-|����A䪋���7MC�DF��N�Z����&|Qj$~��(��� ��F2J�S��(��2�$�?���/�Yl2�\u��Z�4|wY���\�7հd�6�I�|� f�J, H�a�8�&�ў[�_o%�*�0A���[�ca��U����|�T��D���X�4$�S�3�ᆉ��F����0�Zot��$~��>�^n(�/6_��Ij�K��<�<���a��(�z���̮�v�g>�2l����1�t��9�/�o��ڿ�F* �[�NX�E�X��9ǣ^�.�a��2~aq@�_�U�����e�r(|��"�5�� ������"{�В����R>�.Hq���2$���}Sh��%�aC@E/ʁ +5ܓ�� Ǯ����$܆�������4����.�B W=C�ņ���"8ݰdu���+~��+~�� h��"�8j1P���f�M� +2�Lx�L��U���T��\��:zFm (K� V�[-ͯ��u�o�*�p�D��{1c')��4���Hˍ��"b�xI�_o(z������MKpB4g�B$�PsD6�Eׁ��t��.� �a��}J1M��f��LW�A�h~�&�M�����cQ��=`��f��k�g���z��]��ǀ�̺�2D�0Ct���f��c��d��!B0FI��0�� 3�Z����$��`i��t�f�Q�<�����w���s�9BIR��(��AT�CU6�dVR���l�f��@�H�y�I��<�{;B�\�lE��� �p�������� 1H�@�7��=���y��%������U�>�!�p� �0��Hf�ŏ��#;G���i��U�KmEo�,�G�J��� /T� 7Hp2A�jX�E�l���%� ��݄O*�B ���2@Tk0�Ti p��D-� :Idf�� Z�����1��]��r�ay�v=ǀ�J�`c�*yf��6�5�����Z��af�è��s˱�}�p�T*N��;Kd^��#n��f ��,K��Y��<��Rt��#�i��x�踚��!�1;� ��~���y�f9$�' V�Tg�g?��k���M���,a�*V��4�i��=h�f�B�B2ί�=�2'��#M1^�@`B��@ř������(�2�Ё����/�Vn�,�8Ph)t���X�l��$�W�{B�C�^A3��A�^!f�,Z��S���:Pi1Kp����Ajc�1z��)zo��KSU��)��8��@�Rh|���,����G�,�m��J�@S��K�BheaR�� j��,��mWN��)���r� s4�s$_��u��— �ФG\z :�v bO=w�\���?(��#h�z0�xu�f ̈́��� Xށ�dW%�� �{ ����)6��NQ-|�ynY�A���M��X��,~�� � �\���!�+:��m���j���� +YG�����M�`rf��!x��Vq�;|`y����xE����[Q��`��;Dh&כ�1 +b�g1[3��yP�Y��J�����!�*� )�xe��!��O �b_��b+9��2��\ 3�O��y��: ���C�)�@���1*���E;�G ���U��r�/����Il5P�SqX�PIt��O��D~g��x�B����KVH/��b�nD�� V��9Mk(��.9����]g�1�s�5���Q�9��R��xis��M���1�s�$(�����O�H�}БB�`3�VS�Y�Wn`1Õ�UB {;���,8«8>Zt +.Kd1|��h��>�W$xȎX�E�VE�[ �-������ɦ�S�N)��>-7(V1 P��P8� �<����y�g��WmW‡H-�� +���?8b+�"i�@ ��R��8�⚮Y5����D����� ,4��O�G���P+%�<�0yv���{P7��/9`�'J0����2�&A ��^q �خ���\� +@�M�0By�a���� ��-G� �&�aP��(�E�+!��V�,�m��Bc��G�� �I�=�G����=�]r��e��\��Z���pr=b�f�m�c;��V^��_a��W�a�j�}�S ��p�]G0�*� ��v�r$���P�tp��@�+�L�T��6�@�5 cf�M�Z��4��3R�|�)��C(/ѫ�c�Z�'6=�8A1� +_ +_ۉ)4�8O�K�@e[.�s��� �E�x�Qy��8��S�`�A*6��~�=߉��:Vl��)89�w��Z�(z�=�\�?Og d��d�� �U[�j�Ï���c�̎�L������ /�D��,�|/V�e��� �)3:Ip_�mWBG�큑����������V�� �ᬚ `�̗�@- \�`e���fm`1��n�I����Zf{f����[p��u����1��J�p�+�<�u��rK)��5L� rM���mȸq�p9J=�w2��> �-| ��#� +���hzO���b�bt X�]-���x������Ɖ-;���?Ul+~Z���U�δ��^�Q�2�N�C�&���=HJ�b������B��ȑj-���[�Q�@#�F�� D X܈�?R�vR,�F�Qn,�(�����L�'�0�I��˞�� ��WLR ?|~�_�Zp!ŭ�fXF֛ؑjc�� +��l��X$̬9Qd?h�nC Q���� �'��c�.E�*NB � 6I�\��6���& 1Ru� ��u�x/"� +N��ќ����@�� +�@O-�Mf+P-; +�1 :Lf,�Yq2�\q#A�7���[HRK�oi��IE�X����� Rو�����F ���|��y��(p�Z���B�D�z�&y΁����ʭ H�k;Um)|Yq5���g��#$u�q�r+��d��i��4X�^r0�sE9�{���Y3� ����o:��� �V����B���+����/�R#In�e�^�B*5 8H�1K�?bw������o�D�u����71��K�`nMk�/͒́��'x��\���f�n�ov�`Hgx�%�����· �;N���1:-����=�4�y�܆S���-������cu)~��r��M��WA��*zVk=��P��A�����_Ͳ�:�@�u�d�� �u>]x9Tn =[u4Pj)�0F�-)֫ �P�?Xe�}��(z\�@X�F/9�X�߹�v8Th:���z&����N3]W�TϽ� ����������iȁ"�p�T��F +��N�ێ����#Ű��,6�c��r��b���/{ -�G��! �Y�b�t���M�t.~Vhd�a��O�<�I�H�]�I��蹊c��W9��x�bz�=��Y +���zEY��<�x i�?��i4�o����ܞ�-Lp��9��0�s-�u����é,�H�;Č�Y/�� +z�H�Q�9�A������j��b�[��'H�Df��e����l�b� 6Hc���p�R��#j��@�\�����:�;(!N��1�A~]j�|�^���0����r� ~�$9r�A�Wq|�B���z��.�(�3��3�$�M��@�^��5�ﱊ�.�^�#y_�D�W�c� 09 1VnV��X�t���9��zů���YG���/�Mi� ��"p��F�`�y����Xςܒ��"`��fP"Ė��}�m<�7M���6��*�U�[o-�Yp#~��@�L��J��D�|i��' ������$2გ���:~`��,\'E�EOV���U\��U[ +ߕu��$d����{R2�HM���=0 +��Y���k;o���A]��,��JAet�,�B�*c� ���v:�w٬�(yރ�D�_�L��(��� �'���(����خC����v3GvE�Y�Xk(G0�J-��^�.�0S��a�I-�M܇��4dy�G�� J�7V��~�Ԭ�y��@�\o,�Wm&D1} �K_�����>u�� ��^ �ֆ�fwB�1.L�~���(�_yCT�u�l��*�K��b !��O��{��/)��%ǰD(F�i��F�ZOD��G��;�L�b�*>�����#��Ls�'N�v�(�ϒk�U�y��X%�E�=�����#(�����b��n��1�\p=�3߄�r�Zsn�x'6�?��-p��%ɮ���,����Wo����6Ou����u���g��|�����%g$���Z���BV�w�g~�R,���u�j��l7Z���7�W�;P��b��-��U��$������Q첯R��,��)ͩ4ⵜ�m�=��%�4��Z���<�8�M�YJ{�T�"�U/Q��O�Uf&J�6 :I��)2��Ø�6�T��w�vB ��P�{���/���N�^m2�\l1~]q%p��V�|�]��~���i��$Ư7�)�����+z��K�|�Ih�jQ�U�a���x)d��N�IP:��ي�Y��6M�� 3L�b�t���Sj��cW�?�n�2�@f��4��\�by�%�]f +����P�D��j��8��v���Gow;�v]��GJ�tNj�nim�}Y�p[n;v�jJJ�6�$wM�klD�U�35�e�q���Y�����:"��h:��ݾ��왍�t�F� �K������ +��&����;��a�/hV���x�*�͎�C����A&I��%�,�O�[�w���vw͒��n�Ѷ�F��LB��4Qhd��n��L��Ҁ�g9�Z��q/*ֆĶ�f�d> �'� 3�4�#�=Oi$F�:�P�݌UK>C�b��M�ٍ�y��嶢����%��B<�V4<�U>7���A��D���4^��D�A�Vj(ʭ5����*�{�d�=Or�)2a�|?Z�������!F�-��b����]N�h~GĪ�9N5_�����n=h�^���-�Z eҸ'ĕ�6��S$����[��^�����L�Y�g�m���/��:���T�X���� �� /Tl1z�ڂҳ�� WU��T��`�V�a��;y$66���8F�U��"ʭ4����L'��̖�J,���D�k��O������>��O�4�S�Xi1V-3ɪ�E+�I-5�bWیc��Y��H����ڋ�K�F�c �qf��HN��$��l��;��KZ�x�l�N�%�Y�ak�j��3U�w�l>J�,R ��8���v��Z��q@Z���T]J���f9��,�U�h?q����{B�C�jaz��8�r"G1���Vۈ�U���.������sHMa������>���l��>�,�7�$�c��v�_o�!�6�ѻM6��G+-��-����Hk-�+���Y�bvΐ�8y�� ��†���^`]��,0��W9 vK��q����ke6j�kKAd�5S�߽�V�Ֆ�]��:t��"J�#�߁\r�{6�&��5_/� ��f�Ev�2�_\���G^h�y�gjv�����Hj�{�c���ʅ�Ő��Tv���*�#��F�,��T�q4T��4��G�o��(�u>K��n�d6�i��w]חݵ�:����GDq=w�l65n')��`�_h;�u������&|.�M��Z�C����9+4_� ��I�U�R&0iXź�~�cOJq6�6���ćz�Gz��{��ZC@ARS(�c�L�-�m����牢�5�.6���|�u5�UMa�*"�PeJ# �E�����R��)�aZ�Hgܤ�$G]1���,�Od;Lf9Qob��������vFE���i�[w�\[��FW�1��(*�%$�,���&.V��4k +e�V=\A�-��D(XEQ4RNY7EU�l�f��N��yI��Ĥ�m@Y0Z��LF1��X��,�l��/�:߻I�5(\&��>q�c����H\�CW�H[9_��5I<%��`��L#�ܧ�u�"�2s���q�a�w��"�Y����|��O��u)��j�v �����ƥ.���dHIK�IJ��uu��5�&��\��6�,� 6�,�U߹�4�g����Bb�x��w_�7q� ���t��Կ�'���)k�� ����� +�QV�ҕȤ��Q�B�q��J`qcP׼F������4Ĩ�Y�$�S�Y�(��̌�Z��Sx}^<`gF& �ĘW�%j���:�K�O�x=%�`YM-�������-'��ɌU4�:�vb9nXm�=9���e�8��J d��;li.����� PQ"IG&�v��G���2ZSJ�CM��P#T�.��W{t6���A�:PU�⸔Fz�nM�2�R��V�+[�T��AymQ�aRR4�S XSS�� +J�u�F��%u��d��Ĕe�D�u�+��N}�c�^�nZ�׭�v���M��Fޑ�ڢ��z�7qMDU���@XQa�Z���44b�T�����b�7-��PL@^TS-�MX&J$@��@^WΆ��4)%�u��7�K���͞��jNZ���=%Ub�l�|�����".8Z,D�8����gB�P9/�� pS���(p�|X�Y���?�~�l�3G��\KAE�TVS�1Jr����������������$@��@x��0�|�I@kӃ=�v��Aa�!���Q�ͩi��4�;)!�QL�wTW<�g�ᶘ���V '�dn���1Ŕ�(�@� M��r:T8<.�0��†�14��Ma�-���6��3&4t��Ͳ� eM��R��� �R��R��)�G�i5�� �)� ��IA� �>-8J8�GO��i�4a��x�P��� @��<���� F4.�Eg�dGw�s�� :oaY}��E^�YS:� +LL�1Y����p�h����ƒM61@���'.J](+&��֕��MĤ>�rzǍ���`�3��k֧R�+ +�W�mz���ŕ�Rq�aul��*��p\r(UbB<_vHTq�!�3?2�D����*���퀗�Z���p����`^^CV���5l�[�~�qأr�)<d�"�e�:d�V �37������`a\�m�q��'��2(� }z��B0\W���Wg,����V���Dar��י���b�-�˂���.OKa/��C"�1>�-6 �%*�+3�3=/����!���i�m*�ʙ����n–�h���<�K_+FP`J���2��,ĵ�a�}��6W����UٖI� �u�B��P5*�0)�WL�U]?��T���7�T�l�*,��R�<}�@���f����\Zg2/5Z�Q���_u�Y����Q��j�-g�4��jU���W ��A,�D%��V1��W��)0ӖX�� +�fd�Z�8-u�tEu���:uhY�D��P.RI\=�������,�{�hΈ�t�A{�:���|Z�PbE3#D$�,��:Ӄ@��Q�����D�1"��r�hE��{�%j�����*$���,ӵR_��hTKn��T�~�t�z���d��1JH��Pp���O�)d�TN�Q��+*]㄄�m�}a��H׵J��5�gj�YUì��QZbDR��TZM=��/���f���.GJb�',K�i��NJ��#�Ф��xe�b²Y$YR�QM$_ף��)G��¬���]���2m�d䶋��x%�3�M�,�yn�n��\�� v�}5 +ϧFbd(٤qT�,iI������nٞj(�K��FT�~��]�;��1 ����㥳�{J.���S��q(M-��Tl��z?���BYQf��T�U�>��i��d>��r�J��T%�tK[���%%x��ێ�n��/���� ��$T����і[��S��F�:�1B�r��N���caH���4|���f=���H���|RU䩰/v՘�<��~ +��|��6�v վ�����âې\4[Uh����߮Jb5��Ԛ��4Cj��;�m���ڮ*1�X�T��Yz�Te5������5N6 �� v�a�m� s[���(��<�2#~�jR��[wh}��j��4��*�(y�#�G��v��JC�6�a�Uo� �t��s��g@LQh OiU�&؍�m��v 7��K߲��,�����$4���y�;t~k�ӚEaj�+VY qL�����j�1�Fa$R� ��J�w��6��َ�c���Z:�X)�{���UG��З��kf�۝�%���zOK�-"�ɔsKEVg D2g�a +��\q�x��W[q�J���Jo��bPd�(#�UXQ�EU�r;NU��H]�/)4= +-W儾�Z�@s���m�Hu�@��H!�{���@Abjɮ�n���-y��X�c N$�H�Pq +�Y�U~�^�c�]oj�:� +I��R��O�ChN�0�"�2�֚�K���DeV"��Nq-�x��ت���T��ķ��RU��;��]S�$�II����C��h(��*2�s��ui�MWڲ��W����N;yr�{��ڕ+�/ ��[I�<�*���* 7��[Hc{�U��a��:P5}ʅߋ��x*$9�)� �Ԛ�l�a4!!�[��;N,� _f2�7��̠������ሊ��h�|�*�>�N�}��ش�~�a��� �k�,>���W7�鷐��O�\�e�- �駎�z�%x��)m��J���~�Y%�c��r����=�Y�o����|T�ܯb%��Dޑz�M�k<�3��H�q����8$$t���FL�b�9��t��Ң�5���]�M��@�nI+<����WJp?����L�Ȁ��Q��?�j;�{���⻆�#x�Ԋ�z$vr�i0V�y0K~����zĞ�8�.6*�Zq�����x(���e��xFO��e�e�] +� I}�i���KZm-EI�f�T�� L�mK�a��D�Q����M"�u��ОEa�k�ܘ��>}��e�E��q>���5즒 [#��>�>�w���=��2 �����_�o}���?!���l�[ # h�ޞ��7 +�i�����`�ȪB跰&�~5�wZ��$���pB��l��IJj� s,Wr�a�a��;���V��oi*�� �M�C\e+֫��^�Z���N�q��O������h�d6i�M�U�n2�qR�f�2�㩌��E_��Զk�m�)�YQ vfn��[3��g�fta���� 2�s���ߊ�u�/k�cxwz�!�l8�y��e�5�l��xM�����;ְ�,��  <��L��:ձZ�u��XDiz��4<��ٽH(.'�5Û����o[.�]ۻB�2���8��\�_k�m�x6��rki�Ɇ���ơ0��ؼis�ղAl{�k���~���6*$y�+��7�e�d��6S #{r�oZ!7���-���QP"�`3}b*b�})��EBo� �K�DjE�� �f�����br۹Cl����?����J��z�m��R��+�G�`qC�5蘾Ԧ��+��� c�Q�Jۉ���,�_���Ce6�����V唎�"��Bⵦ�&��/�evB)|N�{�j��\�֮A뼯�ί^�y�%�S��Ǯ��"���4�~�Jk�S՚�Z��Ab7�e�Y +`Zǯ��D��0�&6n���+��G-[�(��5�F#�eבݳ���Kb�|�,X�JV�M�*� z�(�Ea&Ы6pʦs�c�g}Or��+��k����î����U��2sv�u�w-'�����b9����J��|Z7��l9֬1�%2�"�W���,*d��`��N�I���2��T�h���*�ͱ��pYMj�T��>4���P�%{���n���j����ꗍoz"ӹIa��6�6�"[�\Z�@�{�]fM�q�~+b����y'#�>;d�{����dV�bS�(51j��,�޺��옐������W�L�{5jㅄ��� x�j�l���n��v�e�F���<�*^�xv�8ѢE ��+N���ʑ������ +� +&^�p4!t��� *\�0��c���0�����O�3��h���r%C�+#Ca3xdޠ� b$��p��E ,b�����D )Z�H1�0��|�A ����O�32O�����|>�����|>�����|>�����|>�����|>�����|�<_�/ϗ������|y�<_�/ϗ������|y�<_�/ϗ������|y�<_�/ϗ������|y�<_�/ϗ������|y�<_�/ϗ������|y�<_^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^�////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o�|;@���#8*�`j�ԐT�6ͳ��o*ͅ9��@�6��3 ���m�n���%�/������/�%�t��)�@�������6�Fmv�����"���1�r;R�v�盎�O�nbNj��G��R���u;6;V�*&GK5l�p -*���kv^��G@2uv��ˎ"=g2|�m�ٸ��-�N�e�P +���~@�~�.{%^��O��m�@˕��v�%�n?���Ωu����A�� +�+��P���E�p����s�cuNkٝw�fëm�@-�!b�͂�U[����9��P�~���ΒD��wߚ-�a՚UP��퀦�� �l���ٲ +�Y� +j��� �=�����<�4|�k;�)�?-�Q�`����,���XV����<\n.��� �CZ�4����� ��D�X� �۹?R5]�_��f D��ZK3��E�6,� �P�:�&��|���ﻪ�̆ 7hu��廿���$�@�O�^���.�h3Tm3�d0JVCh�v��*�R�vF�4 �Z8���>M�[���:P +�#��H"�����l�l�TKf��}W �<�y��g��Z3)��LkY �U�;e��0�4i�L��F�ٖ��L#I��E/��������Y ��nDW"Rg�`���t@j�n�ӈi��±^�(Nj9�����-����`��9'�N�� 2�J{n�6L�]�2Ns>l��Q �e���5��-B�m�^t���s~�lۉ�x*�x�细T~�}��M�7f�{5a�6�6�X�����^��Fi�M�� �f�Ø�}��0���a�  � +��螫���F�[@���u��J[�����j�J��\w�V(C�>ZE� I-�!#(��=�vZ����6�n�6Qg�prE@ٖY�ܔUwIu�U���.�L����wĦ��M��$�.F�w-�q����Q �L/���g�׫�z��H����7�r:=�3�4^w���J�b9B��(��)u�*ڮU����b�j>K�wb�sNAi7��x] ���� J��*�l�S��>�6 "5�Ǣ<��yݹ��N�+��V'���6��ˍ�OX���=׋��T�T���qI��N�-�1��i��I�5h��U��_�ڮ�7�h7=��,�Y��>szfպV�����>%)ο(r��@�ڌ��^�r�z#ѣ�&B�����̶��2��vn��T��!5NCG���8��b4�QzfC���b����Uu�]��ʮ�#]�I�x���]�S>���8�U%�fA�Լ)��-���D���R�v0�q�ƙ��m�u�n���= +Z���7����i�Ŗ٨Y�d6�ٲ�)�.��{Йjs`�&�'�L�q�����4��@f���?Ŏz�f)���\���k~����M�x���Z����ՀR�lT�g6�Y���S .�u�Q���������/t��%d��1H6�̏�R���1�(���8��;9��%~��^��>� +��f�4�Z���S�WQ��"�0>���Ə�71��.�q�gE�y���:f����8)��J܄�R��R���D�w]�ٍ#���1�ϰ��A�n� U[ r��Y�w9Pt��=g�<�}�7�T2@ͳ +b�g5>|��<|�?T�/r�xb6�wQ��@Q9 �4n�i5�����01��r�n��N#h�v�Y}�5��=�Ug?T������ ����*3-Hcl��b ��3M�H}�Sy��c�n:�"�.)-����� B�u>Q��E��Ŧ����Z���+E���:�ǜB��R�_�8���{�V��n�cw+Dr�X/��-D���ĺ�g$� +T�`l!r��#®�*�]w���@t��L�0�Q���|�p�/׬�*�sI��K�ϵ�]@�� ��$�s9��1��{�_X\���^��b���d���|�q:c�F�iV���k�fg��j�1�2Kj���"�ܰ�����yT��ϲ�'� �ӬƈP���C䞁z�{��� aXN�OX� �̏I��R�g;>Xo/~Wk!�/7�u��~�v�뚆L�L���E����G֫ �s+�����R��(h�.Ih�H\7������\�U��&��Ǒ��4Ұ5o�?�E�@j=�FO���0 +X�� :Le&G�;���Ñ��/�0�e ��4����(��<���.H���D�|�$�' .�V�P� s�V�s�m/�%� g9��|��*�U��3�������]qJV��)�QBTי�~>���)6:`��ڎ�e� �o�@�uE�ٍ ��#�m@d���1>)9� V�����v�5�Yx����Nŏ���Ϲ����ĎU���e���&��O�^o;ѵ��h� 1c�6����h.�ܯq��n���͔G���M�6W+[�'ڍd�?s�װI�i�s;���O��ŏ���'�/>�*�A����������g|g1��C]2NCdwȪ��������xD)�FOt�R����� `�d�� �ƨ�s^�H�o�ŕpIr��i ��}P�] +��Y��3�3]�h���W��QJ�w"T�G���Kr��y���*�ߴ���<�tN똝��Ɠ�f#��Ο �y��/|�A좫$�܀��;��v�hl�f5��ﺤU~�b������R���/�Qk9W.�LT̮r4�{��>N7��i��ђs��TL�e�������_Ԣ�:�s?&9Ƴ�y�⼆ P�΃�S�����?��k�"�� �1�t�d��>�]w���d�Y�� �fZ��l�̒M�G����Taũ,$h��,�4~�p0Ms�c8�� �u/H�K�� rũ�Z+!��Q�Y��vnݲ��l_�+���1|��/�o��+p��H���R�� ��u���T9���*�-�g7Tn'G�? ���I��<�����穎�>�b�5Wi-v������K�c� +MD��V�D�k�� RM��4�e�f~�{j�wY�X�hv��4;V�GM�S��|�3����3V�jX�jH�i�8�s#FrEo+�N}E��L��<�v=h����f�,�f�.8N�,�����w=��Q�ÎUY���v�l\�d�r1�v���m�R���,�x D��`��d���=��_�T�]��~�x���Y��R�j��"9�f���3�� �*��j��y��C��\�Po������ ?]qb��<�d��,��"��3�b����7�#��gYf#E�-�!�D�[�d����'F���5 x�k��s�J�uG[�h�h6�[x����[r�{f�MW���u�n�ml��P|b�s�fA�V͆ՐZ�����U�gvL_4�lW^���%J��ϙFZm�q�E��$D�GŢՐb��\�7�u]�$9$���y1,.�U�Ag�Q��8�r�k�/��ݠA�i���8�,�m��=�Xj;Q�~˝ӹ4�o2N�E����y�o;Ly�C�'ڞ�Q���NU4�F�w+z���1[p1J4�7}���3�⼊��ܞ���� ��U BʷLR ��T�|%��9v�}�J;���{�k�_Tn��Ⱦ���B�i�g��{�e7b��8B��`9oS\��,�4>za���+52Te4�3�~����h�l�8_�3�=���ޥ(��i��8�v�8%�{^���8�f�.�Y��~�7�X�/�,��$��t�b��(�M�����|׽$�t J�rRH�Z��6M�?y��I�v8O��Ϳ�������gU���r^�]������ �}��ny%������I�v�d���tcuN��-���%�@Y%��rd�S����W+��e�"W���-6:_����?Ş��i��*���>�b�H2�^�,��յt�f6|�i>�r\���ODo�� + $����_��;)��DZ4(�l:%X�C�U�q ��r+|�r+Ex�����򺥴�Fq:��f�옾h5�T4Bܴ�m�&zB<�?�f}�QͿ����i{�)(���� +�ڷݷ[F�5�`ZE�����8!��%�p�hu�����V�?'z��r�%����U��s�n��ރ��*z]q�h����*�Sf&K08�����o�^u�&W\���/����(=�%�I�[o-�0��s=��,�[�f���� +���\��(�l�H������4��%{�ϸO�|�9�r�*�=7���:Ov_�%�k*��1�� 'LdP��`���D�uK�ۮ�*��X�ydvM�#]��0�u&�q��L������ !We fb��Y5�q��� �g���%����V���j���SP���KF'�T�3�H����j�,�]�h���U���Yn�>�4Dv#�����/~��"��)�#J�����Gj�'w�/f�����׉��j��2�0���s:�3�WM�Y��;T��A�t.�5]��̟d�E��$|i��=��;�Y?��k�(�� 8L��/���z�m��V6M��a��;P���s�J�x@Ow]�S=׋��n�����᛺�d�e>��̿a��P� ��4(�d5`�d����2�ap@Qx��]7R�a��̒��E�/ �,f� +��I�`�]�����0�5�S4!;YiN�`_T~g�d�c�h�HO��y��V[KRl?R�'o� ���'R���n�Kf� ��*�'Bm&^�Q1��4���/�5�1����R����Y]�������T���l�W�k��1�Y5��a��!v��\��>0��#V�uA�z�i-�a��U0�=� �{F��( O8���0���z�l���8�5k��͢�1��Y�az�;��n�}��:�l�a�l? +Q����8����[����2,�C����Dz���x���������R��|0Kο@��L��,؎���Bl��H�4�O�c;u+�# ��FC�>���0�qLk�_%�v�r:6�E0��s�OA��`��D������S�k=�\��3���}��z��عj ��F����뺝���b�������R,�g�i:g8�̦�0ϰ�x]���9��)�_�'+�ÍU� aX='��S�q�����@�n7Pt��=��ľ�^���%��O��ܺ�^�t�k�,�%:�g��&9.�u�}��?�O�Z��"�ދ��;T08,����CE�S�b��b�_†�ŋ�0Z��D��D-��Բ�?ֳ\�Z�F���Y �%�N$&gb��,�Y���m;�N��4�w�h����y�U=W���U� �г +P��&r�z�`�.5��E9֯�v���ˡ(�x眆Os�=�� :��t��@���h�N8���<�s �r�Í� �=�Ô��0�vCk�� .R Ϋ��3�����,�rzv�s����m�yzM��r �a�a���y�� ��)� ��U���ʲ�PV��ղ9$m}'T����c$�dV���3Qi*İ�Xu�I ��J�ꄶiwNAeu:�0� ����C�����U�X�Hk��i��^�,�Z�,(N�j�o<��m���S��*�a��&=�� O� +1^����f�4n�b|����H�\���>���ǀ"�ΰ2��Y��B�3]���Xe�Y�c9@]m�i�>j�@Y}��(r�o��N�}����!<�ұ��unW=��1;�s�T�Y���'v��:�L������l�5=�������칒#��$�] ��b�f=LTlWf�"�m'�4�y�n;e��E��CQ��p���R ��f%ӹ]2:"���y��,B/����/���k�0˕����D�n=U3�=�q�g����fY޿,�tr��0� �O��5�qM�,׫��2�2�ÍTZ��$x��-��e���Ƭ:���EJf|7��J�s;�7�P�n"GJ�&���L�t��FO�]g-�s��� 2l�a��=T�_H���e5�S� l���Y7�21��]�-7 2Re@0��)��T�z )��帞C�F'��6���V_9���*|�y��J�6P�g���nd������h���W�C�op�� �dt,˲� $�ۈQ\�q���4YCn ��� � nz�Ӡ�� 0���W��: �qG96����%�hw�+ 3Pe4Sh���8�멚�9R�}e9��0��'�7�vJ5�1B�NS���Z� +�Ŧݘb��ر;ivn����>*ۮu4�On�9P��;�P��0�*(F�.(R�6��y����g�A +�,�nD\�d��FԈ�Q�l��솲 +��n�hL�g6V��z�czQ�{��B���i��L��� ���rD��<�|*L�Z��,H���޿$�x:SiX��&zTn�1>$��k�q�+����K��?�+�S��)p��J��?�|�[���̩Y �/Z4�0��1�,�u��\��iZ5Lx��^������h�l��Q�N�vGC�DjێƉ�,��:Zp"v��z���S��Sa���D�l9�3~���jk�����[x�JF�h(�r;�f��ȥ��<�U��; �|����=Su?�y��p�U[vDU�_ ��R���R�`m8Q�������i} R���ן�w������E�X��f�� ��8Ѵ_%i޳�m���]��,�x��Y�Q��b���r,̱�ϵ����Im:�m�Y2�.�����Ka��)�1��i� ���y�˞�G������3Ot����r��.ZMAh4��0��>%yΣ�� 4Zod��T��~�b�V��� +��O�߳��"ɯ��+5��Y����u�e7��1���9���O +�끾�P��~GO�߄� @xT�I�|�2�Qnb�B�h�,�~�XN��[�f4�ޱ�%�2�g?�(�62D�9��W6C�8 �V6�*|(��� �*(�1�3����#MӛԲ����-����&溿A ��m�A|��H�d���\1��1�5ժvC�{Fg��K�r:jv^W�%��v�w.K4�(��H�m�����k|��.u�[�e:Q�͂��6 �Y�;�4�7�� �s��+��M��7��2�/R�v��X�՞�hZ�s�+ܯբ��i��X��H��$p��H��>�m����A������ ����)p���d�F�T�a��RC��z뉮�S�e)��D���uM��f�d�@`y=Yq,���1�ZkC�9nhU�[�c���K�_P�5+�Oڮ�'�����,���'�n&�����2I�5�@M������ɪ����4��"2�sY��-~��9H���zv�8%�����@�~��,�}�x]��>Bg�.���M���$�w+��h��c��S�Z���z+�B;��$�a�m<��·���P����8�����?�6B��P��?WnD�� �͏Q��V��"I����~c�i�`�����(�x�v�� �b� +5����'���f�W��"��r {������Z�Ժ�A�Y��Z��H��A+4�fX5L�]���^�$�S��;p��Dz��W*�O��:{)��T� ����M5��h���a*;�ê��m�E�g5��o�i���L�ԼAo��w��ݚ��u>��#(֧�|�����>ҳ�y���?�jv����r��UN����q�R"B߽Ai9�Խ�Q��1p�x���ZF���a^�-Ph���\Ƅ���i�����U����=�����lZ��I-�F諚5�'}�l �j��2 +'Lc,z��+Ǵ_ˍ�%�k��8�d���2>�7�HP| ��o�h���S��x����� Ʀ#=だh�1��;F�,(qV��#�P��T ��~�#��L��_�f/�a�����լ�sn���� ��?Rc@ҳ��'��L���E��f�����4�|����,�Yx�R�ٍg�MDN��^�X����D��$�,G� �� f�)��Zu]ϩ�S9��(v���q��x�;N�*�q��^�f|qJFÅX����@�;��$m� �i?� �{���δ��I��'�"4~7�L�[�l���?������똍�����}�k�#�Mc�y�#)��ð}�9,���� +�UM��b�6��w3�[���1�d�>�V7�R��#B�; +��\�T�����t������G�v7��z�0��g�`=�����g����:��I���W�E��lFR��f*����r�Ћ2K�J��ȭ��ۆ�3٬�)��H+mFr�m:��T���U��M���+7�ϝ���z����v��7�؅fE�v���h��P�|�W|�s���jZU^��Y�l��"�)6�˖+�Y�a@��@����M� +��p������)�e��7�/�Zl� f�����T�{Rv?�;�㩚�B�.(H��b��BDρ��A�8���5�;l��8K�5�7 Gc�*{�z� �h�����0��:Rih��J�X�� �nL�3��[�#�4Wd�k�$�x,Is�M�{P�_���D��z��$�A��H�,���z��=�K�O��z��[s����V�I�GH�Z3q�Ug1��t�n��-Z ���.��զ����PR�v*�2Êۅ��9[�=Wi@�Y��/�����qZ�}���!�� g�'�[X��`���+z����0�Xg9�0zU ��b�.8��'t�:�t�#x��Z�޼C� 4l9��(Hs�H���@�t)�2�Yޓ ��g{�t�5��E�<��8��h{NH��`!��Z��ɕ�����v��T|�=��9���1��I��|N9 _�}�CM�y��"|��@Tt^D(�? r_Ha"31��H�T�C�`wj��2�z{r��kn���k@����/í���ߢ�u�� 5�av���`��k��B�pr�f`%��v�P#�_�ъc������̕��˂�z�l���+�*Fs H��dd�f��-ϰ8�g����D�Y�b}���� 3۳�oz��к����F����?�tH}��0�s׬ c�7R�{�e�r|t ���j( ��*|Sp����ͪј^��P�~g�ֿ‚�P��"+n�h�>�j���4��_I�WP���d����1|��4v���l��* (E�[4=Q��eY��0�tI�4O޶ +�U2<��Mס�mR�*K����ձ�6Tk2F��M�}�rD��ֵ��n0~Ul�\�T�\e�k��GM�C��v=.z���=�4�ܲ ~�b~��1�+5�v̮����r���Z;���&"4�S�f�t=ǁ 6�I�ʆ9�G�g5b���#�'�h�!�0����W�cv��Y?"g�,R�2�n�lm�,�V�h���c{I�3Z���Ngb�B#�sjw ��v���lw�+Qt��%;��7�0�m�e��� �C���q��Q��p�m6�0&��v�fHA�4�;��O��%�o"'��a�� +��vGI��D�z�$)fR�}�(/#��㈅v� ��r��(������E�� ��f=ӻ��ݏq��*t�y)Tkb��X�c|�����{>^q/ͱ=�u�%�q��h����U�3զ�H�´"�e�x"ςD�u�l���ؿ�%נ%�ސ3�Ny���i��t|�(f��f�e�䌘���И?�i������� �{�`�"w�G��4��tn�#���� ')/@�^ؿTڌ��I� +-�5��q;<��H��L�pɝ��ڷ���I�`q3�]n.��}ەȱjc�ŵ��d�+�Uh��T���*Ͱ=�U냂�uPBj B��<�~���^s�OJ�u�l��jV��d�}���f���c����:Ӡ��f1��@K5�/��S>�nT�k�8�uH�Y��!8�4�v!zWi(���r�^o:ư�����=�v�)(e��<��gՌƍ��!r�����/!��'@ao=�t�j%�z��@i����V�q +�39��|��~�r���s�6��߹���\��r��6"o�Pw�nHe��H����ς�˞�)�b���@�� 9Fj��>͎�9��#y��U�E��B���F�}�f��� �%�����|ϸ]2*�{��'A/z��oyƐj>T���@�t�9Hk�F��+����]����$x���D�<�T��u���d�@�Ơ#�$�H3+����ŏ8����T�|�&|��>�s���E���]S��e;��j��M��iՋ�4 +0*�њ%��櫦�.x��R��"��;�bvb�����1P1��"6���f��ؑB+�#�ƒ<�w��:��X�5듐������+m�}�y�o�;`v/Ph&v��&z��>�`��D�z�ռoy��6Ps����B����+� f� ���Q�Ğ�=ְ��[�_V��J��܈�$���9R� D�wc�C�����z[/��"���݄V�DO�ͣx�3劻����bmL"qZёZ�۪O��]#������Sף_��xm�Q��>1:v�7U�����ī��b��r�kn�w*ȰE��=(����1���_Q���mZOD��;���4���l�Y��]����=���r�!��Q���fIKN���rSd�F��M�dw����)�W�h4�S9��V#��^�nG�'56¤�G1���������z�ay��<�i�k�Ԫv�d8� !n�u��Y4<ϸ��s�W)��f��-~��~ҷߙu�A�\g/N/����f�v0G1� +(���ZG*���R[ +*��y��p��]u 3�5�pJ^��1� ��h�!@���OW�Eϕ�G�k� �KH��!ij�D��n��;��'� (Ic0p��^��OtM�=�U�0�e� Z�4��$v��$��e���E���IE��F���(��V�\o/�[lI.5�w��q��"j��(�,�W���.���^��0˱�#���xu����J*�1��>�L��B�� ����|�skMƱ�-�y�{ ��\��X���|�2�Yp#�-8(����z5F s�z�w/Fs������'���\��ɬ���F�ᆖ�mCKb8��W��w��"g����[K3 � ��8�{���/�M��XeۭN�y`Q !U�� ��zhz�e9��0��>Rw��s]���{��rk�#Vǁ���-�O���1Pp=�m���]�K2b�{W1�*���]��s|�I���D���x�fw��^o �u��뷜Wi���0�v�Ռ���F�К �v^w������ +�˭&{uf$�J��r��H�u!u�Z�wHܴ +�S�A' ��X�������r�g�a��&��g���M�u)�q��U�bu�a� +���R�D�J �x��(�wH���I�[�Q:�e���"zTq�@���!��*yEױ��y�a~�5�0�Mo�)B�<��J�Zt?*5@0z �6 +T�k.DoD�7 ,YCۛٸ��s�G�$υ��h��.�T�U��:��E�ܪ�"F�� a8sd�8)��B�`�G���[�`q3ҭ��6|g�r�5�T�Qh���ei�D�� b�Z���r��'y�좂�l���Z��DF�T��4�����w�&H��ɬ�&������r4ǥ���Ԭ�6�fA1:�"ƛ��" s�b�(:�Y�Wi;T.�7׫ ,�'d5�7B�t/Dz>F���� .Z��yE nہ��,�^p0~a�����9�(��� @�a�M�0�� +����2vQ���w��h�� +P'$�(\���(e˟BZa���'?i�̦B��3�ES�L/M2��4�]���� ރ����H��;��VM��?�VM����\������q}��syz�T�c,T~s������|�h�Hc4Cc�)#D7e�9# d<�"��d��b�2��1 FN2�1"F�2��0�Is��MsΈ�Of�#'of����>d ����9e�����=2L�qRƜ2B�qSƜ3b��AƓ+E��J�V UD*�J\P�*�JAT1P U�*�JHR�U*� +AT��**� +�2T�T@*� +DT��*�JPe�"T�U�*� +H%VT��D_� u|�$g5c8e2403-e938-4fb0-957d-0afa557b6bb665-dc5d-4a82-a90a-c697d038dcd7-78146107787262l5602371h W n Q8 ��9c�oZ����A��u�'��}Y'��r�.j�rQ\�vQ"�mT�:�� �d���޹� պ�Fq�Q,4�ԃ9��d�&n���%�LK�<ೋ~:�Q�|��]��6374cd99-bd9b-45c5-ba0c-34388d887a9c42119cd7-8e47-4adf-b673-a1bb0568184c65773682�kˣ:�p`� ��ƹ�0���Q��1TP�[�Q +�t��f@9t�0�gH� &Duz�z�&����c��B���9���q`�:DW|"��4cbabb3a-632f-4626-8d0e-e1d429248ec87a85c4dc-633e-49c6-8165-e6b1e95c4588266 7787958.55035305023549629773848b809241-e7a1-4cfa-a5b1-3df5c6a245fe79eb4e1-819e-4c5f-978a-d6052bc4f8b4588m10SVGFilter / : /XMLNode : (fxmlnode-nodenam /valu1t/ArrayeTurbulen;children/stitchTiles(noS2attribute; ,baseFrequency(0.05numOctav2resultturbfeCompositopeininSourceGraphiiw100%d)AI__1idobjectxhy/Def ;4fractalNois4GaussianBlur12stdDevibfeOffsedydyodSpecularLightingfePointLz(-z-5�ۨQ"��� a�@��A�*T@� � +c@�� @# �8��� ����$y }c�t������!3}�U,QPB����r���� +d?`H�v9w0*��LrM\3��\��\\����@-��N��h� V��w�),��gD��9`Ibӂ�!萎�(�!T���(�N��Q�0�O��0�U�F@U�ByR�/Kp+Xjbb��87C���O����o�)\z��b`���E���� �vP����犡$NvنQ��\â��O���n�u9/��Z*<�#*���(����R���Pʜ�~�(���#�)������;C�D�H��$�9��P�x�(��zJ��C���3L�f�N&��C�l�]��*Y�]>(-��k2=}PجF����2�5)��{nk��r����a�/kG>�1'q���,��@� +��� W���'C��}QS�T( H�@{�Yx����x�G��)6�� �_CcPHT�u�t28�c 4ک��B� ��]|5�ݹ�i��h�3��X�_���O4�@a�XKG�z&�f�b�,���$�BL��y��FY�)����ٻ����Gc�8Ȼ�R����~���q����ӳR�Ld�����I�_�l�[��7r� (gq���"�6�<��`bO��@�s_NT��:�%�X_����~H}�� +��g��juIZ �iY�J����]Z#�F�Z�8M?i ��B���M�8�֩�<-`��mZE��Ю���ɃD̪�:m����Vs�*>|}��5���m s�*�XI��K��ƳR�^籾S�T&�c�l.!�B�- )������u*�S{�Rtg����5�'��5��O��A������pn�1ʢ�S�U�1h�31�IB��# ��� +X ��-�`�B{ 0&:�`R+Ҋ�v"ԑFWW�u� $�i@�n2��6�n)���*���9߁����f[����ήXU�G�9N%17")��)�Ċa�N����]���D�qr�z�|IL���[3�GG!�(�:Ԋ���k�ikC�� +�@[9L�We �L�G�40�7)eXJbe�#���L(=�v�I0��&Ó:��CZ��{Iط���;Ӹ�A��7���q���T�ە�������N������tCp���ߤ��K�k���B׻�w%���֋7 �"������ +�V1*ʩ' ���NM�ޝ �W�/�)=a�ƚ�n�2��>��+&�SM�3�֩Py����H�fةl\6�> �Q:�<)!��>\��xdRd�4�6΅k�ui���˜.��C�:�Q��Tr;`�I$�RB.�G ,�: +$�O�F�u��^�������@��S"��%˕�Z�"a`�N�Go:`!#V���,���N��:���>(���\1�t0vu5� V%���Z� ���� ̥f+)���n=䁟��X��*`�8Z� Ο�� ,8 +7\� Oto��+.7�����FU�Dn3������ڨ8���T<�i�:����w� (�J41�� i�,��E�T��|��=����H`_�f��7�l�����/���p��9ߔ9��_A9� ��z��y��%����C���D���=�A�V{_K�jmK��-��r�eԞdk�N�����wdmGS �kG�լ��M6_� ���o��w<���� �A���e4bTX��Ƶ��c�;6�r,7��4,ke!�!�!u�I����z��rJ�򴨙�0� ��?�t# +J䒊B�V|���V�ѹ���FF{gʦ �1���-�R@Q~H[���9i�H�nG���ɚ#��-֪�iP��e���4#�!~�/�xK��o^f�Y���~Ţ3����R@x���* ����\_`�� /� ZuE�w�e����??�0M��e�T<�p���S.����xv�,��Y�d�JT�&���Vy�`��b���w�;�B|��'��RU��2���&�2��dH(I�P�y�7'��z�/�i�84�-��Y�:"��f"�imd�L�H�0>?���6��[�kֻ�z��MkG~��rށ�����]��y���J��fλ�<��J�����JZ���:\�s����RR��Fl�= ��¬:�0ŵ��K���DSםo!�(} r�_�\�I���+5� ͨ� 3?H�B<�x���fϷh�Y�r�Ͳj�:����eH��[pBSMC+����@!���!*)Ц��s�MI���TF�|�4��j�֩!��=�{Mi�B�Mx1sDآ0!CP�C�\�'�I�K�c]��?Z,�Z�"6�V�����3�&�1����ԙ�V�> u�{�Ln���h:���j �fU K�I��y��� ��FA`���pp3��}fH��(�I-|�4L� A������(�&��K2_�M�NJ���w8�ӗ@%S����H��ֺ=ۨC~��'=���Z^�2���i���2P��@�� +$P��G�I�U�d����#!`#3K%K"2K�϶��zq�&9U�k���c$[="q�T�%apA��U"3?�m�qG>���b5]��O��d!3�������ۉ��J�J\�>?��ƕp���rwk1��'�$B������]*�*&�^�iYa����E@r�Pw,6��|8�aG���im0��r4��lH��a�A��&��z���f�]��jpv+ :H��A�5o��&�#$����Y��C6L0 +i~u�G�N=�*_Ck@k����ʳ���V���������ڊ��}pz���������="T$[�2M�7">����� +�50�9h���y� �MX�_B,��a�i�QO$��ɢeL4`��=�g[pL�RzJ1r�9$�����_�c|�G����9TQ�$�)���??��JX�� Ĵ�[��u�����1�*�����N������M�"H/x(�08�+i�Ŗ�T-o��R��=���i��6�X��50A��#pǗ8:y*��F ��v�R�H�6%��+"c q̄���u�`������a @]JzMW9Nv֓�^�GS +��p/,B������ޤ��mC�/Y��9�&'l��]�JM�7�f�S��c�@�s��'�peO����!"01 }�k��������3���9���m��9;�CS��ό��K�������,� |�7��4��b�*&y�h���c�'��|\@��ƙ�4&��=���\������� �h� ���U��e����������m�PI�Ǎ?/�-.��X,��5��9+o��T�1���u��z���ևN�ˀ�Fq᳔r\?��,P��7��� \��}L��<�'�ٚ��\�^Ɣ`�%\�ǻ|!�d~� C�} Z�Q�S��`����c^$�-#�'����=�<$�i��*�E�|�fu�7�r'�ƭ?�Y� +TcE�yؙ�_�*�T�sXd:@�+`a�c���C�w���\�1�$����dx�_=�U��!]��?�dT�<��3z=���\�x^��t�c���&����a}Vé�R�"`J�G-�P[Z���@�c�yU�Z8ՁMB HS2�`' P��V����&4����D��b�I ���A6�f�O����� ~9����ֆ�;8%]O<;�H%m#V� ��DՔ��81şP����2~������������m���|#�F; �� �H��\"F���賰S��ԧ�~N����@� c����Q� ��Ip���p�:�g���pL�X��I�?�ş�d]m ���=�E���S�f�:�1�īSu����N?�����Ow�H�<_�IY�|�[)Kΰ�]��:Z��h%���tl1���1&�/�ƍt}Ȣ|jc ��9��;�2�$�7@ ���~*=��A)�ǧ�dVa��H*h�B�H)�M���֍+@���(&'� �z�V�-;��) �,��6���eY�dFn�$�Fm�%B *��R�tA�–-4��~��Iv�u�����\�@/��O�m�Vb 0,1��O�˦ e�ZqU؍�f����ue����U�~���U�V�f3��r�ޓi�7U�/�� /����Y~S��Y��:�Ͳ�"e9�F�k�r �mm�U��n8�#Cb�/�.0%�Z!��a��q βI<�]&�2�󰓤 �o�.�������`����j �f��#��Ԝ�i69��\iI� �ޟ.!AJ��a��_{���F냄��M���F�����ó �[��D��9K�&�&Ԕ�ڪfF˵�"�=K�X��iz�Q�1�d ������k(u� c~wh>�d����G�Ya�C��]7床�G� �;΂*�}��0�B�ط���'�^��0�Y�RxQ�O#I��b�?r%U���C{�T���h�O�΋T��h! +�F���d�}��6&��PD ��Z�������R���U6��2�`ZAKAC�H�/Bu?� ���墡Y����MӹJq#š�8e�H�d��Ƽ��$ޫ���TR�h��J���r:���K�n�q�l��,P�?L�8Az�.a�> E'�tUC���e�z�m �Hj3�g?��!�ƴS�����<�"J�� +���4>��57��t'c�56B���]V�É/3����٪͚�y��鵨%Y�L�d��<�d��!�VPb����`�(6� �[G'w��Y���َ���ag�fd +N � ��J��^.��J�s܇�Mc���� u�*o��nG�_G��@�]�?�ŧoA�0Z�� +�� ��J�P�9Sg;�g v��^:�%O��.a�Ѐ��<Zw��&�32m����u� +��Q��x�)�_E� f���/F��W��"���y������X*�e�ۉ��VZ��l x,����?�eߌ�tP��g�k���D c���������sl&�������ss6��Ov�+1�{Sn��-����>B�uD|"OKe���6#�.�q|3���ڶ�d�ݧ�9,&�o��%���Ka�ᝳ�n��1����A;�Lgg;_�@�K�-�8�����] 'u���oQ4�2���� +���dd���Q�̛a00% ��h���>K���|���5=1�̘�����{�F�aK��xe<�������3��y����<�*<1I +6�~�Gl�) Ո��w�[ �Rr�S����,�,D�#��c�"�(,�ř��d���$�E�i�����'�E�+2(P=ڇu2����� :&�΢g����ۼ��u�@����u� �Z< +i',�AdA�VዊhT۠`t��$k򈴖b���)��S� L����,nDZ����[j��� b�夅��@]�E�r�iEl��p�UN�S\А=  �ٷM�"�T��iw�l}�!L��ԕ���۵N��u_�>�.j�F� V�{C��O �+�(\ui �}�n�ר�)�*9�UoĒ(@>Rz����Ry�ߕ�>���ν0u���܋�+?$u=t��� �ڬtz���&���FY )q-"�#�ٹ}�v^#���=�g�s�J�/us��wԦ�Cõ�� ��xEX�&Vu�Gx��4���d��2�S�� Ce��?�J +3�4�$�cT��z���+ ʧm�̨����t����08:Q�Gr#8��'<��z����V�4ȕ7FؤxW����c��lo(����s�d,D��UU�tI0d��j�����b���߿`�e'Z�j��Rvs�M���MN��tx�:�e����k��gԚ.�2�"��� +f}�|������(q�� ���.��3���kڭ_M�!Q����B;�¥���@)a�KBk��S�I�QS�Z�t��"��K�� �j=�'Q�x�U���̅��szH��H޾���Bţ%���_ܹ�����^ չr��F���D���^��� W�7� M��9� ���1����1�A��.�G)�{Tqր�X��.��ĥߺA?OZ�8���&ä� �E���S�%K� +w%(���n��$ ���7Ow�֤�@s\� �j�Y��\0�O�؞�V� �vDܬ�M��VNL\=�]���sg�ֈE�L>�ڣ�iKMOE��;!�E�z0=9st��1�IJ P6c] fp��w�74NhB�x�M/���A��Z2#�D�F�Ð��O3����s�]S" +�!ǂ*!�Y����P�/��S*-ϡe�� Ҧ����i�GC�c&�W��%Wo;��t|�}����O�;��D��e�d����L���bq:����Ҿ5�N�i����9!Hn�( ӈ��9&��%}�����*h�b`��@�O7_o�m�෉���{[�(E��/�7�F^�4�}��� �1T��$�9�a6�H��z&���}:�?���ngI�9�B�ߣ�Vԧ���)c qLj����0�b5޲�*�-b�<�S�I̯"\Q���� �+y�k��F��Q�(��q�����K"�����H�ѮV��x��2`�kE�#ܨ�����YT�� �ús���G]deH 7��)^�D�v=�����U���%����9\�v�¨���!��/��ҩ�P�]��U�I^RL��Jι�[he�{ϐ~�sI˷� �<�(r�4�~4�eA��w��� Ǩ�e�;�"Qy v#�.f�5��s�JZ���,�`_���yƥz���s7�]TI�u{'��ӆX�o�� +:G���ϥ���"pz��{�=��L1Q��6kɉ��q�-`�1POD%�%U3��naC�Zķ��H�첧��B�0y�� ��1N& �[Fp�6���G�+��A�����[?�b_����ޡ��Nz�{6wQ]��Q��8�E��N�y�h������t���P��2�.��f��P��A����eC�zq��ʌ#I�� +��d�')�҆��' 5��GúQ�$_��%+�a W��6��#��n.v�ei=N��퐆�������pc����+���`��^��b�ɂc���{���b{'q�0��8�����ɔI�]�Dk�eiG�,B/0w�y�u׽�`VMJ����.[%1h�3� +C�wǪ6�y&[B�'�J��:��� �� +`=\9F����S�~��(Fod�E��J�4� ]���*��\�$���@�{�hj�ET$�.�e� ,-�!��em��C���]P'rE�����Y�B�z�rA`� �z��x ��!�3+P0��d*X*9а�B�L )v�;���V-��;�FI�Ԃ�S�����-���)Bs;�X\�ī܉�l̨ �$v(L��u�0Ju�{��$d�m�*���R�PV�<ìvl 1��z}�Cipb��I�t� վ�,���2 �e��7p%g ��Fe��ɯ��M���s%�?u�/���Հ����F��Ȉ��>�W���^��"{ Ѫ�ô�X�㭀S��K�c��˼�qg�ꆼ��q+5�U>�#X*�=u ʆ7�Ȼ� ��� 1�`X~�L�O+RM�X�N����T���? ��U��}b ����;~wa� �M"���!�����Hp�V����$7�A|)��.�����hي� 1T4�S��"6�P�3��B�$#�w|�*��X �A5��(����=�K9�:A)@�CV�_�(�{�7p8�*���C�ȉ������kq�:�%K��“+8�u�q�IX7>��� \|�4Sm$�_�4[Ϣ���MpU2* �@����2��J�.�/ܕr����q��� ϊ-�+�t9�q�羗�q����n�.%�5$��!Q��B�,�P}&Z��/b`r/*Vڕ�f�H�/jX��\4���唻�w7�{�j w����ʥ�}vcᯩ�]P�̇�Z. ����*B�[��De�Σ�@_��ڣ�F�eb���a�fQ���3h_�n�8{�pB�h6�gg|R�����tR����n�>��:�Z]�?8�X-�z� �՟��Ф���,5�6�so�Zs�;�F�Z��c9"B�Ȭ,GV��i��OQy\i�9vc��X��֓�� 5���ef�l\8)P�9��3��@}Ԯ1����� ���;�QAO�'�Yt N����������,_΂���s��_]���T:�<���Q�"�p1�a������c�~��sܰ6a��v��G�^�+4ZjAgW�0�!$q^�h�(mQA�' U-����K� ����@� +� V��F�3'5.��A�/+]S��*� 9:��P����S�a�=� ���<�$Y_fʴ�6�m ��8 ��X���.�}�� ׫@��=��L߼k���(k)���A�X�/؅u ��RzK���%�8P�_ڑR�/��Q>?�U�@ʅ�#�ʨe|&І��9�#}J$�1v�@����4T[ῑ��DŽ����I,�d�2�uܠ�����YJ����+�s�7�$�Z�^�St��ף�ư�JJX�� J� z_Hik�i�tL}��~C��ZZ[L�'V�mb��oW�:ŧ\`g� ��^�����j�Eo��c�Rw~��H���t�3�A�Թim���q�"�QT�p-�(g,S�7�(���Lx� S��Luӡft��XҀI9��⚚�npG6A.�.mk�e%!�8��}R�QtQ��;�6���u٣��)&�\u@%�M��c*oRD�ͩm�ẀF�&�&7��� ∈��h 2�<�O����S]7FTL�3%M�Y鉜y4-��� ���e�ޜ�1R����a�0�����t��;�Fy���ߏ#&�� ��k�a�4��t,^�� I�f��{�!#�����/*!�d{cw����~ܗ9�(V*�%nU��W2LL�������/��Pd����w��P<�8w�.��xG6�?���g�?f���4��8���D/I�i0qj8FO ��nR�����-�Yu} �[�wv�bG�,��/�:��^T�w��A8�� A��l�$�'�](����OU��@�Re�^���v�h� K�wD�p����W��V�M�O� �;/X b�x)�.�kv���2�ܠ�^�O� �8��m>�~B �"�E�(��6�F�~��,e����z�S�j��1ug�]e���}ܯiK�yMC�p�Fr��iRg�[Q��(aN��cb�����8��+le��0��q�qY��Pt�3���� +N�$��C�ċ����ki�A�{5l��w��^�C̊=���B݋q� ��҉[z�C,���wD���,N�uU},�� �6��%���L;j +�.�Λ�a�^� .�h[������鎾]R�1�����B���Q#0d���N��q��O=[/[�Q@9d��ϒ����Q����=-��'� �Fk�@�"��ڝ;/�@����9)Ԥ��D�ie�V��7zt�H�E����񹑓�9K�Y��vw� �5����,�I���&T�s���.i*�C��b"�6�� �ڧ�O�?bF�{E���xop}���5Aص�Q�-t�DL2;M&x�Jv���o�Xͩ�K�=�R��� +b�"V�b������͎t�&I�_��z��vU�K��R����5E+����Wy{-�ْe�P��Y!M+�ʳ2�fT��4oB��8\�4��@�.,"��:Cf扵v� �����Po0M��W�&�H��|L#�`��5�F�<F"@�a +E� @fD"��z +T`bp` 2L�yQ�0V�as0M��`)\CP��GBn�ϸ�W��;B�?J<)8R$?���W��t�y,�]?�J�۲qp),���P$�W�d��p!ng� +;W�B$�~�%�:��D�M���4,�p|�P_:��"B�/|]m +�����B�@�`����B�4M+;(���N�2��Dъ�̊�8�U�y���[^�����r���{��`�uT�cz(<%rO��d��4�>��e�ΥD�QA��R;JQ�n��N�`TV��h=tu.�Y> �x"����煩���1!u:��r��Q�ivn�!(dY��dR�M��-�u� +�0hc����\��ca�^�b���sP�^A&��.�D1ox� ���&�f�Ѧ�$KmF ���>VZ�&N3k�L^bY �m�`k\�� ���,��]��›g���>���؆��V +g1!���ۘ��fR%�S՗*NC�EEQ�@%e@�s4����P�$��d���0�L �DB�G�'���y!����M.��E�CQ��@0��M��x�Z ��\|dXŔA6�����$7t������Q6�8�N{`��$!?@#� K���8���E�o>�/�F�;F��Fj[�\ ����A: �G`91�T��U"�4V9�;�eزPJC N� �ݟ(���Z��M� �v�N3����k�A�)���iv�;��sM��0��ϰ%�z�%��e���S��-[;X5U��%Ң)Ϊ =���(�f$Q�ܜ.��w����0����ii��'Ҡ�MR���� ����e]V͗Ȧ�Q�$�B[V�;ʻ��U���ga�%��4����,���:����G�ɴ�P���<�E�BM�b`3+h�����s)���K:������-%��,�LK*���⯝���[�Ac� ���H��HF'�l�F��,�d�攃��<�c�^}���3<ޱ�Kq1/�㋻eI`��ɢ# �S1)!�L,V�@�2^DZ}2tg =�$\�ya���� +�M5]%�Ŧ�� i�M��FC�2�M���P�+h�i��i�#{��xXTd��O��3�2�FL$������RJ#|7�Rb��q�ft� 0�� 0��h��S�� Z\"��)pF.�$ +�&i0�DA��XIӴ�'[�)ݚ��3M����4��i��t��^д dp}X��i���i�����i�i�4m�T=2Q_M�4Ǧi�giW$"�4�5�4m'mHIB�4m��A�MC=M`�@�,b��*�i�h��*�Г�lV6xe�X%|<.�� `�Piږq]� +��/Y��%��"0�`*C��Ih�ꯘ7�>?z:�2���� +��BD��4�Q��b��X,��b�H��.�@���`&���N+�k�\;L��\+��l,�>�D�ɵ"������R�B���D�P)���]z+O� +}0 �:�*�>�E�� +�T&��a�\���t}����F�� ���$]�^,� +�Z�B~�^,�.��^ދ�_ދ��X�\$�K@� +y�i}L0�g�_1k�X�b/�%��C���R}^.���<�Gӏ'� L��e�a*�� +�H�J��� +�X�o�E����r�X���B"K����K�a��j�bA�6S�^^'}X���� � �Z�/���2��*�V'���(�oЖ�3�2���c�%L% ����J�g%�)�RL���*�k����x撼`��%�w�G �PC�A�egs��o�B�-�.R��I���G�k�+�S�`�U +�_���2�X.=�k��s�a�X�P��\�H�+ ���L{��2�^&է� +���z�;���>��Z���T�7s�L��T�$�ጡ����J��z�uc�br�d%!l��_���Z�`lu�~��o 0�����ʤ�a&+y��}����}�� �� �`�ϸ�� @�t�i��V���a��> +|&T�A�[O}��Z�/�u�0Z��Ϻ�!�0�>���L�Y��R���X���i�rͥ����\:LO}\����F�;��Xv�0��"�L�M�R�l�2�M_Nj�Ha#���J��'���WT;[ƹV�=5�����RYI�f�M���p�/�5�;(��>��e"`�*�R��Y ��K�^����&+!|���W�O�d%���+ 2�H��T��� +��$���$6�a��gb��д`+�k�/փ+��Z������ג��e�K�c�!�ٲ��\��|���e�%a�\�H�K��h�����+��T�t}�t�����oj��@(��&(��zQ�N���CR�v��˛@�O �m�'����j`�r}`2R+�+�T�jO ��}P}g�>�E����鶾�>&�'��}D���lfg�l����u�lPt6SY�l�{���<�p4M���'a%��51����!(���#I�ei�&i��i���Is��9 pI~24ǒ E���������/:��'~O��p�������a�8C�7��:.�����%�I�i ů$����'�����z8�~��fiz_�t��_:.��t���qL��7�K���|�8 ��c��p~*]w��"�k*��'>4g���@����g�(��l��Y)������HG3_V�0V �\�ʵ:����=�C�?K���^{_`3�1��]�el���>�}����_��H���&ѧ��l�R�X8�b���Z�B��S��B�>�W=�UJW����0�V"����͝��*�r�L�Q��˥W��������a���W�T;h�ڳ����V%�� +�>�Oz(�G�Y+`�\(�u⇽F+2�Lu2`*��2���3�`�9�y��0��4�?���}�������z��&�sa1Y�2�b!]�"�d�E�8L&0M�}7��nJE*}���?��R�E� �%�`z}7����e�x>��L���``�p�;��V.� s}fE c�L1�j2�>T��w��e�(*�"��T1�� �(2.��>�"[TX�\E����l�Kb~a �� �Ⴡ�G�c9~���(_� (ƀ"��!;�>iG�������>;p}@�W�a/�k�a%�1�=�d ��k��}�c�?�����}���` ���}���!;���E�ہ�I���P�L�P�^�}�4���*���΀������S�i� <+��"dȺ�A!R�Vu���?�\��%\:�����+����ߗa��Q������^�*����o4�_va��@04A1��#��,U��'����yR ;��3�M����Xz�=0;��;���/��P�NQ����.��A2�Bћ�ǀ�$If�)�`� �?���@ �/,��$C�,�?��ޓ�IЃa� ���҇a�1�`v�0 ��/�� ��0;���/��C2����0��#K��c�4�Q �/~bHf�A/�� �OE�$ˑ �s ciz"f�H�ev~ Hzo��I��� �#Y�� ���K��f���/ŏ �����4AS,͐���ѓe9L� |I��(��h�������%���ч�(�eX�^ I���� G~p,=�&�A�$��4�.;���/`�] M���ӓ]�#CO�(z�؅��c�cW����;o�ivcW�]$��cIzc��H��ɥ*��\*Ie�?!�$��? +�G.���Y�b~r,��3�7K������w$(����8~?���f�@)��$E�> �,�E��D�˾�PůAIЃ���a(�ދIz/��i���}���w�>����3�/4����4�~a������0 ��{w���w���������y_�y�/���O�����O���· �`���Ѓ� ��� �q�;X� �o$���'��C��?�EQEP��O���'�ޏ���0��E1��������q�я��������>�����M�q�8���~ �����Џ?��7�O������{��?(� ��� � � ��� � �"�?�A��������)~���?���އa�}z� K� A����#C1 �p�p�D�=9�?$CO��'���$����$�/�����������C���{��*��y��a �c��d8��8�b'��(z�H�"z��% �dG��'�a(�� E�I�E�EQA� �P ���aX�aX�]Xz��,�A�4EPAЏf��م")��������(��X�% ��(��'��(��Eﻲ���;S4G�ESEQ4E���{�)����(��'��=Q4EO4�.P��艡�_ ��v��ahz����^�E�����$A?~�.��������I� �a������/zQK��=AAR�EQ�DOA2$E2�%z��/~��<�$;1$wI�4��$�/ H��W�8���dH���}�����B2$�n�Hv��&I�&i�a9~��%Y���} �eI��{�X��'��=�8~����?A��!8��Xve�_~�D�w��� �/��E���/�Yz��%h��M��@_�?A1C}8� ��.@���˶��0�.Pz�u�A�_~�$��C������w]����*{߷ |�?h��i�;3P��`�^(��L��]:l$�@ �_�������C�3� +A_�c�$E���؁��^��^,K�L����,A� ��=ы�чd�}҇d� =8��(v���,����<��f���i�0�@�C/�b�0���o<��f�$E0��ozߗE0$�7z(����g��3��=���σ ���%{b��{�+ �e�Co�L� ��cW�� �0�JR����7v>�|�Ï$�I�Y(���W��g!����D0 ���`���,��N������Z�@���>�v� |� Ip�$X��7рO�7�}�'� v��]I����n��7?� �bI����i���>#M��L_��R~/~��$C�����/C��/C��d�A�,K�`����}�-K� |���������A/���v�� �u@d�����>�k��zP�RI �l� �^p����@���7;�?�����4;�3 �ߍ��C�3G��X������4M���ٕ` �_�_��_�YJ�,ɲ�� � K?�L��A KЋ�9��W��4M��Hf�I)���>4�B,=�d;�I3�|�|�/GoL}�z9 �a�)�w�����Rb�C�� ���l%��7#'hNF��ay�YI�˞ ���[�����~�>�H���k8y-�n#�@�������;�i��nj�X4�C�24+,��䖁ݍ)���4�%$�]��t�:Z�g�Wg&�VP +91�N���${��(���D�.a�a! E��N$R��ؠr����Iϖ� "��H�7��b�c>y{�iZJKk�dJ��GD��C� � ]*��9*.H��� �ʕx=���o �v1(�B:��[&���Ps�;ں�8�U�[�l~�Z�o�1�[7n�L�ND��^�My�I�j��M�p�v3 j.I):5��8р[�$`�������6z��V��j''�a-6�;�t��!�Zp�l�Ƅ �����ڃ�Ԣ%T}3�Z��p0��Z�,f�b�T�a��CF�ٲ�����i�)��C��B��L � �~,H�٤�wKRa���P�P�ꀑ��f�ĺT)�qx6�Ϭ\��I&6�4P�bWBHݲ����;�+��:�-~�BJ��p��"ű�6�bDN)�����q��M�<ǻ{��� ����h��88҂Rωf�G_��-C��R�b1�?V��q�T��� +&��mlcc�aQ����A� +��\ aP�ND��*+n6� �p�:Z����qc�t�.�R�%c�%n�4( �f�)�!N +���I��ȴ2d��+Nt�[��v\6� ��1��(LH%@�}䄕K +��J��S=����I9��n��5�����*���R�Z�Ğ�G+X���k�my��!sP-���v����kFo�MShȨ��$�D��Ȣ��p�� ���ڲc +hx�z ��C +e3�=���Ū��<����/���.���<��*Bj,<���V\+�6M� h����=Pf��n,$vR�[��Y�FM���-��TIRT����DZ���!�7�����%@�N�;Kjs/-� ��y�<�"����V���k��O&���e�Gq���4m�՘\[�,���C\D�� 3�I�|S4����ʚ$J��S1?f%�^� ��6��t�$�˰tB +lNC���2��Ua�П����S��9��M5]`iR.AyA���Kj�4ӂXr���O1�ID:#�2�WM��������{JNd4# ��D� �� -I�m()\���-dNt��;�xp�X> �3�K���A�XW��;0��cN:�/��>���Km�V(p� ����pAx�2'�-Y��{G5)�).�G︥�s�x�B���D��r�N8���r'��s�h���b�̻�Ԥ��f?�M5��gꈒ��n/K�n�3�Bŵ�i��~���!V"����e2����,.��e���|AF=|�Ds @�aD�1���v��$ ;T-H�E*4p��*[&/N�� +~(whf��!�4�l� FȐ���⺝�`*(��]��a 7�X�fV^�`W������<\��!�ts9暚CK! �l��m�.�KG��.2�7� #�/\��w��&%�T���"`��� Y:���d\��{��k��ƙXP\�xm�6��1�r��*�ޖ���U� ��b^s��ԅcB�:��86�4��oX�29� �D���$����*�� k�X̰ق�(D�<�N���eV5 +AoY��4Zit8�.`��YJLeЭ�"Px�I�y�M`OE]�2!��D�SN�B� ��?'�ܚ�T� ?��Z�۱`B�QA�-�!��,ʍK���k���.�Ql��5�雡���.�L\���<�i�=~�$�P�g/,<ƃ`�τ�T^��lbI��ض͔-{Ot�����v!z�� +g\�&�:�-=��\���_-1�@�4Q�T�?%��Y�3�8�4j�����k������2'{o���{�(nG��-$�=5&pSqg��y5V\���\��$pPݢ:~�'W�5�2���� +�� �8R���ҖC�gb��iٲ�D�/�9��Q'̀;׊Mk���=B�>>_�/shQn� ~٨��9`�����H����^��b�\<�k`*��|� !V�"М���b{�����ɽF��d�u̒�&� ��b�yw$s >�m'C@�\ � +�樀&�P��0���UI��q�92M:� +F�3"�5oپ���u�'R����W%A��hx�������r+ly�&��W�Ҁ�D|)�Y)��"�e�cī�#����kM+e +�e���z����^b���]�j���R��"�1 ��^���ov3..�v� *k8�H˲?�@z���Y�N� + 3a� +=��НМ[&�7�"!HZS��Ġ6�i��k���i,� ,^[2��/�� +��[Q�'�XD:�e_-���);ւI�e֌jn܄WA�o���-S(��� +ݮnn�%��i�tX�`�0f��>�X���3������5��m�~�+�4TE�ͨ����P���|��Gc�\F ��Vo�j�� ���� �T�B�Ԩ�L@>�s�� +��A� +Ž�m@iL�(࿦I�A�AQ��&� �;�1.�Ny�|;��>�Bҽ�Ah �-���T�.�VF � u)�ͺ�"����X� w�h�-�X%�P͊:�\�Q!��(O٣#D�g��_l��Ņd�7����[V(eJ��sd�N�z������w��|A�6����ǘ�e +K�U����!��G4�Eݳ���]{�_�5��cĎ�W�a�L�%�轛�I�m�X���r遊\ tWpG�Y�,�^���!a��ԭ̦]��ε(Y�4�i�ԗBKlU| �da� +��- �d�F������Ú�^��m�0M[���E�[WP�H��^{�u�M�,�m�ߝE����kU$v!��`�m��/�F�j�,�� �{#iş��k�M?%�� �#b��=a�Ks\�p#h� ���z�6 +>'�����"[}44'Q-d�蒩��ŠA���y�2-�dy9��n\��L@�L��q=���Q������ɋd�+%9��g��+U�`fM +�C+$t������t;.h*F��<�-p t�5�����1�\rM�z�E�F,���adk-ą� �R�z��B19���H*~�13��A3Q˩J��-��K0�2o�ͺ'g��B�yz�c��#�VP�]:y�A�w2(�-��P�.7(b�V����[�L`9i�m���lI�b�S�k2s: SA�+߲���\�x��Q�Gx[3ֿ�9�Ř�0S(@!�3;��Kʚ?���F�v����`�d�r�,�vw5���J��?Ϝ�-�6+�ŭZ�����l ����FrԀ���9hK � +�I�Sd崞܋1�'�v 4��>%����ك��X) ��ٓ�qЎA�-�D +�ͣ�I����uC��uh��eWuAU��*tI|3���NQ�7��FVhX�g�}�˾�������� <(�����D�Z���������3S��#�u�Q�T�v�f�ǭe3<>������\� I�x���QX:o����@LW��K�~<ޠ�0p��S�!�&���� +o���ǂ9\  lB��)ul��+��+���#a˘uMU�/�i�[6ҚA]rA�G�����[��"F�g�H�� �Ad��NY�B@��ڔq@�����q�b�3�fQ��� \�E�P�%��ު0!�ܲɠCȗS촨J����{̇�<�����+I��]��2"��`eC�c�� p��*�MRi-Yo%2鼴�8��Vq[�)m�F��e������"a�`��BP���a� S��B�`R3'+wЩ�2 ՠ�nd�~?htuJF�*EØ�q�H��)����ѽ��� Iw����E�W%��xC�oaR2�;���#�A�:����1�%�[JRS�|\HlҸ;��c�D3�"P]����>gu�7VI�.Ϸlc':�0��z4t�C�F��&���0x)7�`���.ag�~G�׊��U4sZ +�2W�ER�R����f2p����%7�o޲E���Y�J� �5bC�����i��aA�.f�FIE���|���3�f��W ���'A��& ���O�Y��g��iϛ)�[&r]����:�Ƈ_�w-��m�@~a�%~E�/��z��3Ÿ&�V�C��e\b���/Ll�E�� �QL0e8�mR-��-������j����a�ƛ� *M�*�� �rMh'����E~Y�m�#�@{Rp�~v.e\��^8MHZ+n�n�=b��@�[vJab�"F�M��U�X��(���;��>�q�>�[� D&Ea�Cym��l�G �?1����i�>y�A���n���H�Rpu��&�!W9,+��t�m� P`(O�K���v���� ��^�Z%|@ |���wm vh���&� ي��VAd (�����b�׬��27�����-��!mΔ��� ́Tu��Ͱ蹖A+��Iyl�jp�]$��-�L��#+�8ML��\Q%�ٕsN�K��:4K�2�k����[؄]z�-�z��������[$�+��X �U�D`��6�ox�n@+����a��A��j��mo)�Pbք +�) w�̭���K��8�upX�O�.(�-k��M��j�@�R��vu{�C�������m�������-C�Ȕ�_��|M���&�� �W�e���Ǭ�N�UX��Sc0�wr6o�Ym��+�0�`+ �qD_Ba�aG�%$�hwSH��:8_NS��r��[&z���!�� Ƥ {��Nr�6�`s�8�[� #��ؖ����1�J� +©զA��b�\VO�O ��up|��Y*�, I�P �u��酇L���i��X�l��A�6VO� n`��$�;��z�LPk5#�M�[A��'w���R���8ɑ��$�k��PKb��-{4,�����+#�h��_Q�$䁽R��=��ah��r��y!Xkȴ7h�V������$�#�E ���-��0�J�9AY[�+�2�AADS�����v*,@�㵢�s�����g�DL���c���� ��MX"��a��P$�$v�o=x�-c�]!��*^S��2���ГNJ� 2^�^���r@<�&.��bv^F�����JdG��yLN)���7$�GO*+������xśO�U���>�4hṶ-�D@J R���*h<@���5��&�=Mą,��+� ^�t���4‘ dqR�xξ\���^�!1o�E�!D��A�����a�[����u>�f ��I9h�R��Fŵ/q��X@�tK��|~�E.&����W���U�듪�Vj�]Ͷ�Z�e�$�P̢Mo�����= +%3H��ӣ3�%�Oy�7�&"�KH!h�@�L(�X_;�5�YB��r<��?p�vnpN�ф*#@ӲGh&4��0[��&�#���'K��-'̺�P݈UHm�TJ������ELG����Y/��I'�U�]�� ��@��u~�1� cR �ӭ8�2/����O�D�+�򞴏�=̨�e R�V5�DK���b. �� ����������TVRI&��˭RV���T%��ܘS��s�$���|h�K`��)��H��� �pն��������' �8�J���@jCC&�"|�����%�-��Ĵ)p�D�RE�;ؙ�Hnk�2#v����wZ���}E�'�B��^��@��� +J���xN}�i񭦹Q04��C$`��1�:��]�q�p1q���� ��!� ��'��ꇔ���n̆z��t� `�HR�� !�B�m�`¶hP�I4y 5�V��M������F�E +n� �Z N�lm���w%&q�P��jq��9Z%�p� �)�Xs��bL�"vQ F|:�Hx����@{�>�| ��/�2o���2#P��"фm�J\��ъ!WA�����be�� ��b(q.�Gp )G��I�E�ծVf�A?��!dLމ�.���]T(�Z…��[����ʖ��t�wpR��$ ߹w�s2F[E��Ƕ1zm���(yfQ"rs�r^�` S�k��k�\��l�i�P��N�\���n�"�[I�i�[f xl*�4�!�.�%%EQ� BOaB��+-�TL���mD�q��ivM$�1)[���SE�6hE"+Ł|F���Ŕ���!G#�r�-5���țד`�)fD) ^E�w8J�rtK�nُI%���Z��2���@kՠ�R��+���!&'Sk�L���21"�xRӑy�H&���|*'�}�M��K���C��+0��e���Q�����Fh^8`F��7����>��I��E�@q-����:�>�zc� �y�-��>o�i�����24 +�kT%od.,t�D �k(�}�M�\�ĴU��Q B��{ψ�U뭕2"�2R,7G �1�\�t��tbd��k'��%K�cp``�[p��y�d�A� -S�������f�6�Ђ��Ywv�F��$@q�o���H0D@ٱ6���Z�z/�7K�9�X�.|o���.[V8��|�2� +(��_X�rq��-�v�U����<+���zq�1Ի����Bc>&H�\<4�P\�ƛ�ٖV��j]o1gBl�oc��n�E�{h���sD��i�!Ĩ����.�4ٰ�k'�Q¾�.`p���f�� �"i��Ǎ]+�^�o�\L�cc� �.��� ͪ���7�4���ڋ)�"%�&��$EՔ9KX���S��%4ɻ���!�I�`g���!��H%�@5�ʖ1. +����(���9=J�C��V�%� ��87��!�À��7�4� x����<�wv]$����AT��`�Z��=蜧��>�,�s��n� �@��ҟ���Pn ͼ�ޖ��;�jC��k��v����#�� p�~[xI��8~%������7M� �`J��V�a@��+�A�'�a���e���}����{T�V��)������w�`ώ�fZF]�8Z1�KiB��1l��� ��?�=��,$$Hs8����̞��qs����$j ��x�p��������_O!mшMq��Ğ+�@����#��XC`�'f藙�[�C��d�� �Kk��p�� >��P\Ko6M+×�Q����Hp~���б�2���)r�,��)VM����Dt�΄T U��&5���ڒ�,��A�-`;���� R_��:AT(����(�ӛH����CDnv�5T6M#��|>p�QLF�~4Xxe`М�ġǖ���S��r�,���p��Lk�ğ�qA�\�'f�vM�� +�h"ިɆ)_�W@ �� +��2+��tL9s,, ���`5��عv��M��� /V׆n%T`,����]�E�uz �)�s(�Q���TgŃ�e<��aw�tr����5i$���`b� +%޲n�h�͂PH��)ݮ?R^�"H��d�Z��i�$R��L��a4���Fe�q� �1j#���}��@_6�.��҄<���d��&Be�B���1(W��yqX;Xn� q͑���0�9�~iQF�b>�[�J�q^6�Pw�e�6M��D򇡍�<�3)��h��{�/��].�r��G��9�B:�n��)�R��5�Gy�`H �l���Q����ҵEw�1���TVEB��BA5fG�� �v�޲�d��WjӴ�E�2쁨��@&C���r�}*J*�H��YP�*Ecp�WE1��adP��|�P��������.���<��-k ��c_��:Z[;;��'��`vWp��I���m#m��M�tc�)��K�&g�&��_Hq�8D����&oIL`�8��l+)̖}�����X�&^���$ +��o�+��i�I�-�o�vwH��i$t�\��J�(M�k��'L����*��น�h${��-^ +��e���h��B&�q ���� ��WJ�1M�;����4�LT��`��a�&"̸�h��C}��!KtʀU̶^u�|��C��2��b�ZZ?������r�����Y����~)� lBr�8&q��p��d��`�ÿ=����b�H+a�;�m���OJ�e�Bbn��|�����B..,��T�snÊQ�9t �Vک= `Pb嬷#��P����BWX"��'*�v��VQÙ�H���[��oL}���h��VM�S5�V����_J�����>��"H'#U�� L��‚�H-h%���knLV@Ā]YJ<�TN�ɸe��� Cp9q䍶- �5$��h w0��Ӥ�L!'�+v&-`u��9ϰ�r��rJ��[���!�b)�i,�~��.� +�e +ս�\2�I[3��ӔJ�7:�ҰN<8��a&Vm�ۡ)(ɉ�!<�Vdһ�&��E������,烸p�`��: @���#h��BZ��%�y<6E�h��k��2��� mK8�7�2�,�w?�)k�@����Z���#��i�HN˵hY��C�����agm/�����UoeS�ڸ ��@s�5e���'��qEy��0����y]q=>stream +�4 #����G�:�Z�б�Ù�lә�pQc:������{��a�Fn�,B�{�A��X�,H5rE��Q1�������l�up�S�j�R�8%�� �u���QB ������-ַ��[�n�h�����3�&�M��_��=��ǜO��J2U*�.w +�AF�k�j�p�}�;���%�ʔ!����NR�e���'� ��8u.Is�I(���6���DAg���՚P��w�m&5��nl�`͊Zo�ǖXɇ�Y +,�,\́f����E�E�e��"�46�ѡ�#�,å���f�Aj9'GJ�� +*�B�V��D5!�9���Y���CN��K�<7�� �)���p-��r�a�(Y߶����4' :��Q�,М�H �����F�w�Jj +:0/#����H)5DG�)w1y�6�Ma]`I��ӃcRW���5�HP;�&��˖9�Q'` E�ԠMi��=�)jQb��"�+����7�Us��c|4!5m��o�.��Ne �2���j�K̆�|Hb�52�[��lŬތ4L*����T�3�g��,ұ ���à��@4�{���H/��3'T$��:y�\��f`�xՎꥬT���%����� �Z��#ƨ(�K��~c:�]�,<��Q���hb�h�du������h¢��ǧv��B�����J"P����Kȥ�/G�n����1s�nF��M#��VWb r�T����a��H@ߏ'�EI���-��}hL_��!A��@[XB����Sqew�Q��qQ�l���$w0��� +PS!.f1��]�� +鷾N#� �F�5.� V8p��{#kHeJ�t���wj�TK��u��5�@{�'وQB ��e�sĹ����>o|�=m9w������u�՞h�5*�{L�5�}�,)��@[��īע�M�^�Өt�Mc��z�x�@K����-;MV�#���� GZ0$t3.g~�� +���u®8�]��qJm0�<��2����O�s�etK`��p��Ҹ�b'$hM�^�g�D։k�|�4Ģ���a!�� B�![y���\u����Z��u�!��Iq:Z<�w��^Oyй���pc9$��B��Eh8���e u��� +���"Sʦda��0�IX�A�ĵ�|ӴK��� �܎إ�0^����@o��F���w4!�����=:m�$fM?���K �݀++( �%c_���Wk��.܂V1��E�:�&��6T�B��T>�։k[��i�b�Y:"�c�$����f�1C\K��� ����A�[;�i����{�*Y������ҹ�� u��cZ�'=����ʤ�ϑȓi���No��,Q�薙4�N\��l����mrJ�A�Z.��H�7�T*��(%�C�����,@�e"���{{nL�� �+���RP�w�B�ֹORqoه�р�"�xB�~�[��p�����yՃ����(��h6M =<붔D�6퀖�� �g�S�F-:��d�!�[�@�.�L<�f�L�L����}���[Q*oǹ0�[Ł�'��do�E�#E+�N��%��Qf���������艛�ŵ�ͦi�"�� +�4 +�۲�=+ �e�>@.=ؠ[X��)��rՄ �2�l"��g}�$ra�fr)��&�� w����#����|#�8ޮ���ј�� �(hW�e�AEP\K�l�����C�F��6B/{�� ��ޠR"&(��3��T}g�uT�i���gty�w�x�[_RD �&ޕ-+ |%�B"�#9j���tF�cR�qC��u�j'�u��Z�gӴOG�䚑�(z�����C\P:�L\��sҸ#��s���5l$?RHY3��v�z���ŢP**�&xQऻ�"5��p;�[�=����7�d�� w�IM. +�kQ�M�8�� ��jo�op@^En���DW�j� + ��Pp߁y��EZ�� ��.u;��d��_�b����YR��:��%���ۿv�UO�"`�*[�7�A�t~YA(�̀6Ms��� �U��w�Sqڎ �P&�5"\�W"��"b�R�N�fQmuDY���&��a�$3*l�@e2�4����u��I7�A�b֪B��ZD���\�+.v�$vIu�6�M��V�Ȧ]��^�AA�I�m����� +#R�������-���JR��Ņ·8ۗ�5[�7GQQKk�q52�s��v��_ M��*��I���(�;�;{��e)����P\�*m�6�$�޲T�����PLJ��-�vh-D1F�Y�*��YQ�K['T{A_�Z�Kl�_��)�Ūz(��!z�PsT1�aD9��b�:��}$[V���r������w7�_氣���o��QV7#�M�.�oؠ�l����C�Ȼ�0�K0�O�`)��t�h�d����;6�夏[޲�l0�ִ�O,��t�`I��s+���'��m���J +�rO�����[Fj��8��a��xh�f��T�$� +��I[�)�Q��?��X�'�yo���S%%4m �g�hT�7v�A5lj�!�P? �2� }oM,�IcTs����$�����T 4,��� �� ��X�p1R ��2`�BG��F{�p�7�J�S�R�.9��2O��p|q�N��ѡ����r�Yy��H���i<����5։�h%�P���#a��F����$>,��"a�����-oY�%��Qu�*�F$h�!�\cvۨ� �h��)�7�=Ǹx�� 'wbkNß�����b��&�4��Y]���&xbS�,[��w�:�W�ľ{�8~iX�d�����Gf5��T���.�1 �pn�N}J{����ah�7���kH�Q�I�3�x� \�� Mk� b\��\� +�+5�>���^,������ (^ -D�Ȋv�pIأ26��)cݺ��$]��V�"���+�x���doY�ڻ �h!�s�5�]e=�yߐ��hh����Tb��6��u��(��ai� ����D`&�u"�'�[�/�p�K��RQ5�|1� �R>����Oi`��'�:�hR�1�n�P߰QpO� +D0�f���sY�"�Ҽ��^.�_`ΎʭaQ!�kP�f�(NaٳeL7Ҵ���W\�$�+ݭ�-�$ O��#ՒC��YM,�_[�,�xD�̛��Gl�e������ +��� +�C��U]�0r��-�J�f�׀^� .�Ɩ{qA�;��U�X�3�d��[����p2�E +�u�ҙ�u�n�G��h(�W�H��ܼ��^s�em(S�7��#I�b��zk9�c�� $��?�fˬ��� �;�T̡_�!�K1�aǾ�����u[ .9W�3�[� 1��2ф�9,ON�2�;��@^]+�&�o�$��7T�K8�J��S����.h�J��q�`�Hb\N +Ơ�e'����Jm��8Y �� +���?��r �W�*0�RY�0�ke�B�c�[���V|)k��Q�sz�%�#C=�/W��)��01��.uT�Jo�G��Fd�o�i��#����>(!�`)67>�Ac�9��kA0 �+��N4.����ƌ�$y&��kM�����eh�ú��z{��^,aW̾!*0S~�Ȉ^;g�ZV?T�QߔY�Lع��7MCY(u����9->�Cj� ��ԩ���̬���o�� X�����vTV��� P\+��*F��px���,���Nn�!U+"�+hQ,�Qfw��G*���R�w�)�#�εo�i��% +���+0i����U�,k�1�z��� ���^�w�Y�`�@��l��ȶ���M+�q_�B9�:e�>�[�����i���Gy]]�@%�����z ���#అo��7�4��χv�Zh��'/�i�ݲN$Z��Sz ���p�������r����kQw.��k]��\��s����X���TL�L�h;��t���(��[ˠ������[����l���7M��.��<�t�%h!�v��KJ*䵱�v�'e�*Z-H�y����8�u0�t�IK�����e?*�n�9MG�����s���q(�Nw9蒤��ΐ����]d���� +k�P�7�y�'�,�<��Q��ۄ���I_MC^Q��1�0`$E�9D�a]/5�)�H&��Db�u׾�E�ª���s�u����ic�h*�(F� �N�E��jFS��@�� +���� +\m�e�à�苂vc�O&0i�#��J��y9��H1�C{�v5�X����<�r8a?tX5S&I�F��� +�㉵rb�q*m*��pP��[�@$��E Ѵ3�HZ��hT�IuP�W��}\8��2o U;$���ʭv£�����ާ8 ������aʢ��o7�D*!۝�nY�*)��l;���Y����C���VG�Jj%��i;"RŠ)�ʢV[Yt�Z��ڸp�`���1d�LUa�hi䪢��U�_b�em��7�{TF�Ⲙ��EGvB%� �#�"����5HB $�ZO�D i>�5͘���uEB�; ��fj�:mq�-�aqP�lE�-1$9o��� +� �$d�#l��&}��W dc)"1i��"�-�z ++��� +�:t�O���>�81�xQ��K� PXQ^l�-�(bM��c�5�܏� W[��<&���u"5���a����b��y�Lԃ����1L2 +�h϶uA\$ +%S�)�j�/���j�e����'6 V�O#�_(>ф�Uv�Xq�G���$�A� P���[���{���q�D�>E�P�Nŕ7�t.D� ]G ּe��Qf�i3@)13R��<0�{���]�Q��&Gʐ���w��l� +�4U����[ț!�-�4nj�ʩ���\� �_sK`�vR�e4$qi�)ى��ʱ���D��~���D���DI�5�rF�-��a�uC"YkI����{5�HI� +���ɩ~a�H>�����R�&�zRP�|^1!bm�u ��F)U�`��54��&�*���+jEUjy҈�ܛԬk�6�;)�""�fN� ��G��ew�@��,����B h ���)��Dm�4v +jL��X(�-ַ�1L�{Wy@0h��d���Pьn�k~RL +�)L���6��l��"�P-pNm�vB�J@!��]"ޯ���*�VȮ���0�\5��Qi����l�DaZ��0ח�#����^ [6&Z�f�%�����lc +��UEڐ}<����-��sW(��P� ��T�>|-��a~ Jܶ�LM3z9'��VP�d����+�y�@�4�N,�D^㰂s�Q��`w��Ki ��4D/-��.�M|F�U�4oK���C�xA��C3bIV����xL�K�Lׄ���_����>�� >�"N�D �v�9����pvh�����!#i%���V㙤� C��"�ciߥʉƠ�rN�MW!��e'��T終����3=O�U�-��ɵ��`���-�8�b"9Uk���Ls�ᡦܓ?X$Q�GA�oF�lE8_���-k7�6�NM���=�i@����� y}IyJ)gq;bI�cK:u�� �w ��m��e0�k�xӴ��h[M]��� + �d�U8RE4���A&}��%�A�ܒh��Z�f}ҭ�d�׾�kQ��i�Q�V^ '^���!t��%1 �f�d�S�}錋X6/'�r1qq��7�4Mk���F�I4A\��T�TN�[F~q�a8n!9P��4�D�t����l���ڗq��-hZBU���]ZM7H�v����i�T#?��c����ea�z�%��ٲ�q��7�4-eԭ:�(�uc�ZH�9Z�H�)RA�̓�hG�֎$�Z(�V�%�b��Һ&�kO�"��rA�B�ǖ���aCᶬ��!��5\����!#2��J1ok���f�5N\�ƛ�i���iRZg � FSJ(�!yD�B0�/�zȎ����& +�(�e���p +(���ꗮ*M;a�K��N!�k_�.��qJ\�zd=����L:a �r� ��8q�o�6i�!��|�0.m���$��^����-�����10e�sY�(T��ˑ +(�ݘ�v��9��� v�H!t�cB(�P%��2t�>_��8a���?{=��ɖQ��lyeN\�ƛ�9���!O��0���Bc����k$Y���3��6s������OD���P��T�@qm���� �����ȃ�,IE���(+ �S�\�a^A$L\�r�ɬ�-˼9q�o�;�t}��ýa�@nŝ֛�rc�#� X �dl�q ^�`�2�f�4Ϥ�k�iÎR�I��0��R)R�PX��W%�8IԠ,�Q�L�:/�Уav��I�+s��7�4m�3 ;����H[���}q 5"`"�,��'F�� +�����J�X`�T�@q-L^8i�is��l|�c�4f�c� j� +l���� �e*, oP��� �sk,��9q�o�6*L%�!w�~��2�+T���CY���]�6�� V��(<��B���d�U�*@���~� +�b+�]��[�b*,�c/��"��`����E �jɳTH�GD�",�^(�}�M�""����'q������ uɸKR$��:�DKD8�-'��\u��9E+@���~� +���1 ��z�(̵���q��T�O7�Cz�6lM�aDŽ�J��P��F|�@q�o����l�B"x�H�K���CO%x�P�dm�L̀\��$$��= @����:[ŵ& �fT�>x�,�&Pr��B� +�u,���C���*��-k���uQ2�I�z(�}�M�raCcb��MG����T���8-�|eL���0��"�����F)!�o���kO]]�h�e�����\-� �tUo��K�8 ���?��"� 5�2)���ݣ���7M�D&W� �y:#\X�4�:�7�eJ�X�2��F e�N{�1���ÎO�B#@ W�@q����E� P��`�V��Me ^,+���4�����q� NV堩�ˑ_D׾�i���[�Y�Lu,I�:�\�qL�P� ��e>>�D�Y�^�x��5#.��╣,@���2W��*���g +q"4�ڳ��>�T1��6�5aȖETr�5���� ���̡=ŵo�i��zc�U+�*��T���0��s � �*sd�d$�?�(����уI)ao��cŵ���[�a1�M�r���[-�aG�D�@Ŏ��I.�LѴLr �،�r�5�k�xӴ��`�p�^҈�������9��b�,)�8o�_�7�a!�69M!�f�vy,@����]�6� ����K��+,6&CB�m� �� Iþ��2k�]#,O�WP\�ƛ�m��l-f�mb�zo��lY��"��%q"+��+'���̏��k2g����U��,@��V�9Uʲ���j���S�G`E����f��4�-[��S$kjH��L" ��r/�#��}�M�H�n�T�ɔ���8�ܙ3>��� �kH4�2�#4�i�I�v��L< +�, (��2/v�dނ�T��\�Ȋ�+U���3y%.������d�>n�F�2�$�H{#�a(�}�M��v���\o�z���넆�) ��e1sw�ܤnਖ਼P��=m���9悰��k���Y�91�w����f l�D\���,zR�S�ݺ�R�a{ձ0�rc<���k��7Mk���jB�ƃ?�|��cyo���#�;������CTw�d~i�:fЎoe��k+q�eG�����|yc?���@�[�zD �H��L�D FNA�:ib0�zr��s�o��ra 8�:&��� x����#$V��>��� +םM�ޤW�xXFa�����vB��z�x(��Paa�E�Z=�#e� �31C_a�h���Ǣ�Y7��3|ޒa�9fQ{Ӵ�4b�̠��S�6C��*U�ep�}0"S�u���L�m����ʁf|lU�����-�:����8�x$HW�Ũ(��]�2s8P���Liu����)R�F�b�htE�S&Ok �伥UF�!Lױ�\�ƛ����l�j��]%�@X�]<����*�i�cî��-��w+�Dŷ�%ye1���e;&Ь�e�rK����<.�rR}ڄ˜7�M[��s!K�,B��}w�-ԛ��HUkZ$L/e]��d[�[c7,���<'H�k�9$v���m�m�6—C���j5"��� +a�lu�;8�ޅŅw�h$N71���G���H�`��ܖ~H�-CD�w�`v�l�fk��k ����j��r��04Skq��4x6�S ���� I�,��b�-�r?"w���NXZ-��j�Vݲ �B`��5 �JWvAW7�����$Mw��������d�}Ӵ��kމ�H'je_s~���(�M�����5E�q%1�v7/�e4b$8)�K�p �eM��=Qij.A{�JR��I�� +N}X1o@�r9qP+�m +k.��#�[��uK��6%�� %��5u(�$Ӻ�-S!v�*¸8I��LD��� �A��[�Q\U�ڀ �B�fi� ���9qd'u��� �J���8mv��J�v!�����s5A�oDFO�� p�o�"��pb4f�����j�N�J8�MEò�(kw�R�Q0ƙu8���./s��2͋�a�N�����ԃ�o0���ιVG\bdS"TP�ᵦ\�Ӻ��HHm͞,ԭ`D�% +[���0��s��8ش�K�R�S�[����$ +�[w�A�Fۙ��]QDL�m6'�p1�I2H�sbC���FRK�!��A���V��E(��c®&���ں8��[Fi�&��=AiX-O:G �آ�i�҈�7*Fkiyo:��(��r��U�I�q���i=)VQ +�M���2-�T��+���P�eb�q:AW�C�W�����Ս�GAX�D�U�x�cu��.�uX`��t �R�l.Q���٥Q�:]c�:/ƞ���)�I�����L�g�o��ۇEG8Ҋ������/��:er_<�%��]L�Ƞ�l����;�<u =��hi����q��%�pdz��|�4$�6���3n �^qώ��*�x@!O<֦x�3CU�^7w �㍴���%��zKoE4�i~t�����!��Џ�Zf�3�Yڍ�e$#$�gz�!�QIPp�s>:�J�"�[Eɇ���7v���%Ҥ��^w�cy�BXV48iK�@r�-Z ��Ы�=���4x� �+}��Q�����,m��� �$��++�\l�>���> �ȫ��X�*%�Z�����Ĕ�n�Cr)-J1 �B��o[N�-��'�w ͝� � k.�L" ��j�֭*\�S?m��� TMN�Έ�'V9����&� ����Y���� ������P0�&�B$�˺e�GhAf���P�c�1��PY�� �8o�*�~d$�X +�[��&�P�K�ya4��'+��q���� x-��c� �"� �#lYE���܍]�M����lqWbŋ\��v*�~q�d�b��Yb�������;Fр^"}y�F�d�)x'��Ge�x���� |�P4@#_P� ���I���Y&�Nnp��Zl�G%�(�K���ݘ۫�z��4�P�k��Vtc"1�F'�*�@����S����FN��h �1ܥOuDE�q�nlha��l�%ł�d_j��lYh�����cq�CwO��+����'u�����2����@����ނI�[f��e�1�YX��~���@vb��P���zVZ�m!�ɫ���$��h�9uO8�' %0�}#��^�OI}��%� �ÉS�=*e�2�̝Z�U��aWN#�-���~�*�r���0.���H\����%��9�*�p���9A֝�P����� 8����,ȩ�u�P����H�)V�t ((�qx�K�k�x�4Q�9��)�(��4�`ԪRd�;f`qB�'FJi�� Q�YC P\�:0s�� 4<(9k`�b�0� +.O��8$���P;�+�P���,Ad g�t�ĵo�iZ兎�Xz���L��YP�D� +�' c�y�\� �1�ʦ��x%"�����#iɆ +��~𰼰o��V�,�h�Q��h�Ĕ��Pj>Gj#k �x��ѹ+'�}�M���UA�x��w��*K�������S$�`,�D"�@0� ~���>tD� J��B�C��h���ꍘ��,n��A5wB����ի� +"`�7�~c�n� �%o%�9�oؽŤ�~���S��\T�o}|�DOM��T�hn\W+z���-fN��ύ�L������'�B��@W��u�P +��� ����0��Ċ +��HI�`�iPËM��^��E ,(�cw@���3��r�L�\��Qg�ff3����%$� =Wc�O����7J��h��(I��B���t�vӈ�?�G����~4����ձ�� +�SF�sX>��<�Y�Ky;�B�q7�v��G����Nb�2ӿ�CPYdO黑�NF�2��ɤ�8�Z*���/bW1{u�n1�\�!��(�A֐���eě\��)�����d/�$��~)�� �Rt�%�ٍ��0:2���G��F+/�;���%l��D��n�a4ɛ����(�"D�i#��v���M�Kԩ��Ju�2��4�_���!?,��㚐�*�����MyP��N�?TF"�E��_N�e���-&��}��A�(���1h��.�����kd�᢭R? ��U�&G���;�M�&4.O"�A� �`ԌG}W�8� 0^=����uEN�"?��$��3��x�F��*��lMI�N�8��i���&�ʄ�-[�A��YId͸�pJZ]�� :Gxb6�2b��� ǪGRV#0#��sɴ� 6Y/ZS{�q�:,��-}�P�%F7�H��B����녓�-����>hm4x��s +��PKʃ�wf9�����,G:_�s%�/V�b��:x���Ӕ�K�/8�2+�B1�t�Q����ܥsQ�I�J)ݮ��s�m���m�_Έ���yy�'u��>��I��"覘,�(��~g!&��1����n�s�b5����~o��L���ǀ�h��M��\��i�12{�o$�������l�o �"O� �'�mO�? +�8I)�����^��oؔxO�{���Q���"�7Pb�݇���¿��{r��e���>�͛V�Hd6�ѳ�� � 9%��'�A$%�s)<����_��ʼnG��B����)�঍tǔ���ްi�̚��ߨ��s>xK6�p �Z�����X$�P����'JEsH�r(a�_��j�)Q��XotF��E�� !��ui����h(/�t���W��U�u@�f�'f�x��̥~�4)�,�|���s�>wrT-/<����P-��T��~7����J����U�%3(��.��p��m�ؑ1�r��k8�]� ;���&���r�G�?l� ��\OK�F��y�BrƼ������ˁ�ڔS��L� )�&� ���>����QH�����L�� p� C�q� G�}W�-������� m���G����령� �zڥ>��U����8����5���d����p6$�IM�cX�L:�8F���؟Ncs;� + ��g�s�DGĘ��b��.򃤏�Dp�4�҂��v��]���n���i}�]�H�q؜a�D�x +T;¦��TD�E��o8c�Tp��,�/@~+����Nx ��9����P�r��$ܦ�e`���֦�_ZAU([aC=[�TpJ�G>��VP���"���"GּO;����9$"J�&���|mF0�.�y@"֚ԗ�nPU!����R�4�۹SOPe.��;�q��~�R�)$�\�pB�,���� �������S��&}q��[o��6*/h���j(�k���w/)���ui҃�]��(K��C�#� ��.���zl�#v?�����Jf�y�Cߌ"����h��*�k�y�XD���3�����ZA�Y ��������z�L5�Z3�%���lB�:@ii�Y̲��Ls��AQ��V6��,N Q� (E�Ψ��B1c���R��@XN��m^�E&�F&�y�]o�=�#��{P�S�KB5��� p���70��K���9�T���{���-�O��k����-��"i����pN���>{������l�y�{ j�z�؃6��]��PlE��M }Γ��"�C6� +ǀd@:�ǹXK�$Ga�n,+O�pҘ��p(�^����JB�x�&{��w|B=y ���$�ε��9��Le�����J��vq���I� ��r�-w���EE�f,�����Cqj�6h�C�!�%e�6����r��&L�Z�N������ϟ �T�b�`���z���-�a��H9~� +d��9`֒<�����(��F*����X��L1�ib�1@hj�D�b��7��LOi�K�<�콂*�o��#]�7xl�c +�T>�ě�%H�����S +�Ä|��b �Xo���=��2%�K�� 7�ԥ`��>���,�W��{����6��4r/���[nS�#�c|&ϰF�Z�F�)n������*�u�aM$�L��N� Pi�2�J��#.7��h�훨о.u�Pj[ +6q�M�_.��ol���n���Z/9!��$=�i�F�&r����N�ͮ��������ܸ n$������:���i����;�1f�-��#�����'׿�/0��GJ*�j�5r�L�t��ܘJP��`���WV�ԕ��q��|�3:7z��[465͓��3��(����G�� I7Igw,"�^K���u�?R�#I�e��8w�X��w�P������tB�W�ȳ9ޱ��d�� +:,����٧c�B4�6�����ffl�7���#�����1ˬN�=�k�z��"Ħ�1��/�X�i��@A�cEN|y�{t.�oJK�&����A�,UIB��I��I�o�ӥ�����ŀ�Ww�ll� ��5��ņ�I�x��)R G�ߛ�gMOTO��t�g^���^���e�`�`e�"tr\} �*'�!���*uDw�u��X�w�ž8�Ћ= =ߗ�D���.��ǁP�����Z��rJ�CC�.f��#ўl4��#�d[$�g֚l�I��Ds/U�o}��޴#��+�Z>=k�4F@�b@�?���F^��wiҫ�~��R��f����as�8 +�-� + T�K�G�m�r�� ��(����a(q�z!�=�a+B�Ţ��Ke�D9 +��%����p�G���?_�k𸨫% R�W���4�(�ŧBn}�[Y����,��S6+�¤;-��o:���!��:��(�&�FR��M�f�F8Z�����88(k�Ĥ���}�?���K0I9c��zv��r�8���h[� +0����;@��G4@�{�^������ ���Rl��{�������HL�g�8�5��J �������.=kA68"qy���+ B��L=SY���(K��֔�ia@c|bKm򎆐�rӍ��.2[J���]$=�S�v�A��+x}!X�� ��8��]����yBɲ�D�XO&�o'��_2Ԥ�V�!��=JU�������o���=���:XS�0��G��1�`���I}6O��&��ƾCN H�wy����t������0I3�Kd��C�&?0�ӔY�����k��Uga�}���I��x+H׏[��Q�bt�=� �z�.�����8Pz�s�3EF�r. +�|�p.2@�u�-���f��&�����q{cZe�����4�����Pn#�ݸ f���$j>�Є�2$�c'�XGGoZ��� b�33�<���j��̈́N: +RA\�d޿?h�b|6 ��f}�����+���lW�\r���E;�턄���{�ܯ�Q����IR�8-�yh[[�Pw�,2�m��{:R,�h4Z9�'.�YÒ4Px� \��8���@x�PKv�R��EC���u�WQ.-6��H�;ź�,B�;cTT� �?�}��iXkEo�+ߏ��A������w�����A>{� ܽ�ddYt#��u� �[��� ��ς�2��A�3B����2-�$��=z5��I1h"��ҏ&��z۽��?x��q?L7 +nG�?�\���D�H<�R�`�� �rZv�*W�}L�@l��Zm ��>��)Vl^(+�wM�ˤ���Zw��>@�v�M��$*q3W��@�ۉ��-�5�P���&�TI���>�2��{��č���v�gI�gj�j�HK=_dJzTڣ4Q@VA@ +h��@�u�ˍ���� ��ȢMs^?C���Dz2|����a�T{�����".�ۆFXv�-�������2��oo��b�c��M�F)8hF�@� ؛�B1"�Zѭ�� ~q��\S���y��l��U�%�@�S��.} ��t���]�&8/��!�%�'`kη��[L}JF����+ �jhsQH(H�j+E����o�qj����W�E7�?���Y1p�.�K��VB��_�^t����/ ��h*�傚BU�)����D�u +��� m�8��\�Q<�T��LWw8Fz��p~S���;8���3�S�Ri�:�1yT��EZ+K����?��*o���墻H��ƣ��M�̔S���k��/XMx=��D�JR�7�L�b�SO� mr����"�x(��{��Q)� @��jҷ�xp>��WS^�_�4Z05ڦ�+���3���6$�}*���j +��Z�B�)��n�?��73��0��@�"������1�3@�T2džD�~%��n�� +�n�������$��8TʛH1��c=��#؜j$x��7�@�l�����)��7��j�"�K�)yq���W�.�z�TN��e +���jYnaa0��EF#�=[�6:RB�̈́cp�.I�Mc� ����q�A�ijK�C�� +��8�����,�V��Ny|�1�O��,����!��X��눽A�H�}�_ `��1� +�9�L$/W.u�0�[���)B@id?M��4�+�7��2�׏3g~p�\���`y���Ľc6�W@���g1fj���q%��;��� [�Jj*alL�s�������Y@i5S����gqm �5b���]Iy������& ��/� Zyg)0(�)QX2�!`��,�`K�=a#�a'h9�9�Vȅ����Ɗ�o����3�C��l +���q� K��6�z]L��R}0!oɢ�-����m�v|�VlD ղ�# +T�����~���i?�V%�E�H�� 3`�� }Ih�^GK ++e��� ����C�oCD��l�T��;La��c�ϒ��g �Qol'��No�}P��g�j�a���ᠸ�E�h�7ˡW�z#8��p��Yr��{z��N����Ja[�i;��{UNг53A���lzϗ���)9@C\8��i�=�=�TP��H`�P�&L�(j<�(�p�����0���y��@@��L�¬��*xm�f��J��n%�������k��(�3�uE��!p����&b/G���"�2��䳧��=u������P� s�h��c{!(G���yח̎�;�_"An�2`-�����]a��8k��#�ά��'M��X�߮�3K*��)����R6���l[T�D`�w�eK����?�N�JO~9�� �����g߆�k�ao��l���2�%B3}L����� +���nA���A� +ż������`E��n�Cז��j��� �F(��!`� 4�[��\a�oЫ"�*Y� +�Rhk����?I�X��a5mY)��DX����v��*�`R�����;����ぶ�T����}����h̒U��q�-C �'���)q��y8��� ږu�< х��S�`���e��~�.G��ĺi�p��eǕrRصeSs#Sh1����.`hf� �]ì��n��a�V��fj����D���#&,�u32���VH�q�Kނ�����ia�u`>ܞ�3t�=.@�}:VNJ���nd�B�<�ݐ��ݶ�l��4�K� ���O�H��_��/�V%�Wq�8-������N�ɾw��b1s �g�w� 9�4?�ͭ�lr�dɒ�r�\C�Vwnu�1LK28�������{�]l��A�aMFbK�J66�*s?��ٲχ�?o�rH��n㎇��R[0y�Jx�`�=���$�R I��țh6�ݲ�W�-�,5r|%�+ϝ�p/��b��DL�T��q$� ?�U��z ��jC���*)����R��M�B�l��;f� (����s Q_�Z ��� +6ẚ�md �]��m�9c�5�_0�2$դ*<��G6�e�|��4A�HYqzf@�$��5~���+��JO'-�-��5W�����E*��g����F��2hc"�Ԩ��o�N�� +�p 5���;��W�Q�Y�Į�׀_��Ҋ ]�U���4�u�p���Tc���� ]ݪӸ�\A5��p���D����F�Q���v=�f|�x����M_�@8u RA̒ap�.�}�Tz/���UKJ��z�}3{wd_̽|%�c���*e#ڛ��r�Fߟl��eɞ�C�o������)W�k�.Z�Mn�Ӧ�^%I;\�5�O�>�u��nf��DC�#c�6�Ja��p��2q�wq��~Z��@PbrD8|��x���X�������gvB)9-��og���^���m�ϕ5�s���7�O%�m���h܃�l�4d +�L�RZ.T���#$" �2��hc+,�ei0,p_"N� ��4�ke�@ +Ǘ�C�xD��mFtSJ1J(��t��bܗī;�e��\MS�"��^g\ � +z K��ݹBfY��:$o�!�Cٓ6�W��j��s0(· ����þ+�:;K�D\L���0X�R9����Bn.ò�6����\��d5[�0��bϒ�Z��=�n,��cκKKD�";]:ؚ���[�13lrӺ1 +-��� X��~��=ߡ +xi �&tpU�GV��Va��-�?#{E�,���D۹����[u�2�YX���G{�.�S�7�8&���u�Zgo�����u�Wp��K�[RS>�$_1��ro�]WN�j���F��Mk�&�5-�0�hd�J_+ٷ碵��iD[����Vi������'#�C��<�V��z���1�fC{��4E� cV��)���1Ɔ�����4,p��j +��d��>�L�aj���(j�:��`��6�~UJ��3YZ�,��Gɤv��¨&X�7u�Ѵ +���yY)qV}�%DF]_鎇KZ�� +l�KaM5�]�K�GSej�b�y��a��9H��e�6OLj$��J ��3�������鉣S�C���‡Zݲ+��V�?L4wu����PN��4Б26Ǚ���^�P��X�6 ��v�d�2P��tb 7��Y� ��M{F.7 E]��\�4�w�G"$h���E�!��酀3��"�Ѝ#n�]�۴�����ކ!p(���2yb�:�����)}Đ�j+����t��;b9�9�FH�����K;;��6�?�_� 4p��^T�n�%.��/*{,x��86���j���B�y�s:�Q��\ e2t x���*���Ei��B����(3����fp�dT����-=�:�O�ZR��}�����&k�b�'��f|S ����B'7h��?��ڜs����:t��0R��e��J�FR �g� 2�r[�3��&��]��*`��iv�5a@f���� ���m�d��Efb�6 ��2j�����;b�e�}PyfO�ɽ��Hy����M��������}��<Ĥ�Q� +�3�O�\����N����/� �7ʣ�h����g�t�0b��s�b�:kɦKcLȁ.�$R ��^ն���m�X�RM�h!<0 �,$�`��n@ݕ����,B��^p��Y�e�N��ib���L#�j�%g�X�D���?���w�l<��Ƽ!� ��L3�}o۱LH5.Vm��j����iD����V8�ib�⪁�Y͠9�.�I�~�䂔�A(2�4��6/M�/s�A��ib��呿1�G�U!����� �G!#�,���y㍪A�xNw��7�MTÒ��F�9�5 �(2�h\J��xNTt�=�@NQN�KP�� � +*����;��=��(v���n�/�zY�1Y��H�[&K�ň�Q�m��������b���l�P�iĐ�\1���5�w�[�wO00���]�������<���'�Q���1��+(� �L� o%�Xj� +z�YvT`�a#d�m�0cof�Gw��eՀÓǢ�R�d��8X�$�k0˓�aT��l��p��ʴ̦���C�s�UNv��қ�I$�������o/T�#&�ޫ�Kq�����,a)PD�0��~h�P��I�� �.sa�)Jr}���V��J�<� WC��X�1��l)Di�J�� �Nu� qK1��LGOŚ�*n�t�4:�5Օ������Q��c]z��m����o�%E�z�a�R���f��eU W�\� T��D)f����,=Nf4�x�č[N�f�b��������ܥ���u�q-��%��No/�?��N� OҼt���)�t-�Q���D�����0��� 2���}0��V�B��adҢ%���A�V��x+{� �e ����\��o�6VЈ!�eq�K�S��$.I��N��@L�3>�e��*�P �eBM?���]�A,��r������[K�2�@]�h��..�"�FI7�̱H�MbI���h�d145E��<����9d�������7a�����+�߂�x���s�"��a� �g}��^|�v2V3�;���Z�gP�R�iT~�MfѪ�:���퇡�Ҟ��D��&$��)+F1���`��4��u�@���me%"��38�9(ɗ�\3�*Tf��ij\!/��N])�i���Q�>��{��z��"����1 ��{��5kEXXے���#]I�0�(�Vw0�V�n+����n��Sy�B��m +�n�_�H��<�`���V ?>b���gFZ/O�� +���z�u�4���+|WNӌ^tǔe%��W�+ +��z�ؙ����E]{�V��:� le�]�w&�������8lP�~�<��l �ܞȮ�*Z���BK��d1O�~a����4fP��J���E�]wc�d6Z��k��d$�L�������3Aw�.Q2���[��P��2mT4EȦ��ߤ< <�L2.��_U��KVI��2�!��/ڷS�W�r$f�B=mի��:�������@HW�>�ğ��BF�onQ���3��W��s��?q�w��]s��3��N Oȵ�z7j��]j�rp��$�|�ߪ|�xڑ ���yr��d�.9?����=����O��[����-?�5Ƚ�{��͓�$qh��*%�3��c"�f�o +�,, J! �����M#���+�"�7j�w�Z��C�04{}�J�#e-W�n�뾒ڪ%�(���"�#���t�F�ܟZ�"n� �flK�=e� "m�M�j�|wr5��EW%[���q�� e�޷e ��"~�i��B;TE ��o �qV�U��c�Z��c]�b�*��NO�)8h01\��k5*Z B��;b �I�{�󈩁̀ ���������Y��#.�� L�`��<.n�\r�*H�/��{+�R�H���q0�Q(�㽥A�<^Q#�t_��;����K�%ͺՍ.��5=�P�7[�<�d�T����;�†��PïiWaZ�v#}��q +��X�a���[�L��kc_�5۰2t�x�q��XGu���xנb +�\=�|�'C��#3)�',����|��G8�c?�����e�Bs���z�"�mV�L���g1f�Um$xT�����\�V��� ���$û�2bq�u��(閸��~�ذ�d����i+ ϯ��볆K��1lG�?���w\��)����`��ܕ�Ϥ��B��;fJ�ؔ��mE{��� + WH$�#r���/����y�B��q�8R�GQ��]J�>|��GB.d�14S�+�2r3�0�;MҒлTx _ZDŒ�o`?c�r8�{$�և��q`a�l0߾7l|�� 0Ucw�� JPJ��0�H���E>0 3��;�C=�̀Xy�^�W3 ��ꥭ�sc<�+�&��)��N��>i��g���O�\L�L��[ث�阓h3���zn\l*�xz���c�o +�Kit�v �1'k�؉�Z ��]m$����"[�AL1~�rd�mb��i��`�:r�dy�u���uH�����uN:�g�)GӃ�yM��2��.�` �xܦ�Dr8]�G��*_O�r�X�� 1:Ȧ���|ߡ9����Ac�V1rTgB��d��q������XlZ������;Tر�:D��.�K�Vҭ�.w Zv(F��W]�9��0:� ' +��ߓU�uk�8.����yB$çu_�d�`Xr��]���V��a��e�Nl��:Lq ���z9���yr@�W�$1���l��l, E�N,D�~��u(B;��~q +���F���Y�$Cƹ�&v]4ŮX��:{vR���i�)��8���!N����59�?��8;2I�iո�DI�.P���Y��_9�����*99���.R����� �U�f�*q�<���&mq��=�����nm�r����w ; �b���<��1�A��>����� c"�`0����2�<��';E�]�䌓�E�M�P�~y�P��Ĥe���?a���@�M Ș��%}~i��8���-M���'�6+蝦����W����B�>� +43W���s$��h�,Տ�܏zI"��Q��,�u*� 9���%u�U�K�~��T��Q���%��,Fv��cF�����V��� Y&6w�d�?�N�)�I��o�Đ�v�����L���vJ��sg WX�v��ıBdؕ���)�R���8ÝB���W�"iw�kY�kp�-� ��{%&�ztgW�;P9D}�`�Nl�N�Z�V�|��B:U8a9"XE�R��g���p&ߢ�JњEo�ɦ�������E����z�G�j� 7}�N�O\u2�d=��#��}7Va� +@-�wT�j�|}}��3�[�Z�H���}�C6�94����a7OK��ֿHJy����O�E ��� n]�����9;�+Yru�r2��|l�U�����v�Z-@��П/¸F�5�N�a�S��5kJ��F]KS��&�Y<�ږ��O�R k� �h=��uQ�W6kJJB[`�A4���b:�.W%fa�A=�6�.i6�b���b�I�E�PVU5*Q�$���m۴�91��kfZ�R��tg���@�D0�eF�/P��gM����"��a�%f� �G�Pt���-��TsPc��!��],���1�V�v~��W�!�a�@(�\n� ����vo�Q�5�Hb�.����dd�/�+���=4�=@k���֐��͜ߴ�F�wf��� 6��r6��9�2 �K���W�{���x��VT7�ܩt��9B�\'#$���j��m�X� ׵�+}3�Žf�x���l��?��/���|7�Ğ��7�"��ˋ_�x��� �;Aݙ� +�}6g%Є3b�*n]Ó:����<0#h,�:�;p2jXPs/�`��7���v͚se�,y�� +��e=���m��������iD���_[�CQ�X�%c�g�Ԣ��V��B.��d�q�=\a�-&r?[�kƃ�G1y�⼳�K6��I��@�������K,o���Iz#ClP)�'p΄�T��(�b7�a�zs�MG���M+ْõ�d��P�]�ڂ-�����,� +&�x%�t<���n(����v��h�����L?bp�Ϸ�ș�Kf�:�����y�N)%�"��>f�)��D�,�� �(� 9W��f�F��H��,@�����3kQ'WQ��孱o �f�/�� 3.����S�[,$�G��A�à��S;���2 ��c7&��H �j;㕂_��B �.� +�nfj%7]W����+���h�LFF.�S�q 6�Y�Sɂ���������Q��Z�twDY�y]�:m�KND�`3�I5a楲�:1��| l�ߢL�N���� z�I1fv}�8�d:k��E"�Oл�+�-�&�E�������}�ȧ� ��P��}T��+��*�<2��L�,l�,fѯ�6R?����m�q�Q��\�Y/�d���E*G֍;�+$��G�8;� ��Xi+EVd8#Ӏ_�ޘ�L�IJ�����"���p�L�\G��Vk�v����) QS�a$@�����Lq�#y?D,�>g(��*4Y������\(�$�k�ϯ� +�!C���4*������OqI�S$-�.�% {*�ǻ0l 6ff��E��ے�Et��[�D�]$�%�\I���\dG��Y =� +�`Z׀d6��j���$�J�3��XRuG0�^���vb � �[��˷��j4���:T���)>��O��k�����p��4i�X�L�\����h�/)��;W���`)E?.O,#T:�t,�vH�(�C���.� +F@��h���� +EI�&P/%0�DXa��xV� +�<�z +�.= +1N� /�F �v�� rVc)i��2�1��GW]f�"r��R�C4ۓ�RJ�Uzf��H�l��2�ߨ]�GԷ7O�v-D�b'g*�/Ny�˞�3=�A��Z/��䖟|�߰r�po�ܤG��7-`b��d��䣅��� +v2 )�p����va�#$��]j�� ���*7 ��DV^x7��G�!�Jk?��*��}'���Qxh��R�m�9uK��Rl�zyq���ַ��M � �冁�24���U�k�'b:��)pY��Y"7 '�����o.��> +F�y�yY6 +�K��wXF<��'$ѩ�����QP�Ŝ�d��ˆ�C]6�<:{;҉�7h���Zm&B2�}���!X�������V}�؇Wqe���04��܁{#�JC���#��x_q���~Gq�;�7��B+�7��]�� +���o: @�}��b�<��c�W�R֏#�B�����Y��WPү):"t)�q��HQ�z�n�p)�Oi�jD���؛���2� $J֠_�@�y�`U�;���"�\R�S�H@v�Q����в��d��n9�w/k�˼=cd����K�L��M��Z g:R5:`�Y���$\ G�BQ����-G�E֔�U�hCC��[n��J���}ڊ���l �R� �ߋ��zDO��˖ͽT� TTF����~��4�6��2G���� +�Bqt��9C�it�(��_��Pꯅំ��3�����L�xL���$OlC�� +���q�b�����i~ؖ�u���S!��"�-�) +�W�����i����I�������A8 �Wv�z�A��"`�Y��F�#Ĺ�)�6�!&�mT�a�(pڰ�%-yt����ۉK~] +,�<�q� sz���k���ge��M�>8����I�nRs�\H������ʉ��|W�e5��6G�s�0}���v-qVӃ�Q��9��r�iP�/:��6���$�e�R���\PlU4᠌N�p���U ª���\?B+��#�����kߍa� ����a6�ӻ��<�.2q#j�f�S* {"��n_,P�L�DZ�J�T����=��P���'i)oj��V r�\��}/+� ba�����Y�����ȷ���'� _yٲ��������3�KSC�VF�jv��K ���y������(��W����l�֘�����b&�&̩MX_���E ��pk�Z�x���8P'En;�,N}���j�p�~i&�"��a"+ ��<�S�Y����x�L����� Y���=��(�>p"߯��r$���4H��A���޴��d{��K�bI�*EX~��I����a\Fgi%�S"�gV�ᥘ3�� �� �O�M��w�Z����qaP5��41�Hpb�����D���ҵ�bUw�٘��)�#C�HwH��m������)-8< �#�m,��Cu��U�/&�G����"GO�3[ Mb?��`���y�ޤo�I&Έ��\�I�+��ss�j�C��;�q�K13��O���K��X@Q5���&�<��`)S�J[̩�����{�-�ըwo�p'Sz ��a kݭ�f\o�iYfP�\��!���s,"��(\��_tU�X�{m��j��C��y( ��}�jp`,ynUeXc({���� +l�oJ�+�s�ɘ���|�EY�af2IY���h}��Vi��=�&m�|��O����۫��h(E.� d�}���_��ճ$��"�����IA�J�)��4�i,��5�oZ�>`7�Y͸�P9?��D<�Ia�i;�J�A)��,���NL0J�e��KQIujA���nV��c��a7���R��m�q ���B�����) +i�%��������]�뮪@��*��|6X5�ͧ�9�Ċ����y_�*��� $&2�g��%C[���nA� �$�Uc���f<�ƌb�=�L�+ߧ<�3u!��2i0Ñ������XX�O �mub��^d�g'Ny�A F�����<4���ωw,�#v� ͆;P�&,T��0B8� �!�\�C*8���ϔ�@��weA�U���I6. ő�%��[�m"��2!�< +l�wƱ�*d��Q���R�!��W(�Ѝ=��BqYcu����ן�C�� Sw>"���n_�s:pb�IᣤP��ۭ�8�����L Yn +�W.g�J�ƪ�ͤ{��=G��;��c�4�b�Nw@�n�h;:E�A����o[��4&E���B,I�ѯ��T�pk!r�Cށ�����<<��J'�v�(�����kLQ-�lLt c��>¬|~��!4�����'1UF �y�v��rMM}�����H"& $�{�ə�2Z��˜B;Qo� +��Q-�<�N�Z�8o� +JEx���@D�)2&�US��&�:���}|vb���3����1�I���QGy�z��OE���3ذ;#h���Ϩ/|8���+4k�l�.j�W"B��BhS���&�t�� ��꽥?��j��=�0��V��b/*<� ܚ��S1�#�?��KP;r|m����`:p�B �C_V� + �6�:�3���-د��� E��<��@3l�dS�_���>M������E��'�o�o8����#�6�����/YM�`�8�p��A��ה5+�VQw�G�%8����;��'6��w��2p��a�������C!�*�a�4��fL*�~wI����^��Uf � � YB���540P���.�l�av��$��5#�r� HX��������s�ݤw��/Q� i=FoMR��Ph���]#�*&CH�f�V����P:������������@*s�W��k�"�<�ڜ�E��`���e��d� ���C��5r2Dz�"c�;��|��N�T|�!s�>V�B��|���h=6/{��v"�U�-�C��ɨ�c x?oQ����A`����b^vE�%�L�5[�J�V�0�� !�+f#3� R �&n3*�->�������6��!���1]���H���D�|*�籭�B�ȧ��Z��e\J}j�O��3�Q���!�I��H +qҢkހ���� �~��t��h@�b4ә�\ u�y'�B?l +��}��cVik�d�mQ��#J����fM�����G�"� ��e=��)gOQc�Įa3��0�/����Q�����Mrx�@�������K�"�4"0/������V�l�[A��|�;N-�����H).�<\Q��&ABԲ�# ����_�t��}���eKW�\��l���������0l�&T�Ar��R2I]�V�����D�IQ?O�T��-9�I�(���4���st����� 54%� +ږﲊ��������\sa�����ګN��<\� ��1�"5��+�_�"o� p��ѡc��@� .��d�<����V�oW'"���Ԑ C~��E�[�v����0D�o�Jlzب��Oz>]uA˥啄�N�;�&{�Yc%o����J���ׅ?X�O���gQ���Ѱ��XBVE��g%��͹�z-rqH״�5���o��Ϋd��\�㵭�� �#$��s���Y�.����N���d"%�^{���"�SaK14f�uz%��R2��-H2 4we�Ҕj1�����(g�E7�������}.��S��,i��P��X���gR�� �n��K�k�"�bX2���lb0ה`IQZ����L��Nj*�7y�.}<�"�2j:K0��d4���/�K.DS�v�����~̎Fbf���� Wd�G�]Ed7o*q��%�_~� xL:F]X�|q����[$Mf�G�p"~�o4{f�vvUR��\ +�t0�4����kO�F�z�g�T#�2Zt���ω:�h�K��%�ޢW�����"ko�ˏ~?پ�9H��i���y��흒�v�D��E����kq���S����C�Q�������QЗs��O��0�ѕ����y�B�߹��0>\;���)"8�����+�"~3} +��i�b��?�Z��!9�+1�|U��ξ}�[��4�P�{��i�K����8�|�?QP�zfrHr%$�ac��L;�"���<��R��%u�(�Q�D���[��,bL�?��I�. �:OSAI�MJ'�imDA�zQ��k��k����D���t���Uih�z)�$6�2��F%�$� +n��S��=�{�t��뺮��/h��|���z49T�R�R�R +T��,�/-P��� +����J�c��.o{ ��o� s�ԑ�X`�Fx�!���U*k��qYe�EoUeτŤK=�з?B�q�*��8t��I��WZ����1 ��?���D�.X�;>!i/� ' �M�;��t>�g��`���'��7Q�!� ��D�Z�� +�G�G���n��;�t�|�r���B +/���1����%XSPʈ�aV�Tc���n=n5�eM��Q���GH�{ ҵ���.�?�M�K�c��ꜿ�L�Hn0|'�/�9�@Mn�g�?FԿ�P���V������c%�eqfĐT��2�����.LnȌM'�T `<8���e� ����|��`¬�I�I�M��p+(uGg�';p��X��9՗%jt6���R� �F�_����Bm7�]8~ ��;�0�@o�P���BP�l|��q�� ��!����7_��c��}���'��M�ĮşdT��.Y�:���d�),�s�2��)?�� �����؝�:�|�L~O(u|����T%+�$&lY&��u��:��B�wC�� ��+��=c*6��S��08������J%��G;�)�&��84����s���T�a��`$�`g�=� ��˗� +-�R�.���O�� +JB������0 �����Z�#x�f�($nȚ��5�f��(q��=��P<ɘ�[�Q�1��K�e �7"g�/�o!홽J��{� ���S�~(��C���>+w) �39�[ٱ�u��X �罍l���`P -Hѩ���/K�("u#�����/���< +��$pLf��^:h_��EgX�z�b�`�t�H`�ߘ߫��9���~@J�a��ۢⓘ�e4����ee&��eaD�%&"�����|G +9е@RK\9а��t��ɉwOwDE9XJ��l����4lC,BRG�����K���v����db�Ӵ��FZA,a;k'�Ѩ���llJ~MH��V�mlx�p}�YV�؆��]T߀�}�6���)b%��"K��hґ/�C ���b�t�nH +£�I���0�򠃂�%"'��ð���C2�#���''W�+䢐��@�Mb� +�;�ҩ���/+gЭ>�R����,�,2$`����t�� +2���ݯ��q� Q�E �J��9�Jeä1�'4��59��"' ���#�^�v. �D�}o9"���1 ��IW�2IG��,od��sꐔ1��&�b������1�# 7T.V;P���<����gF�.��l��*���:��|B��� tdHFj�[ɭ?�����|���~إ��u+�@Hb|�qa�k�h�7� H� (��4�\_����@�D.#�%�9_�h.���f��q��dN�1��M�F2m7���ބJc~������} 5pD �_R�V ��&����Lydy�O� ˉ�@sX�)�R�zD�'�=$^�۹ �]�6�k����D������8aS�dS+�@m��p/��,�DZ�0��у]ߺ�p\F|Bģ��:�5��A d-\��e8(�;�MX[� @�b����u&U]Ÿ�1ۗ�/I���/��@���<=R�x� ��T�tD"��/1RS���1 �`���wt��;hx�D�-�֎����c ���jW|��e��E�_��Y届�0q����{�_�Y.Ř�̢�^G�:DWJ���ҾC���:��Q��&�pҏ�=}>,�O�H�tU)��GɗE��:-�S��; h�O��heǭڰ�1xp���d���:Q%�N��J�`!51��� ���O\ �q�!�Xe ��9[��B�,L����yL��;l�}!�/�����i���Y j�$��xkW��d�`H��Cy�C�7`05:��d��f���'H"Gፘ�Iu�p^�9�Ԯ�ʨ$��h���s�9��h>� c�)����y4���$B� �Y�����H�B�{�pV��Hn�YW����tj��N��{Y0��uN�g����s��E���O[<|��S�W2.� +� �ٚ�W]� �MR ��!�-�Ffut���m*��K�P��9o�Q��{Y�7�O=_��[\VC�|�+R����ۆ�����v]�3��$DEE����tQL��@4���Qx�/���C�w)tٸ ��g�s��:]ą���s��=�o�z1$6K��+��jx�~4��ei��m'ާ/�DV�KxД�]PЕ�%w-���3 +���|�ȗ�3�cT� ��E +t��,|K���E�i`㭜T��`|p6�X�"*���aoѻ �9���{�ɛ�$ �B�ɍ����R��ݶ ���|��t_�ި�6`��ry��b�"��#6���i�Q�Y�2�M[�X�\�e]�e]�eY�uY�uY�uY�uY�uY�uY�uY�uY�uY�uY���廣��P � �+ɵJ��Q�W�#��Y ���K��C�p���&@�'9v��U�F"q�긲I�m���[����4�8IL�Gx�sο.ˁ�BS�ܵdSmB� �W#�u�"V +ep�R��~IA�`̂�g�rJ��訠�|��EzU �f����������l��H̥s�F�LДT�������͙O���D;�]������ 噑�Y|@�P�Tח����ֻ�����a�u�-��4�# +ep�{>ʸ���$�� ���3�d���&e#U[Γ+��&��,�Uu6�1�&��P��F>�� +*Ԉ���(��p�q ���*P#�I���e0�#��=� +����(I� /�����u��VA��R����E��8��8����cDh5�+�=W�k��>Z�zb��������eqJ(� +�r6�U�����S>.���)B�6��D����S(�#�Fh+m��,M��n!�2�����q�c���� W ��πΔAۙ#/����I +�"�o|G[��ZIh�Yx; S/++ԗ�⷗�e�"��k���{¤y�R�`�6s�3�.A%z�@������@S(�C'�Le� +�:�ǗuR���SB0�7�nЉ̼T|���Ī���� q`ڡ]7���� �##u4�J/_�^�,��0���} +�H�ט��)a���PgPifƙ+�' ��,�I�^F�~.�� +F�\")P��8gi��"�xLH��nsI����J�����4�Z�/��'�T/m9D2�C���D�iS��� +R+�Vo��Ҙg��� ��d������nn���)XtMK!<`�ƕ �A�Q5{��=�mz8���v������Ϥ���b�;M\�eY +�de9��}M��5����1���z~��*�v?m���-�#�`G����%��k�9G�#��� +���@���ac�'9T�2X��S���PA*�� +y]U�~NC����t"R� ��Pa׍჎!} �*����پ���cj�C��M�Ё ����RVm)�gg>Ip��v�� =�P+��>E�� +�H���8Q. �,���SJ�eI ��{�<i��E��wTU�5�v/�4�4a ���?U�C�,���(��*� p5�`(�U��%/�]���TTl�Lu}�4D�mF�{�f�L�BȔ�#vq�����]��WV�� q�9E{4�� /�ʆyЅ$�oL�e��=�"Fv8��|T/~����Y�ԡ'Rp��H8�)�@p��I*���IݎsPj\�!rc�L�v!^��}!�H3�ʝ?���D`��t�s�5�����܁(�5���fm�P\u$ ]���%�C��R0 {Y�q:<��3����,gG�������W�|�0�i� B�T.ND�R�S#����+����.+}�I�Ъ��qh�4|�b��y��^Q���<����6�!�P�+�-��{�V +��r𥡔���,҈U���i[ȸ,u����ˆ�RMҼ�����P�(��Ĩ���F����r*GӞ�#���8\�wv��U$�� +e0@'՟��8����J$֚>/!#+H���P��&0dI4ֳ�pK-����7���9��B�9Dz�{�,*%�㚎��.s��� �iL�vD�DO�~� ���>����g����t�j�L�k�!V,J�b�ɜ ��&5��\#�h�of9Q�y�B'_iL�����ϭ(v�5 ��� +h��'�<7n��t$l|\�A$^��ؕ� +��]�>rr��^ +3� � '����V5�n p�^ICOf�[Z��i�r�@��1�8P�r2CC \��-�z$F�i g��B(�C �tDB_ͩܞ�U ��m��S�%��qe�hG !֢v�q������Wd��%�BχjU `R���t��'�eٟ�P3�c��EE���K�Υ("��ΪP럩�� ���Ճm�v�Ƅ�uWE����.�E"��JUE,?���:y�P��i��[fR��@�4 �J6�Z����[T*�%�U�L�uL���T�+!4�:��Q�:'���K�8k�E�2^�[M� �9��\�"���p`���s�S|��A+����*- �H��ؚ������/L�HWB��;!9Q�D�=f��!=��d?�A�}�r�lx��[a�X���s6 �� ��>��Q����Gb�(V�!wW`���ms�e��n��^�*aȝJ���F�^��' +�:zFکU�)�M�j�vo�����曈eě�3nJ$؃5h* )Qy�&°� &��2$��e� !dsPׄ �A�'�t�]�b^��<�&eNH <��d\j�.5}j�Ž���(�=�2� M�1S��H���Ő���M��^�sAX�ϝPϸ��fD��{��Ey@�sg7�=���F|S� �7����n�2��$}��\� �@u���l뺗P���c.rK8���^���}� �D�R-�]I���5�J� r i`� �jQMĆ����Vū9�%�*^V�A�:����Z�h%���ɮ�cS��[qʌ�"�r���ҍ��a�G���H��nR���"'!�AL3�����e����D��*8�D�Q�l���Hg�<���a(n ��s��}�Q'��K$o�vJ'�U�sG���^��I��1)�#yTx'�1�jo`�c+"�h%P��n��>f�@�ă���kIs�;*5h���z�C�� +/+��8kH�g8e��’��ׅf�j��U"I/a���Цp5��P�G� +���xSK���%rP�t��m��ȰPg ��.+� �� k�40������ৗ�`� ה�kf���cL���Ġ-���c���;8�~#$y�b:mΆ���l!ͻ�� [ /k���lQ"v�z�>�����i�I��t]l��؀�#FSD ��)���]� �b���(��Hg����J�HH-�K�o�)x—�~`�Y�u� �讠��=0z� ���� ���E���aR��[�`���޻�fV +��"� ���tzM(�%Y��Č� � �a���#�rثb@n\�KYϋģ��� ��dt���vj�X���^V$5�8R3Z���Qy|շ �� ySZ�Q��?qx*�5u�=�� nW������ 9>c�Q�Ѵ2$*�0J.��n.4��^V�gX���y?�ttH��]�Դ1v��� +s +�'1���ھ��ڊ&�8tU���+�z@`���4��o�� e�i�@j����e}�e�!|���(�21<��RA)�L;�ӜA�m8=%��� +,�Ъ��y�*t%��.�M(S�Z'/�"��2��򲰏a�kElO�.S7�P'2���Ѱ���`ҿ���3#aTc��N�F0�J���a��8� pd�hX3�����O�e� ������� B��'6�TiD�$����F�Bh�����I����s�E��iF��ˡ�`�5,h��� �i|ĪǠ�;��{��� +�(ؗ���n��C���W���c���+�K�� �|�*�Z`�)��)-L����V�rFzb���.-.�;�1$|Y��FrQ�V ZP��L�X��*HPBi^50ꀱ/�e�OwK���Qܝ��.`]�!�&@��*H��g���/ 3��6Ean�d��� -8��;%�w]5Nl��B_�1 � �qc��IW�`p�5��k"�ORqZx���k��f;�#.�r�U��IP�I�J� +�d�\�Խ�ْ�T��YC ���Ρa�X`L��(S �>p� A�Pz�`h@E`2,�x(?�"IK# +����[���8��� ��� �e0R$~z��q��d�8$�J�� R<� �E�9�O�_����;=�(���`_�e�$�ֈ ���w�E]�3�+_H,�|1��nj '�n2�2p|8���m������lμĶ�IC�a;��d�eA���`�@����:_-� x��R��F�`W�K�t[̓lDH)�:�94�D=�S��ˠ�X��e�ْB�A�⭎X�1\Ƃt�d�x�`X �����bt��G�#�@)���j �;���|�+�%!~������ܸ��~p�O�>\~nb�%3@5 W�U6�� ذf��)|� J�� Y�8�o��%��y������'#�!/+���!��HrY���.���� �N0���=J�L|�֏Q����I�ols؏���\D�B��߻lG�a�(F�_�����H)@����i�a +��k�����(فz��L�� �v�4z��j�?�L�,ɡ�)�?㶈u��r��E��S��l�2!�g�j�w�@6�r�2��.n�OX�ˣ�N�)���1�t�5���C$� O�i�2Dk�\�"!��o���&��%����\�U8e���=:-+����jf_�p4�_Jq�wɶIz��28�������Hݥ�t�� ��2��>m�E�hT��7�eu��S�OMwz�2��s��t�����E�(�v�7�;X@F݆���g�o���Plq=�R$N}=�u��ǵ� R�F�F�DA�"r���H�]d_�>`^I�? +#�x����n2'��<�͗��%�d��}p}��n>s��;��CAAm��8P���CoS��n���y�εa�pH"��'��������1DH&ex���j�ώ��p1L��l�7s6L� +�@��'���\�j�-6�rclW�}o.^d�X4�4���ฬ`�b�0��)#�i`��� ��6Qaw�|_��V�0���,Z�)�@.�U46=�Pk蝝�q�/�9Ѣ�(���"�dJV���J}�t�����+ex�2��'"t6�:���2Ǽ=��BԬ��G�؍��9�h�,�t���E +>gt����ϱ�ܓd��2��I�%h���X�uoZ���*�'���^��t�Re�Q�˗R�6�$�¼�"��%��J!�l>�{H�Q���Pffx8;��V���p���ոٌ����Ւ` +(�H ֐;&0��h������JTݥ L#F���I�,�D%J����g��+f �P> +e�e1p�î��!�|Q��T� �ÁT����]�> ��r�P�kKR���`lj�lt6d��DJ�����4#�O�� +�����(��-�c��2,7�,p�7�28���)���܄��%S�H%� +RL2G� +��\q�'��]1��P�)� ���k$����+�l�C�y��S7�$���&��nҊ���\]�%�w"���x�;s%���.&u<�:y �t�c�V�r�`� A���� ���a>�M�� +�P"�S��=��RALm!��'����1�ԡ�e�4�Z�N������:��Ӏ�� iC�1��)=P�*�@"��4�⬤�t7-N�KYd� h�A'�� U���E��;� +@�BUe�#��L�F�c�!�Ɨ5P ��ٖ��J��0�SlU�޳�i��V��NB*l>���l��AF`� D���%Aٯ0���b���R�V� \���(���T"o� ��#�&|m[R� +���}�R2��}?oFE�ASҝ�i�V����f 5,�����_��MWO�֩�Ԥ���R���� �9�2��tp���� �q���A�h��#|.�=����*�m w3YΔ�?�rP���px/ ��{Z�,(��92��g���i�.|a�#���t��Kz�-�ƌ��=�m +e�_v� �V@��MX<�cߘ�+IT�e%�<`�.���-��1�N$\(1s^�Qj�C�\����WM؜�. �2�Lޝ1�1�S��Z��C��ڭ+7��@���9�(��n�*��6�SW�-MX�Q|79c� +�F}� oU�2Z����U +C3ů�̲k+�c��˪S�ݐ��?���W����.�&����J�`�3�(C ��K.�H�B�c��MxUQ7�����p��gnTV�J��%�D^^O��B�ϙ�JU�{�濦���A�{'���,��@��Џ�Vѡ�� 2+kD<��A�{�G���<��2��O�$�}�P�`ʅ!F%�T*˩#�FD��~ꅆ�dP���,��J���jq���y̽J@Ԑ�4���Jʧ�z^V�mM0> +e��@9��W��f��G �ᩍ�_Of�qbeF��϶��4��� H�Z�������y�8�v��F{Y���L�f�=LR�faG] ���HUԳ�9� ��Īʆf>ʄQ"�)9�T�ےv,�[B�yP��( ��E�3+�'��^�BY��)����I�E� +7;��&i�����R=n��f��a`�TA��#�a�=�l�D��g����Cf�"^��(6(_ܩ���I�pJ�� +�a" �R=S�R�EU�6���,��~dX��F��l�<8��Q4=m�l=����VQ +��,[S�p&2�̈ q�r.�j����^*`�M~���}a�_�B�g����-���"8� ;� � �4���vR�e=���<+�b�AX������� +��p� ��,�y �2�2X���'1� +>v0��kR8N��x�.������,�N�����3� +/T�ڤrD���qD*�h��2�U�_����*a� Щj/EL��%X��$Q'�!�K�ճ�`{U(Q���= ����7x� +�{p`���9ʘ��ӆ*g��vH��'J��E�����+��p߲�1����6p ����hJ,�Rb/K�P��'}�� ��O� �(�J�Z� ���?6�Ɂ-w�Y2��]����ܤ��?�#������|Y��t�\C��i��-"n����qљ���g�MB�oh�B�W�� + +v����uO�$-֘�W2�I#V]�=�$9^V/v�8�aW��L"� �ϻ��H��������N�k35���S(|�)D��F�j�<��� g)� W�]�(fo *��5l�-�4��˪ɖ?/����i�l7K{�&D�n@"QZ�YE56���)�U�R�=��Hlbb��?�U/��s�� HTqzYh&H����̖z(!e|��2Xb�QuR�p� +�iG��)�������������� TU� �deT�*KgRˢd\����`IB�,PDKQC�rJXT�)�h�k��eB�K�b*�G���y��qJ�'��|~B���5 �sTR�0��`����r ��AD���p_����x����Ns*��G���C�}� +��11 �Փ�_+�C���ic��Z��ѡ X��{���q��J�v��%��ś/�bX9 �J"���x>��F(P�FEiCN�T�@���)��e3kK2��">py��F�$�d$��R��J���WR�-�V�˺`�\z x�P��c#�@����pO�A���bQ�.��ľm��H��S�/���+���B +�x5.Vخ��6���� .k�B�x,��E%�����E����{�4�f�f���cw���jUZ3���aBs/�H�V�փΘ;Qo�W�A�k�����zY4vr���uF ˼tW���yRzX���kHO���)��C5X��'�D�)2,4(��2��SL0���Ŷ̩��Q�ۯ��U��]�^)Ӕ����E RS��'�p�@� +�x��qT2)�E0��褻��'�p �z+J R ��H�욲'�2��+LF� +��恇^΂!�=$����c�G�$i!�k��A����!>��Ul֫s��~�a_�����+��x��Vj�!��4艇28G}�*B ��r�PDd��[�R��A-IF�~ ,>����>���M���d�{t +�.k��9"s̱X1��T��p5a@*���� +��(qF�V�p��NAeE�m��� Ċ�Gk&�& ,�*�G�,6��#�N4ؒVx��¡~�>th���{ʼn�pi8#�>�b!O۴�:��(\8�����^�]��47��k��n� 3ߚi��F��\�S���T�vj;���a ��;�;ݩ.��n��I�C����۪<7xY��JFC�2�B��P��Bc��HR�N�o�7��;�y�������oS��S ��H���h�̻�p_�^b���1Ƴ�4�>z]4��]�����͉ZX!� #8�J)8p(�bN�G���>��p���D5m�8�+QH45�w7V�߄_��٘�����S����EnR?���Z{��p��j��������U����dž�'3�(�v�l�#�uYr�)��'Qk�D$|� ;;�3YJ��4!BF��~�~3$(�q���9r���v�����u�S]����G��|Yy��G{���q��D|)9FWF�����%���?=��CX=>G/��T���;=U�,J�8ߓ�Rd%����|�Cb\4�#;DR�d�h�@�k�.۰f��m �>���dE �[���q�7̠]rm{�e�,���–��\�L��@W��,� >k�� d�ȳJp�5B�_��1ͧ,Jԉa����� ���ձ��˂��%�(�>4JRʻ�Q"ՏH��)��!:`�;��ɿ��եV���*�h�ҥ�F4�9�>�� l��� �+!`��,��418�^8�u ʼߴ��w �1�0]���*�5��S\�_o�CZ +�ҡ|�'�e=�A/�:�'pYؖ.j�0lѷ�۵+�΁t{yڡ���{e�HO(��)w���\����g:�� �#�*���G��B� +/j�� +����i�vH�X�|�Q7O�# ����e�򉔉��ߚo��?yA2>���s� 2|z4ΑB�� +�L�_V)�!�E�m �y�ߓ +��Dyz,�z�?��cH�K���7�� V����q!�� p�� �n��^���[�-O��H�� �g��l�if�r�����<�rF��U1 .ʒ��S0NbD��\�ECæ` ���wR�:FJE��f�}�\/�� +0[�9Ņ�Q ��r,����0P5#�?2��%���ҜOD'S �̪���gyEg�%���L�HY��z4C�O�F��B�f#� ���:��P���%l`f�!yj��C�!XDjZ4S�5n�]���������78>7A���)�*d�R��G��" �2��B�%��>��y�F+D;PyR�7eT:� e�i��Ѕ� ������8ˠ��-!�lf��cFΝ�$N�R�/�S�@-d-�������j�IA�G>��F�'�������Uy'gM c7G�C���e�Z����N�K ��/ ��p|)�F��%e��U~��{b4��YcWia~4�����4���:Y�YIf�^��FH�Q+�}W��� ���Q��yY��FՖ�[�΍G�7����#�į)5��L1Z�!���մ{��$l���&3F9�x$��T j�@��]��0����ޟ�D�\ϴ=JoI����!�~���,��/Q.3��LN�,:�������a5m�� �Jms��`����N %�5fEM C�H�du�,)P����Մ���������E�ly�n��v�P观��Ic�"��M(�I���4Be��]�^����/m��BZE + +�Hv�����\�=��F4Or�B�rY���d�P�nLW"%�3q���}�~�􌂄)���J�I�{Y(��^���"c�w� � ����~�ə�b����!NJ������O=��&�v':�#�̀0*�{ej'�����lD�K�T}����* �&��t�c8��'Wɋ�X���s���H4w4u��~A=O9H�����1�SEpĚ� U���,TM�m�������~�0ƣp�޳:y��'��*F���rK�2���J��=�� ��t�^�Q��e��Q��,�W�K�h�eIV\!u��|���x�4`�U�OC�_�ޔ�8�|l|m\%m�Unk^b��荔�^��xF +P�r����� *1�'@=P�i/kA�<�B��M�;�mW���s�k_� Иl�a����,��O��W�)�R�c"�.��EMT���ʈ1���<�3pT+��p������O�j +�Pj S�Ip3tZ��0 + +Q�� TwErSPrcĂɀp)XNL}��1&X$8�\�)��W8�C�O�����"$���. �W�� y��]1VR}YoV��ܰ�&d�1١Y�@�����jo|i4Z|S cj/d�]I��Lt�#�)�  L�Bc��L=.v �0 �Y렕=yd��"(�c�3�W1i`�Ia +z�H��n��j��RwF�E��Y GפS—�=��&J#���8Iê�3�'ܜ��xP��Zy�E}�ՐY���v���߄����n�1��Ч}�GI� ���w��M���/U�P�'D�N$�i� +��2% !u/��@\��J1�8��=bY|#�����) +E(��%Fd��u*�b��=?I�L��xm BW��D��o���Uc$�eMRgf]Dn���t�� H$b��Yt��To,��28G��@��.�(��J����UD����U��ӊ�C1V�uJg�@t�:�HzY;ݸQN�J��\ՙ�T8��)bǛ �+�P���7@�f� 3� ڜ?,\���I���?����g�;t�%<�8po�FQa����{̾1j%JH�4xV���������,x'��@�C!ܴw�80��Pr�e���Ot���1����}�8��� +!/Ɣ���l]���CBƫhPM�َ��`��08��[V�{�JJ���� +7�н����`py��!y���9J0"������A94R�8�`�K=qXb�V�][A���p����R�*X��K�{<�b�� +��" '9�1*�?��a��\��K�&{kJB�� �,���������a�֋L� �?�E "���28��r��pf�R`��AH��@ǎ�k��1!/ޛg[�������"G�1 ��5d"y3����e-�M���23�}�`]�S +*��D�,��䷀l���X�E��� + #���D�́�ة@��o,!��M����q��B���LU�@@0z�nD�h��d�ʽ�8��u�lݠ�C ��5>_�Ċ6 [�L�0 +W��(�euD�A��,j�-L����S6�:�;���� +b�&Es���a�c�z#���}b;{,��0^:(p� ��"��'/ ���t6ܝp�s ��O�� ��0+��C��l�����v^�Bm�eScD:.t������e�+��$����O�EY�h|hNRS�̵:�y����yw�|&&��_.턹ଦ�� �ԁ�b�5�N�r������^��ND�RQ�'F�Hk��Aq�Q+�H�L�c�p󇨤� Pa�!��{ž�i�)��~�����k|v} ������ 8�%_ �HC�]U��hq�} �����%E����ʆ†�6�&�Upr� ɤ���=�T�z_|�i��G��_�j�@Sۼ��MmeP’�咺)x"S=���q��Gy ��M�G)�6� �g�g��(��E �t=5_VWtd�CBl���� u� ��W-,�y��`�؝��� +3��%��IR�@�t.�#�EE�{�ш�8�@r��-�F����꺺��D 1�ZSс�&�""��m+��P��{h���o��5�7 �2�3�gDF���^�� ��SԵ����0�x�H�� va���������`OX �?i%Y����`P�ޥ�+f��[9QQ��+V�7�!��'u���,(�z@�Ikѝ�M�1׷iAJAEf��i�f�� &�<ٱb �t��Lc@݋�(<�,\EQÐ� +)��e� (��* z^�ͦ{:ۍ2��;��љ����̽�(V��^Ɇ����w#�p��6�`�s{`�eI�G�)F"І1�� �e�^@.��*hB�Q���ز�L�a`.l���-�Ig��F��;��+���A�Ea�d�Җ�YY +y�_���Ĭ&��x��j5�����0>�#�;��������ki�\��s�8�\�K�����(�R̒�K�.N3�,� g�L�A�E�n�&�a0������1��^�!�5 y���oE'@���eJ9�_p�+̓�i��g�WzbW2��{Y��0���/��]APG�n��&P��$X>� �Y t���+��D�YL��e1/@��*��5�9]5��;݃F�����N_���1'� +�ƄP��\��� � �^� ��H˪ �'5�4������(ӥ&�w7W�K�Z��o��=�lhҹ+�}�\:�84��L94�*���Ǵ�u� �R�_� �c�� �]�x��5OD�P\P)��ҽIi�2�ȭ�.)�\�h�2m�w�x1��q���d˥����;�k TV�<ڕ{���6���(���Qߜ ~lN���@��r����� ��| \�t���� ��'ߐm���eai���[(B'_���[ ��N�M�S�P�O��������������DS�мz�e�I%��C�z�B��[� ��_�V$�[�r�!����>^4 +7��>�/E�[`N������-�\��e��_t�C���Tk^*�X>3t � ��)b�u,番!C,:'9 �L��s�eufBj% .e��C]��bu�&#״��xA����M��*nM_�I XL<�(���6 ���$�eG#� +b���*Fa��AT����Q(�&�M=�M�8�)� ����"y2A�_���@��[�G:��y�o  +ɑX�2v.$�iu��Z �U4m~Y��" �d9��/���:���� �ş�Z(}�Q����Ǟ�A|��%Dø +���.U �٢J/[9�h��&\g���,�"Ґ���i�J��Ε3G�R̀�F|@�P35$���l3�eV�; o �M9���F��y�Pb�6f@t���p�e �6m=Jb�h�}�����g>����hDHՎ2��W�EU+�Q��ReI[9��1�����.b�eQ,�l����epxQ�$�ۥ4,�þ���8BW�Hݭ�� ��M-�ҭ�P��V����Q�7�'��4l`��ʽ,�4KX9��DZ�2nۋl��9�].�k���V +e0�X�k,�d�4�^^eŭv�+#s�&���8�q���~�P������=Ż8e�V�!ؑ�Vi�W:w�$`�m��z��#�� +�C�����c��z�D, !u �E��̟~�C�J�%��_����*�B(�6�����v��p!��i��q��6*HKyL������k�b(�~� �H������!v��OA���5���=��•+��C�B�+�ϲZU���sL���@�v�Q�%ި��f�� ��;�:������+)Ey�X%. �˪}wn3�C�'�Z�+�Q�@DZ8��C�5��Qx���#C|��ɒ�/����!z +ϚɬK6���>m}2���.���� �T�c����<>B�ƫ�&U�l�?X�-"lI^L��rу�q�F�*P����( \�S(�cO���z͈͑P�����m���8�ƈ}� �c��Pi�A� ���&e@�U���V��@���l���G�mBM�S��i�{C�����Ӣ���'M�_�+,����,��v��� ��*�� !:m����dO?������@y@Whf|l�ΉOjF4��܅���� +\���@b�0���m�˺]p���fK'���c֋-�M��@�Dn��,�SD��4��W1V; B��0Ȥ^���G�A�����s��:f�����I��L�+u�9�� �C�R���&�����2)/m���ݡ�R�� a;J'B�mx/،�d�v03 ��ѳ��s�Oa�e% �bX�O G��D��$ M\ގ$��^�P^�� +�a�;�T��S$A } 5���w�b\�� +�M� t� "�5��<(_։ q�ŋ�� +p�G������}$� {�3�P���/(��GX����� ԕh�5]����`O��:(��;p�M`��L�e �̧Ucݴ��Ƽ���lk~���!��g�a7{��t�S�i��Gdg�&e�,���� +e=�Q,���aG����{Y/�Ҩ:��)!"�t��Ӥ�z@� 1B +.��l�ՏUG��Ӱ� } 0i=j�m�zr�f�U��F@�����\Rz�}$N���ٓh�0��-�u +I#��2�S��W4�Gd�7�}�����,q���@`�з��?> �����1�l�4�2���ei!��"fG�Є�~� +R� �dS, +�^ټ�`Pi��E��Y�l�<F,���Y�8�=p`� �������鍤@Ҫ�'F]<�,դ"��`�+<��B"C���~Aż�E8g�d�oV$D�#��KX��g�~�Q����ꋚf �;rvH�U�M������̺��jK��Ǿ�� dh��]Wb�<������h2[�O��Knʃ��S��dp� �|�F&༗�BN����\CAu^Nt���B��n��T���� 6y�TQ�&L?Kj���k� E-2���2-�ҫ�,�%Y�ʆ��Τ��(�B@B �V�(J#���[��Q�08�� 6 �>�.�tW�3|&*p ���I�̪ +2.�`����P�:�>���C�ǛM�b&�Pd�^�0qj�ӯ�P �� �v�?9�JC�� [wa�� +��j���yY$6q�Cҋܿ�6s�6���C��j�� +��`dX��)?�RiT�����F4Y"�[�-�(���,C +�6�z�8-S��+Q�dk��S���X��L�-MDhl�5�_����?����z�B������h>�m�'��$�yY��^��\�jA�i��ۣņ� ��ũ#�!_J���h�=�к�fXc~8��L���~�x�0G���Z��e]"��� {��ћ��w��a���J�J�� t��;����ܣ�ӯ��Ƞ���]x�͎����S��vN��^�/밁�;�?�ԣ�8��J +���`b�C��P�-����–���A�����ĥ4ѭ�[�Ǭ�Up<,����(�,��7)"k���]!����*�i�'J�y�␤kLZ�%+z�1�%��%����̆I;���ƥ*I,~�!��:/��f��^}�� �J4�.AY�Qj)��p�Rq��F�*D�̝ +f��ӡ���й{yv��³fF�C����e}6�ۥBf��ɨ�g�'Tᠤbd�0��%?�B�K�A�@�~^�.���� a��ą�`�G;c���/k�(�Zе ˆ�gʵ�=�}�f��?��uv)ҙ�@3�rU�h�!2wdT�"9W_:��v$&�(���L -�'����6��H�N�\ joИ�ފ�(Fk,��`�bh�l�wfA����:�&�/pG.��%p���%��<0h宒0���T#R'���'����� �� 8mf$�vD����EњG(�r�"%;"VT2��7�PK�*�/K�@|m��j�#Z`T�:l)��0�ǧӋ��C����t�L6F%٩g�G�ep��:U��:�dѐ�� �!V<�@�#I2B/ 2JA$��������#��Ҹp�$S�V�����6Y5^8���Lu@U�"������]1T'.yx�� j�D5 ~wB�( �$#���{c +(& TEfV�4Ag\�3�"�^��ժ��xB�|B ��!�S[,��s����̅�e ���!)���9�� ş�)�(�������CP��!ֻA9�ؿf� ��c�@O�/dfH�P\��!����SW^LD|Y)�T�Ӌ#�y����tIGx����0�]���6V��,�J�2�a��&W#����/(C +��"�h���!��`OL�,-��;���_)��]��=w����1c0"Q��+�^$�:��o�>�/ ��s3k'�����K�_�J"?C�899 䈭 ,6F�ͮ5B�)u-- +_>J�7�����ZA����T ��s8����I�R����$%|��=l�_9Nz$V�7���i�8T�2U�:W��T=�|zw�QY#a' +��Z�>3F0�" A+Cj��RȪ����G�c�ʮI�io�oJ; ��ʱ�6g���)�̼q��V� Lrzb(�`��F�LsV�:��.�#5��%-�����i� ʿ��\ڼ%�� �M�F����ҞS�%��v:�^�K�+��V��E�l<��q���3J�%�0~���� �٦���ALJ^ �YVL݈���dY�x�5�J.��U{���^L\P�x`��\a��T�=F���`���|ڗr묏�l�ߜ;U0�V:��e����ahS��6�IJ����r��."�҄;�Hn�K�PE� g�sMljėP��9�X^8��"� �x���^���*e&`����eIny�r��u�P;e�9~6���j���8R�N[ȃ�Y�qk�Sc%�����#�]=<�]B;�����s�OB����v����Ҽ�� H���.���*��cpjPd�ȗ��RJ��ic�r�:x��m� ����&� ���B�|��o��B �/�J�\aX_��v��r�gz9�M �pD T�Nc8�F����U{S�9�d�1(�6V����2��;��rD�M��Q�@� ܌���]����e-��!�9�8� l'�Qg(@�X�{�/���8T�4�T��ε��Nu�0���P6"�ı+��4�� ΈSX-G޳ ��"pjo-��]�q��)�� +��pI���I +�7��Ay�V����V�-(YO��[ 2��R�V��*O�l�0�4�W��B�,� V����K�5tA5�-d9����㱷bs��9A�Q�L[����&#��s����~���춋I�� � Q6c{Y�m����W�%ِƇN�Z*وDf�J�/��'�h-q��1��H��RՆ�( +��@.���0����e� +�hM�>�bt��򰎌�Glk4� g+@�:ӫ��lT(XG�2U5�����<+)gD����U��ӣcI�� �5����E[��9��A�r��Q�&��2���H��P�J�)��E汞r��R�����|�H���Rycf'�O^' +4�����q� ��hZRьh��]��aZG���|yS85d�e�Dy(quF����S������o��EW��d P�8�m@�0k+Pu������얍��@�tH{��v��L&�WC8�` ^����0:ȳ��.\��J���l�<�:0���z��z��^l�Nljd�e�lo'L�C9"y@��2H���B�����`������_�O�{��b�V�����^�(�C���9_�Q�Z"�&���y���`�E�.���vË)R3!�Tv����e�$���y��ܑEK��{�{ځw�XƓ�ncq��kl ֣)�[��- ��H��IT�� +}TRH�F�{�u��(s�y�[�����ƐG�;[�)�d����Z�n@(�����`�Omyi�ӎ�IkJ���b���/˲��[޹1�:t+)1��}P�iIJ�&*��9�:} +ȥīB� c>�q�R�C�O����Ѡ+,� ����g�qY��꿐Un��'�@������x�P�{p�s.��/�ȹ�ճ +�%��_�t���껾A#wc mI)䵏��=Z� ��V �fZ��d&��I�DѲ"h֤Pl���^Ү1��hI'� +�ٸ7ޫ��'�fl\�4��`O�pp9�����&b4~*u�/K��� +]d�0�ث8^d�SVX�q-�y0��9�A'���9��mV����qL�1�� r�Q�W�p�`@iѹ=tC�/I�^�*��*�_�038�blfN �\��}���rg�g��#��/�]�f�X��^c����2S �f]��.�}�d���k���6 � ��fd?: ��j�R*Y��{���{� Y�p�� B�:n�I^z�e7[Z.�o���-���U]Wҥp �6d 5X]�qq��i~t=:/�P��M��P�G����P���9�PE�4�!ࣁ ���@�r�gX2yp,'��L� +���F;��F�j�t!5.k�9��ވ�VW�a~k�Ϙo ���ߥc�#���Bz�ɢ����1�z��(B�q�V+0N�̍6��uo�Q15i}�{������ .W���ʢS� +?��6,)�����Tмt���L�Ms�-6�*0 +��q�n���\�� ��:V`l��$�|Y����M���(��!1�F�IU�� �s�h�3#�l��E �,�"0_�ˆ 9�XR�����y$�@����\��K�5���x/��!|=�7���ZK��U��|� ���N +l�`�����i� z� �w�?s}[[k��w-�:W��$�QɭX �ΤgBr���eM��Q����G� 9`y�#�QϙJÊ�y�,1�]���G=ȳJ����C��ܩ�� �抁b` ��������cW�e��#rڗ��$R�[�A����YE�M��_��������Ŏ#��'Z0����0�J�HثF���_���/�w��A�8R��]�� ���T�eq:nT��'�����R�^��3=�l��!��٘Z��C�A����H�r�}���L��c��� +�]"W�c���_��b�L`�P��X�SVTk֠����B�1 +Q �&1�72�;���[���V�2�i�w�r�}6�^1T3��0!�� |Y�e���;��+�x ,����7��%��Jo.�,�/C�C���^Z"5��t` +C0��\�0�=�Ř�"�_�(#��?')4�^�o�D� +�\���mpA��n��xVg���!�X��`��19q6q@޼�U�9S��p�W�s�} 3C!�/��Z��1 +!�eE�:�``R|�U˘?myj�,7� ���K�Do� ܈��}+���>s5��&>���‡�k��+/WȌe�Y���8_�`QQ_Z�Ϻ�hC'�n!xڀ.�bP Z��U|�S�"��VU�fTf��:K6�@z����u>����}� �� �n�S<B���M`��ډ�3��6B���|'��N�����j~ЅO�X�I67x�>+�e���B�̮�'� ���w�6 P��@�hDy�e�9��Ȗ��q��}BG^���!RV\�RW���ۃH�vD~��ZfX������Jx���_��~*��Z��Q�Xi��$y/K+]�|SE�h�נ��Sx�vY��C6mh�8b�펖��v��O|`\"X�J_�܋�W$��8̰Q̶����&���^��!C���j�y��t���"��r��@{�<����qA�wJ� d���:�z�T���XŁ y�ep��Y�5v��ae����m �"� +�0��iw0dDL��0'|.�縶^M1�c��\"�{�J(p7.N�*]�� �P� ٭y�~�#�X �-+�d�" ��uu����e��b?�j�l���]�*1Y��9�QPBCLG�uEb48����Ci���[�F��Cb�hG�L�R;!Ŧ> ��o�e6 +� �g�Z������_H����)HL�l�:l��y���"�:r��$ �*�Td�l�,T��CS G4��ʍ͈z)�v�GT�ey=w/��fS���GF��c`wi�u��T��v5�E�!��}TҒ �~��3��@�i���G����L'/��~Pj����i�7���4�Õ/��w�����UԎ�D�,��Kh�f�asV��A�9g1&��$ܞl� pr� ��ˣ��snC�Gs�����#o���i�ih�Moms��K)e�kOB�7�����<��wAsɄ�P����sŇdž5P̼&�I�&̆�:�R�B���t������c�C�_���rMsg|\����`P��A���buG�B�Zv�^+��ے$��:�Hyr`bi�!-,x��}�@k)xC+=�*��եh��U�C��q�I�[?ž�Ե�a\� Nv�F���u "��$�c�U�715Ұd+�9���~)J�� �5^�����Y���˜6 ���&}� ��t +mV�!�8wb�R�P����N(7.�zM5�[A 8ϐ��Tm�"H�۽�m;͐��dD����>����Ʈ�� ���8 �=5n�}I�Ozr:Z��3e�TR�̞����bӕ�kˊJ����kF�p���1"��*b�t���y�b����$] 3h�3�M�n,b�PP)xb V���4��/v4i�U����Hn�B��M��f�PT���JK�L�p�l1���E!�j^����^�8㞇!z�[7H+�4��h�P�Q��$/����*\ v���:�AEڶ�A�(A�����vȐ����ȶ�#x�/�Ai��c�^�h6�OA�1?�ԮV��-}�����{t�+��̹�k���{Bwo�� ��KÆp$#�q�Цm��#�Ϝ�^?��p�m�㚠y�� +bk�5Nv̔�5-`�%咷��v�_1c��W�7�u�%��i�R;�N�};�<�#Fk)Q<�!��eu)�β�%�ŠcE���2p˲�/Ü�n�-��Ӻ誂~�ga4�LG7��I�� %b�T#p�Y)g�&�3�ѧ����/k�,��]{J�Rޒ���F�lHC�R�����S퀘,��Zg����g�U��G, +WM%�‚���W��_����n�78�u�MC��"y'�|�#TO�B�*7*Ƌ��5^Ö����%:�l�@{��'K �غ?�MI:�����$_��ȁ6OwN>U(�xY��ʱ�<,�'��qݙ�I#��L�| �a��{�fj6� �J�(I��U�~�EY�(Č �܃H�:����7/��|Y�]s&/g����/�t`;4n�m� ���m��׭��0o��� �NJ * +�/�QE�7�t�o|04�0qU����ܗ|r3������]���2�f5E8š +���[Ŵ�iU$%� @Sέ?\�‘t��ʹ�Ͳ��,�vh��n=�ܙ𽯙հ3���O���W �『 �t�HV�t)�ƽ��6M��i�V̰0�*;O#��vdP�Q��N7�:�����$d���W������+_֨_$�����A͎ �l����&�\��H���πk��`�mņ^V�f�zc Q��n۽�]��5�?OP�u�.�2|X�euD����5��o@G�D K���C������?f� +K�l�0�M#��$\%#��,3%ջ<`����'l^� ��sgdx�2�� ȗ:��pҤ2��Y�٨�OͧR��AQx��N� +�.�V#c ]�R��e�D����Z#�F;c�n{w�8Ѣ�יx!���/ܐ^�oI<��X�x�!&�gU����ĥU�o�Cq Ni53<�wV�Jq���$��* ���/7S�>�w �F�܀+jG�N�p@�����Y3�%��G��^>���cЌdl)am����p��:��Tr�Fr_��j���w�Y��W`+&�G��5;�,�A�oE���4��d�R�cE��+�����ӕ쑐T�k��Cd�ϐ��|nS����Y�|łj�8����wFD���y�<�T}դ��?� մo{�xO@t?N��l�������'9m�ס”� ���kAk\�"'�Ԡ�/��� K���羬5rr�^�}m6�H�t!y��8��~� ��yy�e�R> M]�A ��p:���; v��c�D�����aQY�r�s�̘��������y}�ى����G�C=Ě� �v��Єt� {P�:,�B���H��7�UU��a�P�/Y�A =�;��~b�9�< ��w��}��i%�Xy6 +"q?Ik�R>�o���P7����M��r`�i� p(?Pfq�x���y�{�Nl��V�Si��eI^҄�4Tg�P�rY�LlZ��:D����!�ꢽ�s���Get��n��(����D��û� +�R# z�t���7�N��x ��{h� +�]��}����b�����F�\��=X�(������E-���H_K�㵸��vz0 ��:7M��L)T�vq0�瀡@iY�w�S����=���~R�% tt<%�^h�i�T\�ga3����A�bf~0����pX�k���#�ֶ&2s��p�L魯�Z�*�lU�L���x|.80�����.�#(�eVl�p'L� )���d�1���Q��Ń��n/,(8~!v��8'���� +�a���^�{����4tDZ}97� R���!��F_�s�0���/l���wP��p$E������x�E���f I��V�\!3���K�.0D����1d&p����c�W���1b�ѐ��`v�p\��#w`6 J�n�aM�U��!Ȏ��l`x��� >� �e�h +�ۧr����Mь�f� &�o���˪����v�v�y[䏁��#~�h����׷J�UBq�C�|��y��@o|��-� ���#i?u7�8.�W�A������: ��fW��2U����vi���0 ��_h����Ԇ*H�?�YŇL��|0y�ΖG���z�CgS�7�>���hJ�vY�V��Ʌ����o�d���-)�j���c�eU��h}�5�ɡG�S0f$\��=D4=lm!W�[��\�8��@I7�f��0}�C��p3��!�F���:w��2:~\���{=dKm���〢D��?����V��.�dB�����]P�^��k����˲��1w�5\�"i�E'UM�Tt ������8�5ė�XL��Ǣd�k���e��3p,�J��r�3���������`b��e���2ƫqk&����[x*��UT��a~�P%�č�./|�"}$&%� �_��){I����$�Iv�jBYwd[���&x _���p\�/q�U1b�&C���_�Á�b���PK_IEf�# �sߖ�|����m�X�\h�ϋu��#n��``�R���S.輗��w�C�,����M�뭊��@/�Ǘ�W�G�̭��H�` �1�5��.=�(3.`6�J��Ȳ�0��Bڀ��ޗ+�5�� 9�>m\Y�� g�v���A����F�k.r�ݹF�� ۽���`�"��2�p��s� +�%�'��-G�2�\�/+��V[��{2�����Z����+��/�θ��5i�� 0���f5��l,ݬ���5sc.2��}A��"�^/K��M�Je5�������T��C���V�t�MvOk�6{���������D�K�<-��L�ɺ��?�(ɫ~gRm�yk�rQ)5� +o���f�BJ� +��M�ݚ��(�5\T����rY+�ȷ��lq� vy��e�ZA%,��1��س���хޒi�q��9R��k����]fҵB�5�fD�ٺ�kL)���8X��H��ʟ&Sw��T�Ԃ��"z�ܳ)�����+ î��z�m~�&�Z%�w"� +>@Y-�&����c����{���VL/k��� ��w���cЍ?��5ڬ�V8n�IO�I��� �n��3�z��rI�V�;K肰��t�;�C|[�N�E�a��J�%K��VmV ����D��AA*⒊.���_����uM���i�94rx�b��h���Q�<*�U ��6���}3�\�mǎ��q�R��?` ��Jyd4? 2Q�J`�,+P{J���Cq��jJ&�� �Y|pCux��m���H��ztQ�Q���&0��k*,�`*�OY���Ca�����9�+�K��9:m=ĉ)��\F�����2�3n&�aͅ�5)��\�b�Z���菸�\q��.����T.p�B�0�cv��`��QI"Ϩk�<��l�E��ĀʱzC��Ґ˭a1�$����S��nB ����4�T��v�V *� �U�5���e�Q�`�/+r�1�iu�j���$����hy�+pr@"#�^���E���Њ�N�t&s��&�� +��2瘓�� �rW8i�NqB�1`)��,&��z u��ot�Lo/!F���d0y?}���6qh9�ʦ��u9q\�ص"��d�ňHq�2�֪ Qy�xm�� ��II�����y�&�!SP|YmV�P�Pg endstream endobj 26 0 obj <>stream +�thO@�.H�(`秊s��S����G�3�h� H���tȄa��D&d^�I2�]���� i�"�����e���sw |��@$ݿ�F1\Σ������i�L2�)W�>����UV�#/�G�Ӵ۸i�`!��Q�F���F�/K�,R�8q�N��\#�ǬA��5��[PH�>g)�G\K���oj��`&>�!�%�.�'4�r����`eq�?���/K����7`�U4�L �B�Aj��X���"�PхN��+�>�+ PH B)" +��j��^��'ВK����t�g�0��6�B.�} x�LYY�azIXޞ�0����%q;��!]P�����5�V�F�żfk��z��Ng��7[�2��3����$� � �qY��N�񉰴�,Q���;j��uMF��փ�{Mx���P{�ͬ����n:u�l!��ƒ)�������%�X�B� _%Q/+�x�_ >޸��lw��`� ��d��k0�UZ�� �V�����!���D*�̙�r�+�� ���K/ J" ����q�,6}Y(��",KN�o� �P���^M�|q��3|<�I\��8q��2�*5_���ԣb��R��n��ϠT�����v�!~;͗��a�z�7*�ڦ���G�-��Q�}�xN�N��1�6���f�?���ć�=�f7 t�ܩ�8� �AP�hH6��˺"! ��f��s��g �r�V5,�����0�7��ߎ�Y�P����<>B3�+��1�F�J�F�u᠊������ZGDn �!�6� s�,y/�����1��U�1�҃��'�y#��~�t�o5�z�,����,���i���2�g^�� �t��,'O�n����␚�����b��f�*w��m?i��̺�K��v>�O¤P��� mg��a[�����_�&�ث��a.�7�zY<���5�Hw�{r*&6���F aK(�� aFYE�\�:I��p���k!�d?r��D�Ñ|���>[Lf��A�& +�S��e�Ⱦ/]��ƞ���80��R�7���K���D"j��|�� ��{�1��JϘ�o�7f�s��;]���-� _�L%�/�ݛ:�I����2_I/g ��rdl ���l(iDEBM�F4�Hf?p�m}Q�L�Ͼsό�b�!�0�ĶŕN��(����Eՠւ/�gE��E�з�ȴD� nw �x��;�u�}��*���%��ä�<�:d/��Xd�T3��+��FȨ��Z��r���'I\�넙�ux@�l�wnN� 6}V�1U޽����X�)Bh�iʧa)���bP%L�e=��W�����}hX|P�L�L5�@��(>�2]�9�#(˗Eܕ���� V����-i\�o�f�ʢ���r���r3�L���w��b�Q����p�.�&���0k>��O T��ͼ�+FG������� [R��rY�������yߋ�Y�����}St@rr�S�{?H��C��}I,@xA䊜1�|G �{��Ǧ�*| + +��p�q�X���e]��~.��b�®׎�?�zs�3`II肮6�7ȶy�A��3-J�~��88ȳ��,J0�� ���j���[:T4��$�I���i�gL�J�R#���[���x)����A'����?��z4w�O��� ���æ����!���y����`��w�Um��v���;yY(f�����!j_� �J�+�D�9�,A����^ń�" ��q�|�̠�����m�Zl���Y�Gg?���ofF�K�m���_�C*���V�٫�(X$P1tmҀ��|e()= ��!U�8+�B+[:�����K���|��H�>��(��ӉY �plL����@���f�@k ,�ҷ���;�l�� �jMX� +aů����M�N�]gq#�N��W)' juG��EO68�mx*��L ���SY��ΰM QL��G1y�}�q���vI�j~��hG���r�����8���h�է~�͖�\T��u<@�[��)�8��{�3��* �a.LQ�>H�]5�����O�+ߪF��&k �� �H�4n�̙Km��L��� �{�k$u�P�x2N^���5I Mw�e�2类��u��bq����qgdS��3;�B�UL�;��<E�T�I�H$�G��8>{�c��?`���l$�P ���RyV��;v��tH����:�a��S���%�,�����q}�P�al��iy0�E �_t���Z��<4D��Q_ZD�朼���l��T��Cs��x�R.�D(�� ��^ΏR� + +� �b6HKha' ���� ʮ�M{�� l�*p6sum_�)R����(@�T�1���<,�L{F�^%j0��i}ld���"y�� +�`�elp��{�C6�k�r~�: A|� +��j$/+�s�CjOx��-;�8���T/��IdX��`GĽ�R�(Dң��G� ��T���ԝC��;�ВyvU�w� � �5~~��"c��9����|,-ZX�����s:J,˂'��H +檤l(�l� e0�V�/0dh����H�*�� qXd(���h�{�)�`}��eu*�`_Ua�S�Ga�w��d� ��]�YMg�R6��������蟐��� ML�6� ����R߻.9��/��/?�vY5�j�?#3���8�k���%���B�y�j�Q����JH>�3����| �o4M6�ܱи�}k�y�����;����P��}>�����Iɱ�S'�( +���%ih��k��d �E,F�`�咪0��?q�wA�L��L��<.Au�\�]��M?_�a*�A�8:O�dn�X��ik8<�f� ��A��2;��!v���qT���`VXl��l�ǀm&8 x��b4��E��6_O��"-/r�>i��*nŁx��ltǚ���Y���KH��^�cC�9��W� q��r���Z�.�B�֎.��{����o!�\�PNB�#~��Q�6�]$��/��`��� ��E�W�Л�PI��x��t=N_�5��{+w�D2��H!�[�&��$�@C��ʱۗ�E����;jS��@�p:Jl:� T��5����k����D>hZG_��;P���H����<��jH9�8ά�� ��ӫ�� �D��s��[�=�"��/�K�֒u�)aMk�$��3�ܗ5R��@H���B4��� 10��*�'�ၹUz�\%�!��Z@���k�4��d�Q���f�I��!��3�I)�gB#߻�����J��M�QD���13�Iu����w�FťP��K8�c ?�Je;M�;�N2�64%�`�F�o$�eE$�j�8�+"��e ��fO���;D��;/$Yݍ*As&(佬Q�!� WWk�5��>= ���%�����s/�c�R�^N!=�S�Ӝ����J7�nL�U�J��C:C�M�k�ia�r��t�S�,��h���02�D�]���F9�̍`D����j���+k��/��=9U�I#n�1��\�M����XrZ�s ��$�ƈCK.G�BY���3�g̳�N�1�GP�pB^_�� ��7�c� �,< +���`���m+]�dmkNh�OH��b`ܭ &V��X��~���c�w����,į��܉�#�b�ױ%��=J��x����A@QG�� �B���s��3� +B��x��[�!m�'_VJN?v��5�}��\#< �%��B>��x1�Ǻ�]��xY��A��p��p�,���Z�, w� ��,�"�9 il���n.KpfW��A��� �߬���M�z�H��#�������mm��q��yk%�� +ܙT:p�e�.��8���oT9�"����WОtӵ��hU��#A�|���uE"ź��xA����+I����O��|Q�CI%L/#�"�-�7>���� F�92�X3��}_��-�r�"�}g!�D� �����7]��`BFoXIK:p�5Y���{Y�<�& +�� �= ��ߗJ�T�y1�D�#��LJ�ƺ̓E���h�����e��g7v���D}j>Rު��b�PdC�C����FK�n�p��D���qI� ���p�@M9�_��10�?�6��)'+�@� J�P���7|��^���T- A��e�: f��F�5�=���Q�1��5���Dci#)X�3����j1��6�o Pʑ���\j�p�C$@k]f�' j����l�#�,Ni����z@ Qira�$��o�QpO·�Lh�E%.G��Q�2�4�>�P.�CT�3���|=��,�[�I���G{��� :8s��J���b������Ҳ�6����A�2��Ru�*f����JZtS��˙�d=9�,���{.(q���C�6B�t���R�����+�tyrY-���֤�[BW��[� �ȸ�%�ٕ��*$pE��(LDP��cm �Ο漩���b�9����7�S)��E<���H�&ڽ,S�!ة�tj}ʪ�v��π�_w�����{( �ӭA;c"5vx�S�0 �J뜳:�8&��XW���fe�vhBSKB��s��e�Z���!M�#�'��0$5.�<���ߍ<*W`T�T��>~�9V� �h\s�4I°;摴�S��=�Y*� %���—�A��S+$/�%��y��u��x�qU�\~��p �c�$^�������f�nM�w~W���'}����h%����}��#��������� �O�$]B�Q�������Z� /Cb�ݣ�.|�D��E&��{�C���iZ�ώ�-j<����1Z̈u���R_~��‰�>���Q~� Du�����;H������R�.B�a7�6<��G���Ӝ/���>�2�-�jMH� I����0���|i�<4)G/7H`6�F-)���aK�����1�@�$S�}ׯ@�_�.`��By�$� ����L:�q��5f$�6hx+��F� +,�Lf�k���+�d�S|%�C�E�zjA}�����F��l"�v� 3wb��1ϸv��O.)O��Qd��,=e���C!�*/ 5���M�f{7Q\�� ����P�3 ���>���H�{�&�O^�7�bNI9o���R�TW��s��U&=��%���2o.2_�5� t�ˢ��F�R�����1�i���w�F�A��H�R��\P����eoJ�n�J���m�L���_�:`sH»p [�H�C.k�3��h )?`�8íڅ�2��K���r<: +�Ĕ ���h؞?d��B7���tMG�̫1�{����/ +�f������OV�D�_�$ghs��y�)�Ɠ�)W��I�ڥk�S6{��b���ՀR�B����'?D�mL���`�U�P,��R��e�3�U�!ߗ�V$����N �w�,�-t"��@�+�d�Oˁ��X��G�P��:e�5�Pg0 ���%z�nF݁���8d�Wy[���[��J�B� ��a6�Y�L4b^�����1��8�r��j��O&a_��]�F�I��^�����U��1���Q�{�.CF�^f�Tt�O�3�~�+�*&�>t�ޓZt�‰%U��FB�h��CSG�2����dQt\|����YYm��M�`��%E$���/KWe���ݭH 8R� ��7��*T�r�&��=c�B�fG[�����}_§�X�C�'�x��!.�� L��C��P��D�eM�ꖈ?p������>_tܕȈQ�Jt �k�8�/ ǡ��x�h5�� '�:b�9�}�$">�H�o7=m����_V�TP!h�e��73/ t�i<[@ �e��^򋙠Q,��e��9��gE��#"ٌ�r*FNi0��/�Or���}Y-�q�h ���F�cqjp����/P��n�;��!r��țF A"�-����x+�\��x�������9��¸'sf0!���LJ��*tf��,�\x%��i��E���:�P�CF +�����.�_��t(����{�x5�w���T��=8��}-�|�G}�lJ���I����6�ʃ8QR@�7P!���������~���˺�|�}��m���sytw�MI( +x��y_@{ݎ��#YчhI��ɻm��Y +8��4�K�OYp����/���,t �W��ty߼ z1n {䗅�!:�V}<���=ޫ'��B���d�E$����7����l�˂�' �`��$� \_J� ��ι��(H]O14��&v\"������v��,��3��1��9e�@��~��7DP�Y���!)�����dз��0rQ�1����x V��H�/ᜦҽ��;�<��&i� b�h*a�"u�0��~��/������2���rE�?tF�\nO��QJCNΏ\� ����Ƅd���*��i UDZXy���Y�J��Ha ��wE�e��/A�0��F���Hn�L6� +IYD`���ظ�8���0.������y��@1H��lD� ��R���0r~}Y*�T�Q�v���3�meR�E0Y�.#I�X\S'sC�u�0�����\�a��N%�����_�����|�]�>���ċ`� )���WR!�d��O���P~��5�F�nV$�1��ϖ�3х�DJ'�-Bi�u�[�������� V�����‡��U��DPzi��*� ��?������p4y6L�D����B}\J#C�^�Q��_��r�H)�$%�-'�,%RP��@���I���n3枀0�*��A��M��.G�N�Q)�����5� >�҆� �\�P(D���R2! @����)a�-pS_.�b~d �"8�2}д9<\I� ]��t��j�F�]�e]�e]�e]�e]�e]�e]���g�T���dA��{d�%!4��(#��WJ��|w}�����A�ʹ?{�a���p"d �R*�Q����&�~C~�������b� � I&c +y���<)�r2�r`Mi�|>E{IW����DFg�T��I� d6�`8 ���uM' �~� ���� ����+bU�AnS��uQ �w���'-)�7�/��N6?��'\�����\�)��.k���WtZE�f�Ml܄+ބ�ü��Z�92�Ą�e����/K�m�3\���@�TB��?�+J����a����^�yk��Ƹ)"1�8y��L��g�/�f.�0�h�던���C�W5 +�A����R���A�_V���,=��ğd�;�V�]k�D�R�D}^s�@��mH��;4p���H(���\�;�O{�Q'ĺ_!�p����k��$�i��1D��K�׶E�o����)�5KMꩫ �!^�_0�ұ��T�d���`�W�pZ,���ߜ(4ͷ����2ߖ4�[_�����k���!���,J �e~)�E#9o�62���E�~E���˺�.�z����!p���s[v �X�In[�������B���l-�>�SJ��t�,�IQ�L��._V~���q=� �e�TpM� ����.r�[z��*��|� �_l"�6\H'��8�L���+��^����� �I�!MG�̾�D|�㒜ӡ���1N;�j�eɎ��'�qI?��N�" LR*��L!�����t�1C$/WST�pg0~�{N���Y��xh�$t��;q�P���ĭ$�(FT *d@��oA�I�a>���/��{���֞%���KNpN���hb�LC:�U�` �eyt��>A� ���NB�!} �����$� +����%� ��7� e �U1А������tH���q�6�e���k�������c�H��C��Z?)]u��˲|�Vo� 5p^?}وtf�Wi�U���@�4���͐33�i�xS����c�.W� V%Q鲼���Ȅ�CC$G�Y����JJ�\pZR �ny�R�0�w2�f!��a�=���V���DB��.�l�Bsq�e�B}��X��R��VZ�V���R�埌�q_*���k ����/`6����A��LtT%Ri$�r�eT����˺��:<�����w����{���`����{ڄ8�p����@�b )��v��{�#�{�Q�L�e-� မ|�@��@2i8����$qݬ_�(iPΪo�8�F� � �R�� +�+T�T Q����j�u1���`W ���Q�tY���3 +ȍn4� �h#3�P_J� � �>iǣ�8<[��p�� �V� ��=j�se�pc6lt\PE�b9t��O�$A9�~��e��!�o�Iᶐh��U8μy�}�=���N�|;���u;� ���x��G�Q"a,"�xO�G���^l!��.�"�LGp=��# �T����!0��(�H& ��Y;AB�$���k�! �Y� ��!��$p!�� �)���l�u1���-]V��i��@"N͸C;�v�V�G�a2J��֔-_� +<X� ��D����.E�rQ�&�.�¤� ~���q��H?��v����R��/�poTi�:�p�+�F�#�� B@���e_XZZ3�,i�d�V�@��6�1+�3��2������8P��Kt�����p����� ��p1{I)��O�殱I�� w Jp)^+i� �g��"b��`���ۂ�6m���4V����!���@@@���D �j�?��&�(Ў?P��@;�X�0��a���e�7�S�*��.�c�(l��K g�St*9���k(��E��lx�v(��8�p$��@�y3iD��$� 롇����������₴f� �] �`l½����䂼� ���~�a�H(p"�����m<� ��Q;R��n���`��YU�3Z�Pۍ7Tc ����g<"���!W��{�����r�m[�7�6S��c4��4�M��is�kY �t*thH)yg�� +���5�JE5[ +�i +D�t�^A�Gu)A�![.�(�HP�qYk�]�*�M�8%�C�+]i'c�E#��Ɯ��[�6�T�e��7�� �y��~�ʪ��kocM;���K9 +� ` O�_/+y���h��2Hgǐ�ȌaʈyVD2�_)&}�+1i�1������Ǟ����gIi�2����<�Y���C]V ��66&3:������V��kEv��OD0_�+I��g+� +@3�Z4[��L4@�ް�8��g�H ���9����h4etP8�:��e�:/��7��L�����&<� ;:6fq[� N8�\����V�p�� �)����>o7h�m�#����o9� +��u\p�,��R@\��K��� +�+����ڬ0���o�����y1#�.�[8�ˡɁ;bDD� �xc ��_��?J�b�7��7�6J�=���2� �.۶�4�75���׹�v��{ ,�Qh�� � p�@�3��V}(��"� %�ܮ���8�Ab��}[s��`\�d�3���L:�lj�B� +�7���8������s��I�d�vJ|`z��j~�6 +���o�ˠy�4.7��t�8s��ED�@ƚ!h/kF#��"��8aW���C��k �F���Xњ>�VX��|� +��$�tl�ʬD��&�0<~�MaH�G_�N׳ �SdDʗ�b&X���i�._��$����j+'�+ĺ�5/�BN��>)�5K��ea�sRE�A���d�7qq �tRc�R�y�E���e�)���\����eo Z�oL�-6-he!�j�aR�>������ДM� ��,"췈��bv뢑�Ƭ=�b+G�s3|Y�,}�x�`Q �$'´j�>���%}��� |+�u}�=��2z���"ra��[�~S�~(�꒴N��yU�z������G� �,�j�٨��R +^�C� vEI����f�ǵ��=4`F�kc��ԐE�y},���wM�6����]�v��\ +*��O��p�T ��TH�����8�ŅU���9CiG�>����\������ �B��)fZ�S/6��Ȩ�PT�Ӽд�ʨ����p��hI�z��> z�X�!#?V�T^ŎmR�M^B���.�>�J.���r�|%p�Ć'��N�iՊyɭ;��?��8�!��Ӳ]Eb ++UVpU��rQ����� ���bN���� �]��E�����7>pO Ae��zP�ݺtb��fa�(ͱ"*״�k`9j���n�Q�o�R�ؽ���Z*aJ_�1� )�� �q�U ��á�gj�i���i�ǵ���&�3 ؑ;.�qI(�.��(R"JJegA��rE�u��\2/� +;�۸� ��[G@jm�)�qA� ��J�GC�����Su�l��΃�$���C0�ף��ÌQ���w������MH^ceV�/k��; /i��p|i�c( +�Y cSJ!@'G�iY�L�MEV��� �&�x���9�W�����A�������8�e� >�N���6���r���&�dkd&�\z߽��"E��*�)=�D��58���I[�d�GMLR��/�W�3w�9,��Z�׀=����P�*c���5�~e��(�͑�z�(� Ph_4��Z��v�--=֓� + ����) E��N�D�t T�H���R�}?��f��閜� k���]9��Z��N�t� m��<*�8J�����et: +S�����-0�mYq��Cz,��j�[��z�M��X2�Cv���W��VJDU�}�� G�Y��)H_QT���P�.��0xj�Se���H1i�D +$8�*[ n����A��ErC��8)@x� i +S�M,q��p�NE� +1ExY��x�*�%����3��x)J$S4��U �Z��������d"@f��_VV��dSsэb�O=#Tn�']��I�8+$<@)a�|6��?�rUύ�H�xF)�=N�;P�_�;S���ڔ�Ų5&y����tpD��K!�KF��6����+ ��2��}s��$�>�E�v�ߞ�CEQ�r�E�T�%x�u(#W��x�0��g�<6�q0D�� � ىX�F6ȅA8��\�A����;�I��$�g��?���v��u�'��ʸ.�ՠT����P�h�P/˴� z�U���4Z:T��8�� i��<=�p�6�@R*@�(j���z%HaGD�p�A??ҝ�����]��G̴5�g���˺|����TЃ߃]e;=q-ds�0�T�q�*�M�f�U�؀ +�eȩ��hH�� Ԗs�?��6J ��� �Pf�Z^� :;� r +�C㰵��if�i�X�_/ꚣ�|�����T9?I�G�4�V��X�a}7 ��\]H���`fC�o�ٶ��_�P�;����q�d�$����i��ba��ª�%6��'3o��#w����Ts ���}�V���⤩��2T�č1�s��e}��'R ���NY�9�#8�ꎤ��t�;��.�������'-�rd8�xQuj��� ߿r�{s���ie�?7��ey�������^B�tq��C +҉H{�����g��{��� +2�������:�)�[�$2W��$��4�V,��,��7�?T���zY���M�є�����s�����W�}�#��JAE`E�_��QB��2B�l�0�6'�T�)E��v���d&�)[&�,::��4)"�"� ���\˦@q�;P(�3i� `����3��NY:䞯>�D�JO_hOӘi���iu�MC7-j�G_��5�o���{�JJ�L��)� �2��A��OjAKB��2N����N�>��B �ܪ��A �r�g�:H�"twp�T�bOx����+�/�N`���P�����N3c����jj�|P $*�-����}���a���J���B~ ""=�� zf G ){���*�p�q��0�Qq��е����0ǣq�ެ9�G�m�_�j/T�׀���`R�$�߼#5���(3~?yq�bg��A��_�� ԗuC\K'2�-% I��1�����Pp�ɨ�����`��P�Ԓ�,�Zu�p�07�q@$�>w +l���g{nkk�����f�e��Cv"���)�� �J۳�)Ρ�.J��x�����E�N���QES.���o ��X�;@I�؛��J�: J���$j������hu�ϩ�@�J����z �n�Zi=�n�%H�;��A�%�]ؘ �;,^֢uWfŋr��{�7�;���� +E�t��vzz�.���7�SaqҢ�����F�Ƀ"?G`��};����e�HiU@ +g�BnT�"�� -�L�T�~Թ!lD�n��81Ğ�"T# Au�\��Nh� ��63#���WB;Hs�ݤ����7��[�&#�9h���l �1��K��I3>�BU0ql����1i�UÓ��yS(�@a +U����Wи�#%Ĵ�ͯA��B� �3��5�-#'�Q|Ys�r�$�1�(��0��u�N\���7Էj��K9@�W_�/y�A�[���X�ݗb�4I��I;�[������!͂¢���]�a���ol>k'��aD���P�]�jd��Cˑ�}Iq��%��Ų�=�.6?@��p��<�x�#�!��r;��E��C�hA{Y7���KdVɛ[� �)�����‡Sш��|I��� �:����n�Ȏ�'�����J%:�L��z-F �@ �| ��% �`����A�ɔ1�� �n����U��{��11�9߭><�h��e�l�я��E�K� a�����f��d��;"x�Br�c謞���˚А��O�]i~��( ۽9��D��țF�X�,F�mM�Ϊ�} 1Ø�P`�L��E�� +>�V�6��7���lN�t�OX +�e����(���M�� ��j� � [���#�'#@D8CQ��4�UB<`8�L��81�8gO;�:v���<1ڙ.8�� X�e\��B��ʻI�����x������sN�X��^|D!߀�)��V|A^:�Ԍ�%� �����7����Hd��s�D��!��]�&�A�F� +m ���+s���.�D�_,Z%7��Ж�l'� ���g����W����Z���P���La$�jop��2a\�+�{Y+R�g��K�3�Ȣ�FLp0 ��I�Q)���:R.�z�3!҉m5��Fv�[2A(�G*69��z���yQ#��vS�_�->��ϗ��A tЛ�G�KX�#ͳ)����`��;��K7�a�GV|�*5�4� +���t��[�B��6���li�g^l40y f��V��D\V��C2j�����fq��Ϸ 7����z�������e%z�u��HrC��΅��ABN��@p��Lc��;��C�S�OP}I��~�3�I�Bl��+�F&pN�'J|�ivN47_Vح �~*њ%sp^�ӟ^T Y��_�i��S*w�Lc� +4>�f�&u���y��U1�i��;L�n�O�F2WF�E�p 㲸��f��� �R���������~�gIS�a�Z���p��SWX`k��4�: +m��pb,3��>��Y�°�~փ�����¹y��Ő\�w���-�I ���Ϛ�?��QP��(_��4q�x�R��Q����l\|p����L-�q��kb2�2Gh����q��%�ܼ�=�gj[¼.��3�%��� )m�a b �E���?~vƲ�Dӑ�SY �~� �xkns{�nc��q"����&n@(FPE6,�!��8N�& ���;��1�Aa݋Q��h #qV��V,�BF�!��M��+�G�!�a�Î�Vi�'z���J2�� �͐�Ƌj���,��܁�QrW�T=ni�徹݅&�ϐ�X�@�ߑ/t�E甼��ݿ�8�5�6Ʉ���#j�xDt)"χ� D;y!�V�� ��z��_-� S<�Ý�&����A�|(��!���$��9���O\LiU��� +�p��vG��d��Q��:�0���{Y�D���4%wj4�s�@�a_ve�����x�Ƚ��� +N_�}��V�5l�[��1�/���L$��c �` U~r'�^Ā��@[��I1��)b��y�B�� \0�jqO���y̤�f�HsEJ U�`I���{l�n�܍��H���b�+��(Pɗu�fc��놔�4@M�FO�f��Kj�vm��S����P��A��ґB�/a�c��� +JA� +�ʒ�*?�Lh��V����,��/OzY�:!��h���g�$l�p�D78��r[��� �X1x�A��%N">�|]��+4�c�dq�QE��pnbӬ� ���7��#o����І4�~7#��c0�l�T�I߮ �NLJDQ5*��(��ˑ<���H��'����^�=�����ŷ�V�����R��T4�J����A'U�U��ث�/�,c +^NZ��)�Lj jA�DzTƁ�b ��b���g������ʓ���p���C��op8��u�id}���߄���z���\ Ь� �%4J���lN�v��A��픟w�3�5�%l�'7I�TUKL��½7qj�^� �� �J�ǟo������DYW�����0z���G5-�� ��xI��g�C�>@ƽU��(:�Vs�LwS@�a�4�@Z�27�e .���=��FF)mH���\,(���a�4����� kz+Ԑ���t[�[c��x���KOɲd�� ����kM�sk��R 4��T��iC�'ۏjaMG�@�J����l�E!�����`p�.:�M��%� �2�ؘL��4L��t*�JβLl���V�����e��f�u�=-5P���! / ���N� +=��f"ڴ�Hi=5 {�z@]*��B� ����\�`Q`���h����db*:9T�b��U���p:����� �Y!{�H�*�;�]���hu3�9В(_�*�� ۜx�B5ne$.�[�T!T��� � $�d��`B�gg��X\`�Ħ�J�h5y���/��g�Rji�j"QN'J����֖�D� ,�!;��\����� ;"�E��L��O켬�äY+�ja�+�񦓐F��؞\���ʈlS�R�.T��=� �k�W�C� �Yr/�JR;�;��Hp�9�ཝ_�/����j!�ꡏx����u����@2ؔ��a)�j�m��`^�c@ĸg�t΢�nd�*�.����85aD�yE EFD����"��\@uF$F�g��!-�B-f� �0��]�������>2�V��e�K�C��4AiʛUp�Ki�A~� �]V t�٭�M�H����cxu3H9��������xeX��}J�:c`M�wh~��\�#�Wsp„����Vn����y!}#���>�����攻����7�ti;*��Z����FՓQJ {?�G����^��VT�V�Wp�I�xY^�qn�����b��5V�KP�����T�r���T�K� ,�zPYN2UM<|��)Н?��e���:ͪ�GU{o/+�|Z_��?�d� s� l���S�'M�$� +�`�<�@�����?�^��f\G�Ȟ������B:���$�\�)��T�/K���.Z��� �9rp?��)hG��u�ˆ]G�����İ��kC��7�o�y�r8&� +N7ꥨB:�c�k����޼,��h�Θ��cH�.���7�1|��ģ��~��A��,�0���H0���]�n���_|%߃:3N +�:�"�(� t�/K�����xbx� + �U�RF��tT)� +g�1&WcR�h�� D#�PP�C��iB�9�lʔ��+�aI��y�}!{��҂���*H�Ph�Y�t��!�m�È��Ӈ�fA�7�@Ѡoa�wk�wJ���d�Dw�i�d�ƣr+�'�pj����gAuS� �F���@�0���c��=2m_1-��K��,�M���S�UԾ�E�I ?uj;<0�h�X&q`�8lH&�!�S��l�0-YPo� :x�$��5��\}0-1,*��V�� :v_��L��k�U����=�X��T�d\"��ņ���8��J���,��ˢqv��D:<5��1˰�g��gd�Ź�l��Kv; ����\[�� ��‹:V|�q�Z0k�T;JZt7x s6k$�•#_֊D`v�p��)�����8w��bJ�k�"���?5\���K5��3���i��t�f�Ũ��M���_cNP��.��qY�w�c`_-q�#*����H��>���RC0r5�����1���&ڈr!Ǎ�ܜ� IXh�Y.�K�+0U�t˽l`�ս,��Ho����=x"[����[�Q�[Y5c��!�q�ã�^��>�q���:F��9�Q;�a����&���kG] f�ex���jW��3�h����(Y\��� gEJ����n�&��wuT +��z�ՀsfN������x�M����Dp:�rY�=+6�V]vY�D�� +��/%����iس� �} ��AL��򳇦�z� 0���8W *ahAW�Y�ڝ������Ap@M�H�$����R^�9 �;�Q$;!�J�&��0t,� �UD���*�b^����~��qT��y�yT� +|`��[ћ�@�1��b��5��2��'XV‘&y�3b���M`ĆG=k�UlX%p3I`h���q�- (��f����h�+������2Ep3 +��j����N6��[����>�KU2-RK8i�ύ�L�d�� ��,�tWj�a�cm�"6�wjg@B�{�iUby�2�.��G��æuU������vfh,�A '�L�j�ߔ�s7 ����� ̼����� .�G��$-1�f�v��=e*s�#{ 9UI�Q�U�\Ԥ���E�F���:R�c䃮��fV���]��:/���3�����.q@$E�B$Y���� ~���}0DC6�A������R6ɓ7s���Lr"��>5 �`Ա��N��ȹn|P����X�b̲ό˂@8�m?�>F�j��ƨ�!�ǓR�I�N�Q(Ŗ�|v�Gb�K��)0���ZV6���x ZM��Tf�j l`����q �����m��`�:j_�Q�LX�U%^ri��0du��աu ������8 + +ܔ�jWvb� ,�WA ��k!𶎛{Ѕ��|Y���� �M����n�(R�dN�������6���v=���BJ��I��|J I���페T��(� + ��ĂOyՔQ/����Ɔ�1L™�^骕���� ������!� Ċ�A҇�����j�� Ǵy�ĩ{)$}|p�kjdϦ��)F):=��R���"!e�j �C�B?tJ#R�V���c�N�1�6�[@�Mf7p����F/�*�s~������)!�;�*��"����s� ��.4�H<�C}��(6��)u$�o�Y�1�r[rI���B�����/����%��êޒ��!�N +4�9��.�U�0WD�4#͋0]!o�{ +�l�Y�Ϊ=О���/����!y��OŽ�q]jظ _Æ݀6��ap;�P�������= +�����hW+fkY��y���2eܾ4�b}S޼{���R6��=$j=���EPB�+@GyZ�� �la&ј�L���$r�]D���p��V�"��T�LPC���J�9�C�UV&-�����XP/ +�O���������� +&(�5T����T @��:����L�k⸗u�e�{�L�fA�l^�;ra�v}1Okۯb�8�z�5��t+�Y}�95$���%���9Wvn�ƣ�3K"kzF��S�yY#~>WI���EMX܄�y ԇ��rO���i-r5��iK���z[)� X����s�F+����V�N=�?�?d�UK����<���HO��a����B�!,�1Vb�Q$N�2�UH3s��xaj�֏�t M,�*�Ol��`��p�����6�U,x4��J�\� ��J ��� +�����Y�k�{<~3� + ��L��F�~�4fKI��"���)�$��;��1(L��.��| ��b� +u�%B�����Ҟ#U���l�T��r4!(#�R�X1r�͕YZ՘��ۡ-!u�b�ߍ�g�d��ơ����J���/�$��g�8����D&�M�T)�>�J���8j���`���y7����dh��C��%�>����mw��skj8�]�� (�ei�~e�R��(��;��Ydu�R+�:Z�&�s�����d�c��ʀukA}T~0�K�ⷞ˵t�0���I�@���xY��)�6��֯,�C��AA�W-���Mب;M���*ek@N�5-< +��7 WЬ�7��8.���*L�N�"xf�-tP���eN� +9e��Pq�N@pouuYۋHJ�Ni<�����Q�L.F�GU3�8�J��� i'~Rq����֐��b�j��x���,���#0$U�Yz$�`�*���{�Ɑ=�H�S�D�E��UN;ިQ���If6K�|��#�fG�6�?L�_��,a��^�*uL�)�UE�*���G��@�l�iQ'���%C)kQ��^�a��|���s��'� �(p�b���+#�"AGP�&y�eA������zmƻ�䝸�I +�Z⶞��$�H�3 +��JW�W4�5��Zx���G(H��_��K�VW�h�\�0�5U�֋��˒� ��C�������Vv����!��GyFb����5-k {��e4�ᆟy��H�$�~JS̍A�E�J�Q�e�9�V [Ύ�ʯc����j)�N�4%��"���0�Z�J홪��X-� ��ج���G�������A����8V���q�#zY��!��[)��G����9��G��H+/�`�1 Mqj��# ���e�+�+�&�C�vҾ�"#G���v' K�(����|3|#33�+���k��\��'CMq $J�%X�E7-��:7"�E�_��� �(���<��Mꋏe�w�l�K�̏[A��,m6�H���r r�X�ug���������B�����62�[�؝�&��ֿ�R���JdZ�������I![��/7�J?]�a�XN��f���PԈ�.�t���H���zw���+ԍY8���A�,�X@/c��:���d�&�H�Ώq2a͖dg��Gm��^�ih�$�%s��@�I������-r�1����`^?P�&8s �����H�KB�m������� ���Z��y�uG�H⥝��皍a�+4�8E�[�:H���"�^e�w_�# 4 +Mډ�lP���e�n]ۮΙfBR0ݸ�_� +��1�T(d�Ja���$w3E��Oh��d��T��Q �5VbAe��1�� i�HQ��W� +_�i�:�J���*��:�^kߊ�3U��X�#� +7�� �^şi 4��s�w#�1�~DN�D��m��GN�%��-q���<�/+ET\w�7��L�!N)����ln +� �̏���ͨE�7��\���qϳ�ÎTM�B;p���[m%[)d����=-��Р�, �y�䶨:��Y��ud�l�AETRq����G� +�G�y���E��(��u���ǹ������k?rO�?$��ZQzY=]�� + +��!���� 4u�%{�jI��GL@��n7_��iB��BH�ς��&껀��Q�q��e�#�3'-�BE0*��FX�7�j�ŏ6���g�!�Z$�-"ר{Q�� *$Yi�XR�=�d+�i���l 8�If�7���6UI���� �f�|���v6�ӥϸ����2�����-Y���;�@�L*�q,*��>H��;a��(SK���Ѵ)!ݘ�f�`K������/���W��@�9%��(\h��ț ��m��W�x?� ���)Q�N��$�g;SE�� +�ymt��r�����7K��v[�"� <������#V�9��a�|��ݜZքI� ���9�Xm%)��^VjF撡2� o��xp�Ǘ@Ӗ +����1QF�4�]1�0�Q_a> e�r��>lh����Z`>�A��1�I�-��A����<�e��>6z��̈́/UK���)�����^B&ܦP�k �2��i{�^�x�hԛEn1w4ɚ +�tU�Aϗ�>� �I���ӗ�rwI)��a�F�wM}[��E���e�z�}H�RG��V�w1n�$t29 +l�����!�]�^p4�����fc�&I�ѹ�..+����dh�ֈ����rf�����J2��d"�-�Ur�/ӛm��KHF�/���N�X��u��ߜV'��x}{Y�(J��@��r�� +k����D g +�ڥ�|/ K��B�7���zs�Mp�Y�?� +L��#m�0� w�|e���y'A1�r2j�Y���H�z'��wP�GeT�+iwaU"� ��9���V�C]h a�s7�ON����+Ƒ��z����;�{5�� H�?P𼋍�'k��O�@���*�` �Ӄ�S<"fW2�c�\�D��~pm0w�!h�K$ٸ�p�=�1� ��}�RJt0� q��_R1��v�_�S�o0%��7��� "ʩB��A�T/yS��l<��N�ˠ�0��T2���d|ޣh.*�j#S��\��@s8gB*b�.��a)!�c��S��)�I�N�K84�����E��5%��̢�'��1=�(Q%j�*<��e�"37�R~J�F��C�����hH��%< m�>�kAP��z��"�#��ݲ����ũ�K[�K=�߰A��4��ߛR�o" +įш�?{��)�d5�H�W-e -83��7=� u^��~BoD��� +:��B]V��'�Q莣N�I��(� �m�w ��" Zʼ���{�/�?��?������D�����߫�Ymx�,o��^�E ��A�����c��h�o�(��$�R#�`�����./�X�3��.q�Ȍ�ɒ�9(@<�/"u�/��r���_���Ԋ����~��"���8�xR�!d���*Ԋ�G̒�߿����c����ڼ )� +�R�hӉ�A��h���s�D���P$"�:�֔U�/���뤑�g�������9��H��S `�( ����˺�oᇄ��O��Ds܇1y��B�`@�)e�ŨD9U�Ӽ� +5E- +\��"�9�2÷�.�`�`R?@X�C���_B�?ϸ��G��̇�\�?`y'�^0�hZ�@� ��4 ?�� �e�����ԑ،d�fw�H���1��2C��J�*M��Xȇ�b����Ť�mE�E����x +�n� �K �C>������_���<6ď��H�1~��Q�!���+1���������"C�KhT�*�tY8�nQ�<��wWS��EMu��B,$�_pm��"��X�/�������ri����kix�U����������\���0�oal���xŤ��y��$%������S쒥��N��lQ��pH�YM���b�%��F������Y&���{|C�L�Ÿז�ϲ��w4\ß5V�_婇�ˇ�����@� �J�_V�:C�%YvPN�� +�ųpN�'Ѡ��B-�K +�5����%�/`.�\�_ +i?Ǣ"��,�����0��Ei��mc�/�G(���ZN~ǧ7�*Ԥ�W����^�qG���A���Hg3Wƅ+}�1F�CwY���鲎��8��J�2i�B�ڬ�`�x�ĩ/J�x3B��<����t>�ܔU(�$����h�h��"��dEmroH헥J� 7Z�]'�c:]I��@����!<�J�}�׸,OV���b��JB� �#������&�_��G�z(+5�CS5?$��XE��H=0�e�o]I0���úRaP�E���^��B�Ϥ�Xl&Ӣ2!oF��o'}q��\��18� B�CBD�Ѹ�Rw�0@���`&C�^�N�2��q���ùQ����p�DPA�a�К�� �b�M�KC���S}�x-�E&KF�˺j��t��0I�C��1�����̲ +-m���G���ݜ9@�T�M��������D�ji��ZԂ���dw�T��|��eeQ_`��/N�i��\L ݸ7JR|���>A� �R�� +!��}Y��H�j����|l2�9�>���~�X���/j{���eC�όDdsV��*���3 Wb�B�J~o�FWw�����:2�ﲸ�0)P��yh|kL>�q#0�� ���it�1��ڎ�תH���� �XPQ��ϽH���G�H�W�˲��\�r�\V'�b'�� �L����,�g5���`�#&���W���1S�(<4}�!��3� +T-�TxY��b�_An��S�m=� E����g�L$o8��X> ���O�s��ˈ��T�~�pB���}�k5�?�H�Y�A�=`7y`*0�ͮP��4����ԣh +>��WX� ����*-D 6��9�_1 ��"EDF��--^���~�E$5��7A90��ݤ(���@t?���/���1����^�&��i,�0S��"�D�r�FU��J���0 Є�J�����w/��!�Q�E"��5�������L�y�Y�s�D�\����t{����T�_؞xd�xE�����X�0D"��ȣ�H7R7l����$5��,��F� �*�v%ۺ�"�j� ]@�W�G���B�{DkJ�& �l�`>zBN4H��ө�Bm��c�� i�ey��R2�{Cj�R#K��FQ��� +��%IԌ�n���&�ˠ+Xq�y5��X�3����_�*�HD ĂA�oQ��;@!� �n|��-'�~�ggB"����O��N�� �������('d����J�.��U�Rs,����䕰C��eF��k���x��������PN5xc8�~�)(��A;�Y�鴿 6b�~‘����? �#�$���s¹_��u��o�y�߰�ßP��V!��'b7,!�\��Dȡ�h(7�� ��!�������B<�Ta7����������|~�$�V���#0�"�IgF#V{�@��S����L�/�0Q �|��$x ����T(�i$��7�T/%Q:�=����p�����R���jB=���7+�62~h�j�}Y�;b�d�C��� +XH�~�@�&���$��OS��/� +�����,� Q0CVQ0�UQ0�PQ��biğZ��/�%1KH4�ε���7���<��igI�W�krnT�t!\�A�Q�+%��e!6$Wt9lI)�Q��~�~���)����w��>^�_��?����U�/�p����u�3Y�H�3�:�A�6%c��v ��$.i����,.g%o5���4bE�u�u�8 S��q?���ߢi�Y���`n�em���oh!�v|�O�bQ��i��`�������`�����ۘh�  �=��,BJ&q��,n�������h��� -L���ٖ�d@}��Ć�O��ڏJ���e9b�`�w��J�M��o.��ܤh|�'\�=��bނ���GY"���O^�U�E.XM�zN{�g�~4�A��.ˋ|6�����d��!�ߤ���JĿ���v�=f8/�G~�ܭ7H�#=�_�Jtvx&:��@!���$L����P��9���oz��4E�Ӣ ��f:o(��4ror|Fr +��ۏG�?�3�/K�\��,��Y$��in=--@;�H3��p�>!2"��6�P�Jb*��Ih-|��H�lfċ�` ��"���{����7�D���ȕ�c)=U�SXRl���?��h�D5e���`�e:�� =��u�J�b*Ͼڡ�O<%B�=j"9%���',�?�.xi1���ɀ� `� ݿ��dj��Wad�U��]$�:u�Ln��R"e3o�%(�?�г��V��*�_�@:�-��WW�Έ��t9e����2&,L���e%@�%��<��@vT�@nH����:�N@�ҠH�o#$H9q�rEK��K��d�j��3��~��~2����&>��q�/�=��H���I��,*:�nJ�]�O�>���q1"q���(vz�d*t� +УStRM$�����O���D���,g�<��$�����W�Ja�� �@�~���XgQ�˲�OT�)(�1 �F�n ��� @8��� ��@��D����h[}@���p���0�N)}�<2*3 ��?��V��/���@z�_�|d?��~q�"��\8М&��7a�9���@s����0��SID������.�%;� !'���7� SAE&���s�EH�e��b����S<�Ȗ�K��B*)�6e�8q�J� �w[���� 9���C�:���� +���$��7��h�C�t�Ui��_P)ÿ�!��z���!d��0 �AGC�D�5���ׯt �$�'�ԘK�)�gB&�˧Kdo�_Ca)P)~ʇ9�� +#�6`���������?��O��)� �����C� YA�D"☰N���D��RR�R9H�� +��3}�2u|�;a���P������THD~����# ���#~�C����!L�o�;�����|0���*�@ݡTHtGӒ�� †�ÎwI�2����J��L�B�,dZD���Q +� �1i�K0�Q)ćM�<��_�E�� 9���@�_!G�����?4��o�o ���� EsY�u�:�'� +!�@Z�82�D����tc�����)���iԔ@&�e�N������yxNNGC J�k�L*�M ? p��z��@����� ���ߡ��g�B��� ��1����H��"�M��@���RA�^����+E+Z!^���<�t�Q%��1H^�\�p��<�� /K�P9F�h�'Š�G�~2 �r>�S^��CtK�p�� �KCg��0�S�X�wY'R�����X*���'o�ţR|� H���5���i���!w0�Ѣ�Ax�Q,�� y�c>̲�2���&� _y��O� �n3L�/+%��rԋ����=����-�h����ܾR|9���Fq��w��s$tx\�c�����UeN+��I�ro��?�H��tw��� ɼ�����A�� ��ˤ�6!�eatsİ������K�����G�0�R��z���n}t_�b_[ h* q �A��T�2����� = +��,��!�k{5�Fq36 �~A�v�dʾn���t����Nkxnndb�!)S����l�;<\1ty��~�d!�� �o4r� +<"3��U�2� +@�f�d��1'��iH ��.��a3�.��O�O��O��/�U쿬���(8BT�q�Tp��@$�9����GJ��#��1�����bH�����`�ab�����*��tD˗���F��R�P�Y:y:�ɘ�?���/1���!�?(yH�,0r�j���t�XQ(@�o�%_��X/"��N����I�o�I�a/�mYFqZ/=�X����w8))�f`Ď\�e�@J���7]Vt?h���2l�x��`���6,��]�,(F�̐�� 1B� �#(����Д�a����ةd�Ս6�בD�W����oI7l�}�H����d��ByERZExJ肸-?�2Bv���)y*��@�s o�G�'%b���#�(*���J� ��JM���o=w�������wxFko �m��@r5J�$��N�l�,'����J݄fϣ��32(��eI�Y�E��)n`�_D�۟��?$����=#ğBH?{r����Ü�ϛ'�\�]+0�+� $��� �Dߛ(Y��,�_2��J's�J<%��ȃ�!�}]��i�M���dl�~Rn�6����j��_9���J!�Q������ߞ��� ?��Qqׄ�B����q���L���T4���,���x犵�9m脐TF��/�v�t�$�O��O^Vڿ��7q2��G��X$�p#�˒S�������KJv��P�l�p �� ;.�)��#�Q����8at +ȣ�O. "��T"�L��;�4r����J���g��%��~����t1e��a�����o?LJ�%"�!qN�0��rAA ����vз�%�� �����:(] �Јq "��Q�vF$a��T��i�\J�9eE�iMq���]�����l=�s���w�e�H$����A�1�%��E�2���ߐ@���0P�Y��4 ��!U�D�hD]�Cᐌp!a��T�'���L[����9e��k]�����<��!���F K��EP2�%2nFH�9� ���3 ��B�m���6\B)����`� �"#ܧH�';��F}J��-5j ُ���,�d\���$G!�o1�� �C�%�K.8���< &�3�:�9�,���S]���HC��LC�Dd ������"Mr����eS��}&��>�6�-bD��B&����G�=�� ��#.����� �_Ve�[2��4�t� ���#�KK蒕�?j-�z#ŝ����DdvJ�H��їq!�p�(e�t%x�t�E*D``�%�`��%��\=�_� �/Z��o#pĿH5�O� �eeB�~�A�J�OH� ��z�&�U)�S4���5���T�#25�G�`U�>�ɓm��0��6]��>�Ѐ�q?�4b���`�e���gn�A��Ӈ���z�Ῥ�⠍�::b� �蓻"�:*E=C1كp"�W���Mi�(L�9@�F���0G�:��K�b�*}B�-��䈿°���_Jz쿬����S `��@���������W�2)��ɤV��D�]l�����T�v�RD�5���F? +�_�b���G�I ���H��h�밠�#RR ]��G����\v'�:\]� /+� ���xx1�܎���$���2q�d�ָ���; 륻 �o���s�S��"����|ƥ: '�z�O q4\(�O�uBS�c�����3�� +���1�z9P����E��c��q�"e�6����A%zj�,G���\�‚wԦ��1���g��%�K^L��m2H@3K�c8W��������H�b���T��ЇX���؋�{�W�G���+cS�5�0�9ْ���P�=W���Y~ɞ��׆P��(���7�#� ���ØY�a�F-������ �a�M�0�L4���B�(*vU��������~�8o�Nf�Y^yf?'�Y�˘X�Ki�>��B��H��g�*�5M�7�-V�ge�gO��ٗ� �9G�h�y��`�H��� DEL:�{�R���Ě�@)XA�|6�5��Ϲ�e 2m�ꬭ*z��86�S�>[PD2��v�7Ej�`��Y�#� עI�CLJ��n�{N˄�v�%�� +�?7f�E��.P����^�ar���Am�(q�~��g�':�?m��W](�w�6�٨���ee�� "� Ɛ7�#�V�lHz��]��tlċ4�&�6b�C!�1 p29��v$�oob=���0�"��/%Vڟ��W|\�_�*�X}qG̾o +^�v|G� @ ��X��gZ��­B �<�Y������2a�ʤ�L�� +|5�ͮ�l8�9� ܔt����NJ����o���_�F�������Ղɮ�n$�G���´֛45�9��ƬpA�~�J�d�JQ$?ۅ�ȣ1�/�����H��&�QY�_�C]֋S��q�����_�$����Ot��o �v �~5�C����g ����b_V �ܚ��a�2v�f�A{�F �E�iK�U�f��pP�X�dqa�H�R '�:;*��lG��3r f��R�V4��A��h�N����r#���%��������> ��+)y5�x�����G��S +�}7�.��$}����e� P)'��x���b0ΗD)��tz�ws��1,,[H�/#��B)I�����7���u�5u����@�@�Y�� �w$C����!f���P���~*����Aa�����"d!��A��E�o`N �"�Ġ��LIFD�FAI��4N�w��.)f������~��h�(�d? ݢ8�/+�J��B�0J$i�TLȢwF�e^56�Qc2��.7(�����j���0�!*���KR�����P!��]���X��V��_F�����]�~Z�`��_�_Ok���x�p��،Jgt.��TD�`h��e� ���}Ȩ?��V6�I:4!�#E}Y��Gw2]&9�:5۟��o�V�o���BW�EmL�����DJ$^&�`F"�™I��$OM�4jp4}�s"����{���?G{^��}Tݢ��͆�K�y�*B�,-��&�DC�R�D�3���ߜ����D�;ŧ�!��3 �к�bٴ��emZ���Ks +�(�CRK�K������ྨ�̿�q=2�����+��-w��e&Ӆ<��گ�گkn����R�_vi��B3�WR*QEӾ�Ń� �s��#Uw6�ew&�W��=���г�d����_����g*S�Ll��+uF��7&£�@�%��PJ�O�O��U'�?�������b�ee�@��:5#�w�s���s�:�%��٣����O����V�d ��7�Ҵ„$`�iБ��3�tY�BatRq,�ϡ���5�_U��:q�{V�E�1K���qpj>�Dd��9Q�B1G�d<��h���G���m�Y�9���@�k؀R �"G+���8F^�0���U�B�I�:�NĒ����~�a�~����NG���zE�/�.�. �ID6"���0���� +>�K�n�Wo���ߏݡ����0�+�-HEU�e��G ��*r0�r��t= q�N%�(:������r����i&g���SA`��y؏��Y�IHۄ}X����7=�iLH�#0�\�JBo( ��0m`�c�P�c� ���� +1 +IJ�̍��������^��9 �;jA.9Cr�8�����4 vc&�H��C�:R��8L1sx\�v�CDc��3�ܶz�f&�TnQ��6J���j�u=vX(4�9P�<�yK��S������T^ +�d"�e�8���=�w�}t��-��j��39��N�x�(�S��\š8p$ y3�|� �)��o�?&���!����5xK� �0W�1/��n�ir/4$!����4V��)ڋ�i_ +�"eI>�l�'�:u8A܅������ 0����:tB���t�f�l�l���� �L��C�My��M��2�� 4� �� !)Q���� �9��L��D*�vZD�0��}Y�A�)���G@m����!9<���)��t�3ݟ�_V#�Y9J�~�5���6e)��w�0��AhA� �A�3�T�ZTD�yM}�I�Ig�6�>��g�����>�3?�4*� �������E��&�����������Ao:9cl�eΙ�ߜ�Q ��iA�.��4�]���U}�PN����3��^�Ο�/)�x��?�MŢRy���D�.�&���.��~A��~�`������˒Q!�J�XS*?Zµ�~j|��-�����������ǃ[ӂ���W����W���e��E�)a!����Eh�40���7Pi��~�s?��o���j� �?�>��,�o,���i���[�M�M����=�H\��\ M������)B�c� :h��uw����X$Qd)��@֩uǺ�! ���{. �g3��7f�W��;n�U9�L+rN�� +pb��8�0�������>Q��\��1�� ���0�ID�"�#�4#KO�M��������uq�U\�LJ�3;���xM�6���B��#�bF��s�}��[���T3D#9I�_�%�/X����sY�3 +��QJ�x0������̹��|�ߠ��ɴ%d�Og�\[@ ���b�cc�Q�2�ž�h�jS3t�r+Hџw��; �$"?IIt#��q��&��π`�E%S5K?u�$A�������e��J�/�T��4����4�?��, ���ov���ۑ�!y����b���g`�k�Pe����q��&���j���F��0�B/%�p��m8���ۏ8G����e}����D[�^��sWS�=��7H�R�H��]L`:@.HJOy��}q�4���<<��C�^ ]֟n�i0q�dϹN���ۏ 7��Ϧ�_��]�b�{�9d5�/�}z�N���]�p}%mю�6HYc��V��p��ތȸ*~h��O���D��$�'��D�~J}rlm?H � %�5��>��8��\�fH:�|1lu���旄�N�IjzM��J�c" +� ��:ᮁ@��0�V��`n��s��6`�_�(�s��ϱMٯ�J�Y��s���$���@�A*��yӳD���)H�+����}����D�*��r�9�ʞ���2xQ��,ӄ�~���~Y5o�9l�ސ9��K��+ ���8�,O9�'�.�S"�G��Ow�Ր���EC+_�����P��2���QH݆�M�s"B�j��_@���*u�G~�����~�d:�d�eIP ?�>c!U"�Ҕ�� ��QН�� 2�ȣ��$��F��޷� +�sY����-ׁHÎ}��"q�� +T�J����,���K��/���g�wY�_��ůD�����g9]��S4�K�PD�M�&��{�@Q��۞6�p �ڄ��2��_*��*5j6q���a�M[���@�7j%��%�/~@��b���GӅ�bN�ȩ�,O�P�dD�`#)1� $����~}"�84�=n�}��� }�q�ח +z�t�����sF�oη�c+S�kH��4e%5�twe4��Kj95� l|:�XP&r#1lV�@�����x՞�r���6�0h舛�b����z=)�E�~�"�~tv���d�g��ɳ��8�tT �^�b20R#%7�Ln0�SdS1��M��B7Q)�I:�>qx'��ӂ��'��6�@ńQ'V�B�~����IqJ���~�������㈳ߔ���� S�� ?�6��h6�զ���Y�Ċ�!������9�8q��A��e$�a1�Ozrm(u�Q��W����=NyD������j�i�������˺�� t5sY&S%ؐj-�;���Q���ņ���"������ӆι}�����y�6�a1�:)6r�k�0���M�%�S�ϧ�{�i?����q!�-�#�K��~T��-�E1�1��p�����`�m+�e1b� ��Tv�ej�""@�>V�� (jP����<}�R�B��r���F�Y����&U�h�Dd��V�˺Ŏ�b,e�4�0ʈ�oK<(�h���J���m2tp�aw��V���^����� �v��fKq�uǤ� N,����xJ]Gc��?�,ʣ��/�E^�Ob.��1_A|���&e�&D��Y.�A��k�a�Tc_��{�҉Q+0�͏���|��!��7�^� ,���5��GF�����#G#�Q���@�Q��ĕ��{����\6�>���>�(:��2�1s_�@Ժ� �|�";^�ac�~�SlA��̝V��mN��������0�d�@~�RA��#O攡� 3?�19��pj���ԌH������� j���V~v.�Y��-�e�i�a�����?�S�$������؉.�P������+{K�A�0/ ��`�@�T8��Kϓ�@K�e��$���FP�0L�Տ�6�i``72�`��wA���Rc�]~��O6 ��)4�@f���^��㓸��&�e�[c*0C��0K�<`Zh�$(@ʋi@6�TաOj�P!��5x׳�S�+ْ��]A :��x?[6C�{D��I�R:�Er�c��$���ü������9.��Xh4��+t[( �V��z��Z�i5x��h�xS/v�#o�G��?BA�9��WdE�rY�M~G�p���#R�X u���R�߶�ԕO*�l|azY �B��y���2�Γ�Y�k;-�R��ᤔ����9�f[�ӧ~J��~d� +c2apU)�e�#�h?��Hm����G�E����z�����( �M�t�|�ء�Y�4�eB�@P�įG�G�����,[��Mme)]���:����`���"����D�ܭ��HD�/���_�f�}g�HJ�H�������T|�8(���/p0í�L� �鵮�mH���!��9K��gÈ�Bc��K'� �� �n��Yi���Y�ր���dV�h��_YL L|1� G]�� �a�˲���$�\4�O|m!�@�=hd!��MF����?�LE4�rm� b��^'����*܁�Ɗ.k���%�F�4b���F�G���V�Cn���V��e�x��!����� fC +|��� %�d(�6�D굁d��{zș7�'e�@��E�:U� +_�dR&��F5�~�"�~R��%(���J�K[Ry*Ôx�!�K��'g�L���%/d2� �DJ�EsY�����yN��VA�>!%� %R�$�Mi �˺�˺�˺��B����_� ��s�\:d|x\3�<��\(hAS��P���lz�2���d�/�.�<��� ˭�O�7��9��C��L*���$�G\���W�گ���_֌��0^�vmUخUȺ*Pd��U�%��1�7ˑ�A���� I T:(zv:� !e��u�= +7027�euR{5C�t��y��V*l��� Ob�| |��|�I#N�<�����!�)cB��G�f���o�0j@UT��� j]%���sg�d6}ŝ ��Nس�l�� ur.��f�#� rS�\�Y��▝�Bo2�Q��2o̾�XO>(�x���U�d@����l�};�>y���:� ���?/��ȤF�,�����P� +Ny�d�i���� ��������� �lp +�1�d���P���c�|���e8vq�������E6Y� ;��F��� 0�ˋIUN���L�����̓���f9���U�| ���{�� ����C��(�h�!G�`A���v̳})}�tC�� X�4*_�Vձ#KO,�����f9�NZ��~�q�e%�O�r � +�!$����WW �[ ��h����mS�njK�P�1���|�sL��_V��Rp �g�J�B��+� n���28���C�|*�N3(�mNJ@u�#'�첸��$���al���l�q����iXR���XI��a��Y����#`���r������'���8�gR2°�� �S��S)~ԣ��R�` �&�1ҳb�Jb=�Pʑ(q?�_��3^���nO#��{#��8�æ�۞' +떝&}��d�����H&�wD+H�vg���xi����he�kF�<;�m��:���~�s�f�������޳�,���v�xo�N@���WSN1�>V[,�M���IR��A�\�z�{��tU!��9�RN ��M=9K���Su�u�)���_&��*�?1{����8�p[K^x[/�������z5��Wv�#������i�R֝-aȌU9 +Õ�ԁ4"q� s��6)��>��͊��$�����|i����a�w���$mZ9CA߷��k��1yj�D_�Nr~�h�d���BC��k��e}�GdP�����:��ݟ�0��~R��{Y����W�\Ɯ/��+Xo� ��� j��ί�yJ�oC�����@ǽ>^��� +�'AC����������ϼ��Y���1?<�!=lɀFX�`|l��Lӗ=3��'���l�@�qт��q ��梣������ +���U�D��$d�T��p?��_�������l��_d??yb�?�r��s�y���w� �w��vz�a))��D,�����i),g�,]�f��@��R<�~~Km�� {A�����h`GSЍ[C ���s��Q(}?a3�� �D��R� W� b#������# ���)P� O)R��~m�z�O��Ѭ�|ߦ�`6��� <��t��j>�X�2��˪�>� ��� b=���A�+�D =.�2(�-=B�^�C E'n�e����x�j[��}E�6�u�e�|�Bq{��H.�_�|���/aɿS�%�s�>q�Q�0� �Y�.K�ܨ�q9l?�JЕyO�Y�_$� +��ϥ������5/��5�J4BO�,�ťA[ ���>��8���}��Ѕ��:�h�� � �(%p�������^i?Sl�eM* ^��`�� +%�d���"�@{J<�MH���m� +��XLsY�J{��I�kJ��K������$��d�Dfj�#���euY����/�n��y�ß2 K%��I�r�(�A�T�DB��g������#N7�Fp`��𔥇��Q���ɒ�)�.�d��r���RF��5���=����/�O.��zN����+�ja�̵������/nFrZ3܍L�w�;e�}>3lE@HPH��Dj@�"���l��SG����YT�C< 3ӓBp`��=_et�x�#Y�*��e[:p=_8� +�ɀ-3�LV�e垩���vL�S�M����H! tC~*5���������ڑ�s ����O�Y"#�����]!AJR%�YyOg�-.O\8�8_8���h�,3��U�<|�����j� i��$ V�q2%�������o~��A?9��WA�F��4:ԖP�Y.�C���#_8-�����h�;�P�k��j�˨�AW*�Ӡ<ސ�^ �1@�Nb�+���ö��ܹ��v��˺�˺�˺,�D�*��"��ŴR�,�������!p� GA�/�:~.��` w���(U�{��f.#N�R�<�H� m��ty��餒xR�F����~N�h�eq���CP>�u4%�y��H��x�}5Y�w��,Z��J��{J8e���-�s�+)�b�Q]OpΞ�{�p���%�A���#�B�PQէXsY��̕�z����u��ZvJ�+���}p͉�nLI�s8##s�E�0.�;���7K��YKl�e��K�I�&�� ��U�w�Sd F����d�٨�h��2=J�I*7�)B�3� +�Q&����� �i�R��Ϋ�`Z-��Fp��ښ[�߬�������4 <�<�;3�%:��1�Y�J��0��1�W���OU��P� }RS+�^J�-�R�H����u?#�y+�����̵���1}SvRp�&���c$���~�"M&�Y)*W쥫\=a�ڎ�W�R���A��6�Z��鴆۳q ����x$�����H�n���e�r�����N��1p"�v�i7�_�I 6�I ��@ ��:<�m 2���������*%f0d�P�����YP��owf;{���"�a���J�3���}!�+�G��_�:��6��=}暿@㚝&}��c¥��&Ge^8��r\b�m!], �>]F}t��_'�H��l^JV�����Tv���sq?�����f�u� �u]�� 쮞@�J$}�(����rbM&��M�͝�'�N�4QO8Q�%�p�L��\V�19K<����p�Cs�-�յ3��;����d�0�����4�d�,�Z�����^;��x'$�ǩ���t���OКA��xF��:>���X����˼���������������~��|�H`��xנ��$�MO&)�vD�,�� ��(g��3"7x2[҉��4�"��t?m pHQ��^���&8��FpoumCx�+a��=�|eztD��6�o��"���6���I-��zE_8)�[���t� ꯻��0/��mC*�^��C1.f�a\ޤ /�/$�e�_�˓�!sO +��Na4J��s�H,3�o��#Y\ �����RJ�R�(�Ia���ڄ$��$� �$, ������9�̞�� +nY����[d��� ә��䡀���^he|و1XYH���R��NiF��*~��H�������ʄJ�X��158d Z�3��5%`�ˎu �CC8 Ua��(��Sp7���{���zf-tS�dHy �ԈQ�������U����p�S,���ڛ/�H�C4�h���Vc���, *����9Y@�|jmB)<5�8]|�h������ˡE�ȌP4� q��AwY�S��1�4�A�ȭ9�I�ִ�@�I�������r��>,&x�Ɉ���D�Lй�����K^����*�ޅ��t� x�2�'UظbB�)p�sY����BZ�i�2���sF�/��G����R��,Ҟ*%(O�����r���R���^�H{.X��8L�d�p(v�5J�4T�W{h��)(?�O��GB�'�ZU�q���Xt�s�e���f�}�z9�m砊]�C�.�(�j�`�"�"�%�6Ș�}Y�s�;�'�x��Ro.B�|m���r�/hL�,�JϢE���㺣�d��I�=�!�֠r���B��`|�R�.��P����%Tٴ~���E���@���W�A���[�s����}��f��Q��˂pt��U�o�[��.;I��A� ��`$@�wn�t�s��$P @@�V�4��p/'��C2LB -$�A@E�J"@h���-$�aE!� +B�Cb�2��d��� gE�/d�育�j��4��MCmp z � �R/�N@�<�,��N@A_*a���8hFC���^��2��Q T��yVu��0&x3�rPqK����(����JX7骫��"f:����VH�{Q� ��Xt@5�R�( "�"�2�Mp�K l���4�� g r�H�����҄��u��/�R!,@���8P�QX�ꗅ���rI�<��� VH�:�p ���H��a��u�q�Xk�B�A_��?U��@��꩘¬*�,t�����oH�?�U��R��w�������RC�3P�@���k슟���@��`1��9�<�Yٷar@�� N]�T%ұֻ-�,(Ѹ R<�!������*���8���.�?��8�?>>�/TD~�f�j�u@����af�Je�_db���Յ� +և�bqYU���^�.�x��b���[^O�Ȇ�~�QH�v$��m s5�����e�x�3f�٘���z]�9k���pH�p����9WH�u�����ƭ���5�l�s"^���O#��,(����,�9��T�Y���毘�O_%*A}o�J�,�~vlk�8�Vd�g����&�揨��*�F ��N=p��{��#�/�K�G�(�ʚ��xR#���-ZTx�qMZ� +#e�Ax��}����Y�{�y�ު�td�ZZ��]X؈�Q���I���de��'�1�*S�p�h���<|-�1F u�6��/.��qr��һ!)u y�:)g~�{ + � ��`�ps�.S� +��V�ufRs/~�ꬷ��S��b0����Z��=P����uK�zxi�`ʅ��0�����]o����ab$TK(qKO��e6� ��\�#V锹�#V��X�?L�: iC�Z}a"Ɲ��X��O�H�B4L\窄Er�*$:Wa�i��`��$��5��dj�Z q���_M��� ��r�"&KB>� �5��T1X2�U3P��W�����LE{�����b!qU�&f%Q����^�/��04o8�[^UMȐ#AB9�]�� +����a �m|m�ԟ‘U�Yh�!b�0��0 +jMV۶c� +�ӡcmH�i��(��+���^0d(Ϩ"8c��p g�S���#��<�S��M�6F��D7p� >x�i|@t�}k�P:ܓ��ռ�\!�kOA&I�w��F|i�D|�&b��/��y���o�e��wgs�b���MJ� e�p|�hA�"��� 7��'[��a��"3�9J$��@프&9s0l1��@���@Nx��'&Ĵ��b�#&k���V�7�҅Ae͑Q�TJ�L�h�~��c[�G�O�C�a�-��'�;�1O �Z� �{��C�c���wO��p�S��d(����}ppT���]�^��+�7��q�!��B�]~���s��S��Ç����^�p +�͉k~/N�5 zխ��=��Do�]�@�;�ԓ[��>��淸��\%�+qY�?���O<��f�׃,��_�؃�< �b��#�DS,� �r���j�~� %flO�AU���ˈ�qq�`��`qӂ#Yg����8D/�(�H� K^ш��� $���/�/3���b�� ���g\���`�����Ã�1���\�\1\�/� +2�P>D���k&D��6#r�xP/%r�, +j;`�N��X�c;֜�kV">�A�c=SnDm +:���bgx��f�Tc������A2Is��� +�#��f�-zs������B��F�g��du��e�U"���zx�[>)�I���� �������>��V��S���Po:��v�)0��(s�^Y �铀 >��r8�Wd��Mb�X�������͡��Y���|N8�%Tv4A�� �S3�nN)lО��ĆV�.����� ��8QR����b��Ŷh`��힛�.I�uм�صQ#�2_ +E������l���� HH0;%��RgT��l'$h�R�|�w�$5����)D7*!z}V���s"wǶwZ�ѴdDd��� 밑�T�,4���9�3��S���"�x d``�< B�� ��#�+��}</�`�N��f�A&�Qֱ�YFH�b4���U �Ú�^�U��Cв9!(�V�(��n%�=m��"0%NjJl�A*B+'�xl᢮=hњ���љ���M��`�)�Ӂy|� +ٌ$���C��nC��)���,�@���cj@C�����y�-��8GRWQ+�Fm; ¶�+���^�1>`e[/��&���a�ȒnP �L����CVu^��%��Q����U!����W�3姓E>�$�0� E��*8�XD��t@sʴ�)Ƴ�/U��ڔ�U�,Pk=�m)m���]�jq�����@/N���ل}l�u���O9 ��������""R&�d����8V��)�W,W@��hl�P<����!1p�4�H d��I�� +*n b+�Q����n{hh��s�.�3���`^� 1"5s5>�rN�R��N�H������S`����8!����U�r������6�sR��L��H�F��7M�u$�� ���q �-{p�GzJU��]@�^i��F����x$��Me�0yEƧ��C��R�� +��K��, ��\j��� �B�EƔ�D�'�C�S�l\B�I��# +5�g��Y������h���p9�R�B%l&� �l�� ������e�� �*�I�Z;%b�7�2���e���K�F��*4��/oѸ��B�qŢ� .���R~��^@�xa���3�>����X,N�*��i���Rr�SD#Y�0�`5D,m7�#m�B�I�������o�A�[�Q�����4��*l�q�9f�^:.�F��L��`X�YQT�Ԧ@�^��H~i��� �#� �CY�����ŴV���Ah�: ӡ¨�R*�����^������GQ��ns�v����� B)�A�OB|�O�>pP��J��4ܣVG�H��C� [��R2%��c&F���n�'��LN�OѢTNe���M�4�`R���L ����O��J��;���N5��I�l�$k�s��#g)��0FQ�5�D�Pd����#ݴB+�4���s�0���> u[X�H~W(�)IS���HE���jx�P%�d\թ�X R ���J]Kda8��qٞ���a��.QEٮ�U�>GTٞ��l7k�{���؎OFD��&��&�r� �����:�ڗ�ؕf��<0�vV�X���c���fqP��Qq���[����8���p �[�vѧ����tS�}C��=gi�~����l������wo�훆 +�/�BAj���B�HA0�SJ!��� ���a�f�ie�e��<��n����3��3��]����!���Ӂ} '��%;�v� +�$2��ԉ�����L��uI���,��kl���7���=\A<����}�?~�^��J��h���c��ny�������M~7л���wԤvN��]e�h?� ��.(��YL����a{Ⱦ{�}�VJ�<���a=>|k�ekA���0��F~�n�������;ja���~ϼ ~�| ~w��d�����xY ����7���,��;���{� v7�����e� � h ���� �ka�j��'-X�c:���W���ī#���i�#s}4�8�/e��)�3i �Ʋ�8��u}��(H�"&g�Ab +tؔR����q�!R����Bk����r!(�A�8� aC" +���O�>� ��ZH|}����}�K�������-l+�Ҹ�|d���S�t��, � 5�_K@��3B��5�" ; TGn:"]���v�: ��&F��g4��lM����v|���\˅i�b�4w�#�e������ϫ��ף���Ѐ�gS\p~D��5��05|�(x��#��<�t�L�+R1I�ArzT�:Z#-|�gE�<���K�em lG%j�� R�6 +��3R9.�.f�~,:�!(������(�ċ,~�uƄW ��������R���$G�{v� P )��ӦT$��>��B�ٰ�T�z�v�#� +>�"���I�N>��P���G)'/�U���U�d)s��T�׮�Ӥ�o �!?���&���������y���HН�a���j��� ���\��YU�J�v�Rk)��>�z�x�!o&.ɀ�.�>�!6�v�Ģ���(�������xF[u]����W���YYT����^�oq�6��V�(,OXC����a��Y!�3��{:��A��FTMB�0��NYxAx�V��0 ���cI���YX*#�J���YQX8�U�R+���V؊��boA�m?�� �V$��� ���SH0i�C��� ��A/ij��4"��5�xK���ҍ3��b���Z�8Z��y��CT!��@��� ���s���+�b�we� w� w}g{����p�ra��xI���7�w�&��2\#�Ԗ�5�w�P� VD+O5�:n҅��(�X)�VB�F��� ۱����_IN���D5�dV�YeZ���+�������3B�򇅀�62˜&3� f��@��f�ŝj�� �+R2�G�%�; -E��d��� ã� w�<��p���P2�D����.�΂�@����-�\dO��G,��5`Ѭ5�h��5�z"�4L�Q9�3�Vdm{R ���C|(��x(8�"�ϻQ3 4�b� �\LNɆ1��s�XZ��f\���q�V��x���y��}0���tl`ͮ�E��"���E�Lj�� ��A���A(�����@:�U���K]8�j���l�f�<�%��S����S��y1�����a;�j�X��N��Ξ���Z����@�Ht#!"� E�k�|�9R2eq��{#�d q+�TIY6&�-xSvCb}@D��vDwr�|�ێ^hm/���M�@L�L�w ��{q\9����^@��q�E�P33�����4�8!�A9J�iT'����D���+��D�R�{⒪�D@V���]�[��V�SrZ�&��(k�I �s��K��/t�Ӝ2�ӛ����v�J�� �w ��B����v����D��.��Sj���j$�,T#���p�*sX�,��P����������c?�c��v=�a��*!����3���L�v�������z�vm߲=ei�}�ٞoy����`����wh%z|>֨cڬ�i�a�Xb�ڤ��O:���L���vr�v���)�WM`'ٚ��yG����;�� +��vA b����������B�3� �q������O�v�E��SRc;�~��!�B� �%��MK�!�.:�]Â{$�@�p`o%o`�7�� �;� �)��E/!�o:B`����$�]���e�8R�@��v�*��������kt���K�LD��d���(Ul(p��G(L�� �mFf9��%:�SQ|k��Ѻ�-l��8�Aa��YX��F��H���;6,�1# ܄�9��ع,8$��̋GON<�@S�f�؈��fʑUwvG}�X�qHd>��a棡���u +Aaky���WQ@2�C���풰G�"��v��.S7;�ҵ�B� �_���NI+�(��/}������|��D�a\���F2 �����feY����A�)=&��=2 +{"�1�(���!���C�������0 +��~)���%%UG*D i�ltI�0��N�ٮF,z�^�4�I u�>�껶kG�����|����gO?wh�&Ĩ�@JTA"���B��"�/7�!BT��X۫oT;�3z��&_��/Mv�)=�I`ZL�ˌ�r�l��z� 4�z<�����uVuX�޾�ٱ�u�� g̎C���y#�Y���R�b�Hq=�S����Ǭ4xlV~@�9d�o}�҃~��r�I�#����n~%O~� AES�LA T)�؋�*Y�a{[�u���쮐����,3fP� ��f��O�>���GX�0���� +hp��`#%@�P0��2��zҚr�nr��r^6թ�U�z�����*�B��%y�-�%��C�Y�Ǔ�R���TeP?`�k��29[�Lh�ڀ�z%����y�SW�����] +�O�^ +B�k$�G���y�]������}V2�d�ssj ��G��H�E�T�N���T� +_���X7�e���:�m�^ Kf5��̺�܌m�ڌմ��:vԷ5h���e����M���T�zI˜� r Ak�����!L�F��#� K���S�N�Y��h��+ y䵡B�0�<16ۇ���*�g������*߶�h$�n�H�͆�-ޡ@�ZѦ���,`3�A>P��3��{j��"��$U���S*`@������xO̩��X/��-<�cW|{���H���T���p���� "r��r����ߏ��������\x�����x!��m( +���N���f0�v�2{X�Z�Q�\/� 2�<����*����;�ɰ%���@��6�1�km�nK���V����|�'�bm�����C��B��� @)C(S���bD�ĉ�F� V��grti��<�A�d��vy�aU��m���'�$� �qZD^��H�6�mH�5�YL‘�Y�l�`��un�ҫ�x�A:%�Z���y�q{��9jr�Y5��6���gY�9adŅUД�dvA�}f&��4Q�p��x-�['<"e# ��6Lj|��"��� ��A�8I���+��`DF�K�3�l�#b�ӨNK�����vCq�G��,l�k ���@cu�����5��2��Hu���F!�i� �B���2�Y7��G�'V�;� �C��K�@ �T�m���\� �ʔ(�)�B��%���ʿ8��P�ù����(E�!Q�&�� ʈm�/):|���& � � ��vi�21����"��I<���UQ�H}X�cTG,�Y9��)& 9�Y��vuc�� σ"0Ua�h�]���.�_���9����T�68N�����J�Fu�� y����f�|��LpH_�bd��I��xC�W��ׇ=L ����.��Cq��b�#U#�/a�݄2V�MB+�-H "�����à`� ���В ��cu}vp �Y�4{�a7�sz�T�b��&�r*�ŦX�$����s(���RI����A�&r�Y�f�I��f&��qpX��DI}H��`������G4 �\؝X��V6��?��=�-��b���aV�CZ@%5��x!;�HC��������p^pm�\H��H�Ĉ�*��\(�)�4B?��� +:>R���2�����B���W���&� ���E��"2�A�B?Mh$�SBR)� �*�(xvc�o�� O�M��e*�P��d �gb,!N����=Zl_U{�Z� ��\�U�P�vG��U��/n;�v K"rJX�R�8G���` �BI +��tX|���?F�sp Ȫ����� �� �/��p}��(�1"��"�p �@ T��ҒWc�0��z}����@� +�$�NoN��`Q������?����n,m��������R�øa�k� +��xm��Q2i.��B�'��}�� +Ad4�OQ�.B���'��q("d�-�闗��ʨl���s1UZ! *Yj\�� ��ļ]ak�>OP��z��_^U���L�G���&�XK�[:�>�T��`Y�$���7���dJH�X�:�B�m(�����rrl\L�F�!g'}h�)b�Ab\$�fN҆��Pbo��L'����&Z�5',�ظb֣�p]�y��LyaaID�RJ9�#��T�&���({�U(�RyTX�EA2D.�y`f�yʴ���9Ì��M4�'��K6M#�J/�F���!�Xu���v{b,p{ ���-��v�A$#��J@��G��nr�4��`�PVk�|�l��nI��""�*fC8�0����D> �Ժ7`o�g.`��f"�:kl(���(�\:ӫvXP*U��P��=+��L���k�㓥�����Ϲ�)��W>`d!�*$Kb�dp���� Zd�NW�t� B��f�(tRb�p>y��d&�3�^���C�PCuHE�+ DRA���� +j+e+���yl�d�s&n��0�,�� 2������E/ �R�K'� 1/2'L`ԐB���x���p�s'�F�)�+��,���,��G�� +�!R�y>b�q��1���"rӦ��/����:q�Tb�[Z���(�������;���Ej{k@���S�ۨꆣ:|֥xR���2Z�p��$� ��(EI,]�Y�R��7���ͦ�G +�@�r��L[��"t O)�W>���Aw넄�]��nR��=c_��p*�]����]Cٮ2�.OKm<@;�h�>���"�8�R)�C�%M�Q�! NX�O�Ǻ(2 �P�fXSY��R��@U(,>�@�m�ʌ2�Iv+��8z�jm����^��WP +mG���R��Ç���?f�`/|��J��l� +�Ij�{�TJ�X*ԥ%Zu ����"0n::��[e�rf{�پ�p��\u��<�l���c�������W��� ��/��v�i�$w��U�Nkп�.$����3G��NxI��P�j���6��\!��RyNK��=��`;B�`�L�`�[a�Y���KS؞a)lo�^�^�tپ��l��E���(�]K�w�����{>��@.�?�пύP��%��kh��c���?,��Z���0ʖ�W4�������a�����.o���=���=`{��=�±���`����L���Nj�vÇ��l"��_��v� +��&����a�;�l��l�9�������Ȅѹ��/|�v��a�'�a{Nа�n}lTDlWk��Q����b���خ���.�ol�t8������:wa�*���m�lW}2ٞi�lw� �~_ �>�l]lW75�b!�@!���F�K���k�j��, !yu��8���V�)w(d��R�=�bȿ/D� G��p�ބ����|MB���6�T��]�+C5IJ ���f�|@�ϴȗ C)s��ڣh0�H�C�"n�`a�ڪr�K��O��D+&^���rv* 7(�q^J!��NiXՑ�����Ȕ���2ӏF?O �Sф�T�&ov�x4SݯW��QQ�0Ӣ}? &� �@����82��@��/��"�����.*��1��#�oE�����j�HR夕�"Sj$�lZ6|FB�Eq�WS�K7�[L+�U|�������M}b%���BE3]: ����;�k�QƜ4&pL$ ��vR����g,uꎼ 65���j%��”,��M��/s��~� �" )i�jg���Ű��H����EƸɅ�̠��J!���0�j#��ɐZh �p0>@a��5�qɧ\6�̪�M���MFb �,h�����Kj7/�� ׆u6�u+g#-%R� �p���~K�vXR#մ�Hyq- K �.H���<��7� 5#�9iR�/m= h���`�V�{x�Ɗ���Y��Ti>d�V�'C�(�!r��6F�&��B]������"�����x"��h���`jv\4涓��8�w5A`�ޡo�H�{ � Cϙ��� endstream endobj 27 0 obj <>stream +�3H �] ������� _3���"�Ѳ+�J2!V�<;�LA�)�b�y�6.�PMC�P��wPE��~@%����zK�&Y�j�}=S�™]6z��'�h�TSF_p�Np�>�Ba �7��6�q���8CÔ�����(�#���nq�J�� � +RL<*f�uk��k:>��3P�U��{Y�X��|*m=�H\��[��HC��f�1��l���B�[�ЦB����0PX��^xR91��|������{tk��;JMR@u�\H=sl�AR� T��W��˩%����ª�����[R�@i/w�x�[_�4`�QPXN�:� �u�7��%��VU��a�q����$rTLJ(��� �F��C����I����՘��9[X.2 XEKu`��i�[Le���ĺkź���]RA���F���u >� 0� cAv'�� �1O��&'t��Y��#���e;�j%�L�q�� G#� ZlE��XR��ı�/�$�"`'�2�� J��|���%�!�%����O�������.�.�* �x��⭞�����9�$$4�r��|YDUȶ?�;���8т$��I0��� ܌D�I���ci�θ �i�0O�ʹa��Ս�t{��(����2�� �� +h܋O*�s�-G��<`�3e6�=����Z��������ҽ��D�E�ʼn�C{�d��WP��a; +��!�&ޤ��|Z^@�F,�r����w��N�<O<�9R 2��gd�f�݊��3��Z�N8�RM@��!~���nT�!EG;b�R��N��?��S*ĔN�ە<Ċ1�/�nj�(ԡ '�g�t,^�T��v�X���t>�J{�Qk�H��^!$�����{,b�)�@�2��� �C�i�l9�*��X /�����ĉ�ql�@��I�H"T�K=� #B�����馄8ETʘ����n���!�e�q_&��E5`q���{jD�� �VsY�2�ވ�ARrpv���}njʡ�؄\�(�{� �ڶG�R�P2F��՘$��TF'��i̎�cwx<�PA�P�#�`��2 ���P�V/�S��� +w=��P(-�h=��):���k�������� ;@8)h��`�,�s�,���:��*�=P7����I[�H@�H`�MX���|^5*���������t;������&� 2Mh����6�Mh;���'av�j��խ�!�Y��J4\;�8���Q_V�1 I �Z����4�&�%&hé`�Q�����o�*�ސ��N�|�=D�^7H�^�'���>�xr贉~h�+��㉍ +SRP�I��d����h�� �N�.D~��ܕ@Htey(��`�T�3-�������I���e)�>��gR��|��`{��ֺ���m� + '��;�&&��"a�c��-�!6��� oA!�U�}t�ń;�7�̍���A}>T�T�iedP�P5["��� + +z{�-q;����J(|� ���⤝��� L�F,��c��j3��Y7��;J�W�x�c� �ܙ4�\FDa�D*Pht�Y`��|�:Y��E�l��� +��*Pߦ�c~�X���E���+�� ��g:��w��x�0R6�k������\�8�� ��؅���?��!��/"m��Lb����VQp�l1D��2��T��j�c����]�7�q%�k9'݄��V����*�>qA�����N�,mO���c�j8�(8�݇H�b=(�2�@4?S��E䕆�D5�߄�p��`���`l���{�(F�L����m��t@'�9�>�M�S�J8�Z���?���%$����k�iU���Z?�kЭ=�:� DFP��(�q�[�� +��fl25�mTɕ���@�[L +���*�f�� +�"6���Q���S�f�6F��*��f�����}�Y�����sH���e�iR��^0��sy��7�(���eV!Bo�����-�"�_ZWU1$�Ba�r��`�TB�ӓp��CG�ٷ�� b�| .� 5Frid�1�������Zչ:L���{��z{���n���sVj� �i�qY% Wز1&�K��8fe��Lg�F&po�N�qi��1e��|� �|:b�|���|V�V2q�T����~�<֦E)�lD�U ��r#��� 2oW]�n�vnw���mF��3����g~�n�겭��Wk��W�ԜD2wN�G��G���A@�����Bd�v�l�@������$qJ)�ӘD�GaV����W���ũ�`ل���E����S���3��7t|� rD����?� +i�8bo>U=wF��~�G���4`r�4$��>�M��-���ֺdg^3�crS;�{�r=�EmYBG���*��Y(�a�V� (lA�UG�� +��܉�;���M���/vj��p�?�V]m�/��;n�=�qyȔ �����!���)i:�1�B��ԙ1 *��-T� )�D�R4 +t�^���uEX��U8�8�b���:�hA��?~��W��W��[�r{���v�8� ��*�G�}@I/�Q�bJ�#�\�k?�M�I�G�CH&�h�VW'�"�Ł���@��0�h���^G��SǸ�A��8��'Q���D�]�?�P��]]`����m9�.A��}Qp��"����g�sl&�D����J����J%r5 +B!�����韎@�[�l��lG�N�N�l�1z�� ��_����!�nj����x��0�}�9ڎ�ڶc(q�A,I�#��+�������� �lG+���,�&իA��w�Y�Rh���ֻK��,2�vOG��� ��!��V!�g#�]�$�?��9�΍�l�[��$�������k�`���\-���h{��&<���*�e$�S�q�V�4�>��>��;qZ�@�n�e;�Za��Xa{�IJ�C d�� d;����@�]����"�l'�B�o#�u�&�G��w�=�;���]ּ����}�Mm߈\����;�����X��v���V� Y���t�Td�a��i�}e�]Sd�}�e��6��G��/*l/xR�C|�������e��z�����]��d�%�W����+����������R�{�G��s����@6�� �� +*�k�G�p�*w����1 ��wP��WPp*H74(0~Ȍ���F����QM�:�Ґ��Res� ��Ҵ� %��v#2�_':�Ҭ +9Eb��Ӊ���_��=>\23&c,��P$݃3��+ �շ��;� Q]�CE$n^�=^^���t'����L�Ho�����y@ r�P��R����S|��Pg\vO�v��8��YNj�*u$[G���ŭG �������)��CF��RN���"���#���Ȕ�Ţlb��:���*f��"T��%ur���>���,d���a�h��w*&��̡W��^iI�_�VxsX��C"�|@E�;� �rMA8d�Pi%k��2d�`�%�Z̆A������J�P֍Qi�����F���+�ڴ+ˉ�@��/��4����c|G3`\2���B�;�W��#.�c�*��{�$%,�*ԜȔ��L�p���:�� 6ɩ�|EG T�^�F� Х� ��Jʏu�Q�=M+6~������D��`5�h�� �"_)4(�A)1J^����pte%���49�Ag��y���kF��#���E�j��-���B��C{�CZ`q���`�̕W��u��χW�R�������� ����2L4�}X��L���J�F2Rb��Z4&d��/i :mT�I}@��� +wTQ��VȈ ��k�V�1����Q���%����r*���_� +�E� +-$��a�ڏ��E����&ٝNW#$dǥ�=��o�g�V���映�cYߟk�S��G�)���U�R�:2u4R�4��X�Y�4Ȱ������_3��7�hq8�H�'"�\��@F�,l'��O>jo�j$�,.��t,Do�A(�> �I�i:��-=s�P�5�{�񁋖K�m��Z��� Gк���������rGڨz5z�%cB��� � Q7����ack�ř�g�7h�0������&�ԣ!HG� �2�U�e�� a�K:���S�(E.o��UII��j�]�����Y_���Z����_�c�p��H4�OtG~�yN8: +m|��>�H���� J�.:�@j|�KWl����p��� ��b1��mhO�mR�é�#ͮ@�.�vT ! +T_��N���������% +^�ƥ��d�g����2�/���>p[�`���{V 2~�,�����Xm��\��S�����]&,�+��j���B�+���Z�f�|{#����KЉK*�!��C,�aC,�Z���<42*���� ��6z$�,��C��E��)`!H�i�L�g:�3 s��Id��I��O�����,�-�g 4��*&�E�-Eؘ�D��xv$����+@(2ƪ�-��A�_��$Y��*Bb�2O+sQ1l��������e��\��P��`���[o_�Z��fJ8�/�rQ:Sq�4!�`�%W�h^� �tӢ.������`��R�0"�ઢq"L�� +�v�1x̄T��2c11�Qm����3�� $ZW�� +O����;����+^�Gb���j�B\�ר�mlT�*n�j����-��!����H��4�B�Z��ӆ���^�p�쐚��Cն`.!�]ij +��H KH��GS��PT�1�v���vE���8�&�IS0P����!Q���Ei:prll��,O�r ��³�PE�b!-*!�nD8��k�,���Y�hB�K[Y�0�%5K�g't���}�L�ʅa�}��>�Vݮan�V��V� +��M�`�ۡJɷ�=/w ���h�T�ؿ��H <&�(���Mjch\h��)���q� �C�(I!�U +�rB �*�€��t"ml��B��r��ڹo��0�� +��v�J���.���$��\ж�9�Z!NDOxv�PxD%�`iB��'�$��S]���!�LN�)�P46�q#2��Uw���6k�=�%HD �M�qI}�H���;�t�v�g�����vVF���XP ��2� �T`|�P�͸h�,Z��������p���cu�Q��-�ә�|�J��?�dG} n�. G�kjEv�<�%}�IhN�_�*���!}�G��vHe��ʲ�-��X��(Z�R�p���9�F���qD�����#� �.���4_�5#R����s��yD4˩S.L��4N��s�<�,B�!�U+Jm�ՠ��V�w����O$�vD�v����p- u�O:�F����$ +�:���gw5��-�B eKp�|/"C���!�3Y��Rj������6�#c�Q�M��gA��]�'����I6�^��)�5�#��h��;�����u�/,�1w������AV����ER�E�I���r���0)G���\��4��@��� +�c���e� ���t(�8���t��Ȣ�a�Qu�bW O8}$K��"?޾Y3��� �~ȳm� ��ah޵�2 +2 I�� х$P�R�U��R�[ ��XW�^L�^1��@3[�Tj)b�J����'DH���|I�,��P�]�ͩA�^)�:�����/|���޾��n��n��@Wn��3���x�l3\//,����.5�c����Bj�i�0ڤgl����e^O�a\�@��Xɇ�h���%�"#�.n����j��=B��·����@��cN:��h��B��Q����x�� F{����ό9*� ��M���p0l�up͒� ���S�����.Bj(=� �X�F��q�J�5�&�L�P��b��4v|u9����>{���v�#w����j��愓_җ +�amBB#��d����`]6<��� ��qG�_X q�|H�΢P�Y��n��4�+����� Q��5b٢����]����n7�[�Wl��ON�?@�݄�U}:�`��<������Y��L$�L]�G�f"�t�i��'�%`9=2����:�P��rUU >���H�l Tl�4"�^ʺn��E�3F�n��n�Zt��8 +�S�˶7&m�C��[T�t����e�#t�� �t6 e|J����Z�4���s;T� +ꤲT$��K+�`*�%{ ��Jj���vWg��#���ˉ����a��v�b��yxUJ��F+���F���Ƴ]�lOA�l�JG��L�l5(َt��"�)�.=� �� ����ƪ�����wTm�ltm�춣��/���N�����,�{�����T�`�����Z Ν�\�v�,g{���~j�l��8�S#C��l���l�9J�+T�l�1�lz��1�wm��]�J��8X����ӳ���8n� �������������{!e�����n�,�;��m�ӫs1U��B�g�i�-�?�H{)�N����GEBՑ7��! �D��W��9�6��0�� HIeU���u�MA^�!��V�_+[���� �Z|ϼyp*�է�|*��\�Hxig؊0��QD��i�1��:��9i%ˣȔ'O(�$U��Z�rĀ�f��T)�4�>(��`u��h0|sR<6���V 2zE� Z��9h��Zl��{t�!��$D��@����{� W�/�Z qJ+.fΧ�ń[�ɩ��5?��ᯠRN���l�Y�M��֧�qOâ���i|@E� +��yՓ;d���v�a-�/� �^%�j(X.��VF�V�[J�l��)A� 3k�b�<>?���'��Y����J)����X �y�19Z�6d�3��^QT�� �/�ϼ�c�� ��S�����$��2H�=Ȕ�) ��*�s�����'�{nV�٠Y�SN�,�^<*���tWY�Z�n�����j�6�M�G�k8���2M�`����B�Q"�����+�N6 +|a%V�0��a*�##���bc�$L&�T?��# �)�� Ty�8��G������a�aSY�a�2�ZҐ��%��i����:�k�Y +��5k�[�h�mvl܅^p�� ���I���0���4���TT��-[��dX���r���:�"ޕ�)�>�[�.�0ow�,y��l�MA����d Fsr}c�J +�@T3��˜�����:����@�3*���y���o ��y,^V�XŊ�2 0"g�b��a�.�d)B�:��2�py�o�� ݮ�]K���_�dֿ�ϔ��s�A�g����+*�K���UY� +� + 6*�D����pT肃� ���=$�;�q3ØP�c�I֞1����y��" SiL�b �⾿.��Iq�����a`֮���_��^Ɋ�ԑ}��R�{��d��—yo��pl� �* aG��IJ!Z�F O���M��@,�A*������E!c��Y�� �;w0<���dUj�p�Kp�h<ޞKtn�J��ua� +��(��9>��A���X# +r) �����̷6�C@rb-A)R�J�(�a�:.�^#� �4�lX �L2�h%;/�Հ֑ Eb�W��DŽ�����V�;�a{{��p�˯4�������~��-B��;@�N �nGD�P�&�9bH"S���\�&b�J{�@٦� }�6m���C �K���"� 4�� �,�=�4�&5��S����bl�}cH�b3��n)8�Rp�P�?�:�?DZ��`�����ab!�J�*D�F���3��(_�ػ {�0�A2�����hk,�U�d>�� #&9�ƒ�Nx"�U]�Ľ��}UX|�F�y;$��{�,D֐Y��� �����Nx��b���%!�t=C�k@4�+�@�nA��Q]<�ɉ��TFv�t ��ƒxC�ƎC �,�C!��dU/<�^�p����~;F�t;���=�) C����B�Er0������{3 +��Ѐڡ�T����_j��*e�j�a� +׺�*a���YeB�=�٠�������Â��bf;���*��혟��ǘ��������fp�����ntx�9B���� Gl��7p�x�� +���!�KB�-h��\B���ŕrlF��Mi =�g���h�T9=�SDT TGnj�4�Kx����v���v\�l;7�5G7�5��Ya ���b��—�z��� +b�Je[`D ��$��n�40��r �s�vű�mx9�� <5bb��t&k�d-���z��h��ƒ�)�B��U�K�(,� +�����O����b%���t�K[DNtu������{PI���e�P,��'ri<+�й��:#���7~8i:�qCz����h��$�K�u'��Sp��J� :%�����]��^����Rap�c%o����r�B�4Rrv�ct/����`a”���Sh8S��Lr����t8�KӱG��h �V#2F�چ%Pm�a��i�Xk�Fv ���������A��-���?��R��������J (�G�b蚕� B��xM��Md����'�)Lk��$\�= #���E��^�.�w�6��2s*_Ny�K�Q^&��m|�h�|�D4�v�z~;H��]���^�S�����N���\ �u�G#C�|��m�2��J[P�R�Qӑ��a#���M"��'1o& �jL��681J�u�75# +��P+���ַ�}�S��"�������y{'f� +t���>���ɶ]��f��F��+q8 +��a^<�H��N+�iE����<��0��E�f�U��6B�V�����"�˹j���e�Xl Vͧ� ��; +��u���A�����������)����n�vF���@(��S�3ݹM���I��ե���N +W���� U���ނ� +�ci�Z1#˴D,к�-�+��> ��:��1���A�vӵp�6x��%o�ݣ~ox���èۿd�v�s�DgF��cg,���e�L]�/�bœT����/y�ź��"K�s�P�/�h��X���4��km�\ڞ��.��m/�����p�j3���+���H��n� �.E��ai{ⳖD�W +1r8V�R��S��� �XX��������?�4D�Ε���v��S���EP�5�X�!�C��I���vR��v,r; +T�v����š�v7����p{'^�=bq�}�k���+5y]zp��I)@R/&�,��Ӓ�������C��HP�}#�Y���:����_��C�X�?��U�]�ڵ� ������D����p�Bp���D�vl p�fli{�sھ�#��U0&��8E��J&*W�[�*�F0̿ۡ��5��=��q���L��M���= +��-���h�����>u��������^2���2��]Q:��؍��Zh�7��_�C0��r��PU�ӁU�UN�d��3�������(�ޡ��?�_�'Q�w��W\��q������(�Nbvm� ����m���#)������a�5/��� �� ��@}/&�,�t�m�g�� +zY�mf�.-@�+�"OZ{��nՑ���!;�"Sf�P6-�>)�A�BH0�~@��%5!(o־t�[o�-T\��=�ȫ�������N���8/��3yhF��dJ�@f��  o�3ƩZ �פ˓%a��,&h&�fk-�%5}ivS��4���Ň=%<��0�IYi������9�$�녊hK>��X���  �B�r2K +[��X&�q�:�EypH�!�� C 31�Ŕ ��!�ZA��� � +*���_p��H]�z햅�� 9n.�RFI�6�����R�D������؂մ�ʊd (=�&kg�1����ў0��"e�$,����#x�3�rt��xJ:_��Q[㚑S K�K]�[>�m�hˋ�,:lX��H5����RLk*H[�)@�� ��n��~ibR؈/�&H����.�f�H�}O0BfS��<�N�l<�*��`�(��Qt�M��� ��R0��<�@����� +� ���W�Р�v6Ԙ���↨����]���aƩ�!�tE7w�F�� z�:��i���� T���l��Oَ> 0��]Զ��l�-�n�;�/�{Z]�"!u� ���8��,"ۉb�>t�Wg�̬��>�y��(��lO�� 4�*_P����(�A^o��DE���Cl �=�R bH�."�� �=,��?D�J�訜��9�^SȔz'�ˆ�˟�H���Oua��^�TT����g�Q�tF�^Wxڲ�� >�$��P�C��1{Ɍ�lt2W��,��oܲJV!���9���w1���8b��\&(L.T4+8�O�����jng��´��+���L��k�l}5��J�*P��l�r ���rI�2:K�F)�1U�r�F���0'��Ԗ�X �9q_YDp�����E���Q����Y��7��e�Ȋ| h���B���K��U� +\��߰f>�p�, F�e*ਕ(�G�Oc��K�,���k=���"��R�������\5�=U�|{u�p��J��VNs�d�['eΌ�}n��]��`�1թ6����;�01��i%��:-f�v����F�*1����OL�B9 �؁>� �@H3j:٘˺q'9h�����1�۹�d,tF���Y��:5 +Exh F}�w���V��W��(���:�$>����0���7?�N��:Q���vq2W�Qm�d3`B�Wx*!X�b>��}"�;���ݔ�����H��� lC�A�E�O� +��b)�� ��Ջ`E�*a6&�����ZhpC� �=D�$��ؕVG�1(�Lm<�j�T���F��U�����N���I)��_H:�w�ip�����=��\��];���f�ݨ*{�� f�M��+-�T�n� ���C�V��p)X�`%����R=�J5�#:��FTI�,��>`��%+�`#���#<�����K����E|��u���T�AE�]DF�D���@|�I���Cd�#��ᶄO9��Q֔U>�59�D�¥��F_n�it�E��4qf��Ҹr��.����.�#��4��[6n���F�J�I*1�Z�Bņ�C�M���-��q�4�A�� .`ܮ�k�T�JK�Rq�P�B�]>t�X��"�8/Ͼ����jd�H�I�`1�GT- �����n���"��W*n�M�X|��}�E�vnF@�$Rh\2ts@�6��~�9!t,8H���L���&��,�t�����nd~L �+���U�v(�$�R� /���w���7�.R��݂�p�(o^�,Ѕ���p�$����8J�Zp'�<*B�K8���L��:`�P��e`q[�Ŭ`ʡA�2�'B��02�")��JA?�"Z+������L�i��"C��L�q�(W���Ⅻ�@�﹂�*G>�fdS3F�'Y�0�O�r7�B��f�54p� \�|�i!��Ѳ�u\�ӧ��hkEx�{&d��aC+�� ��ѱ%y;伺H� 7*=���q,��D@8��`d.���{Q��sl���ݢ��ʠ̌1�b�.���Pꎕ}��Œ�z0�1ɥ�щ�-�� 5�$�tP/c�b��6�Ius�2=l�2=�`��p� �� !ЅILtl"�������F�Qx$;aqq䟑ϫ�; Dz4jS�j �P�SԊ��B������4��䋠\���B� *���Et\J� "�"�fN�"��P��)�l�UwŸƒ'�Kc����,�z�p]Ʌ1r���C8��zt��tذ���x��p ���'����"!p�#Aur��EVRh��J6�<+��p����a\>��'�3��Į��k� ��2s$U�>Pߧ7@�Fi�/zo|�/a�iv�8�o)�>3�G +R� ���d +2�[m��M!�E@>.D6��I,���DF+l�Ф��&u�0��9������C�)t;�;�2oJ�S�SS�O�����6���h ���_�8ץLj،��~�9�dtJ��D�>K� +#9 u<����|��/E�Q- +Jd��ч��t�Z0��d��޼< +�eA������jMK;ָ.Aj|^!LG�U��ɫD�I�����Z n�/����K��H�2���J0W�kp�-����* ��ԋ�dq�\q1�����V2�0^�0dXQ's���Q�h<w������ɌS8x\G:�x����; �{:ɤ5�>N+m�Х�ۥ���KOmۥ�!�K_����n^y1w���Yd€R��y^����n����hV�-oJI�9 d3�l��s0�%�����s��'��J���#a�O��p��#r[H��F/��@}����!z� Ѯ�̥�̥�3��$ۥ3M�w�M����,���F�^�)G'�Jhb; bձA�5��R���V +��� +)�'vT�����-0ҋ#ZH� �-�>�$�`�ӆC1Q�U*J��Ac����v#�������Ѯ�Х@�9�<���\�3� +�������� S��!�B�E��� u#1f�BB̢�T`�Iif=�I`r��55� �2�Dv����P�B�^���ZJ�ʴv��g���%�uB��r'�uv����u]vdv�&a."��Q~?0RO�$���IvxZH�Hoisz�����Q�^�:���.��4ix +r�K��AG�V�2�PE�U�6�U[�����f�(z�'j^ݵǺNjĺ��b]��FE��T��- +�uUT����u�$�����O���:���J q Յ.D�UjE)�ge�JG���z�F�Y]n�ƒȣ��h� ����,��yu��B�u�uu�u��ƺ t� t]� t�]��>�ۮ۞Į�*���)�>�r^�l^?`E^��׫��cH��&�zo�~������Z�^�q�iL�� (�Ϭ �G? �b�e��(�]$�A �3A=e�L�m}}6�ˉ.�L�B�m��-U��@ P�g��g@:ջ(N��ɩ���T/1i��K=�*��z�m�~�RO�5��h��O>��7�<�5O�]p��BF3�$��B��8xV���8��� ƌy�̏k���%iY�!�8%��y�Qa YD�Q� jԓ\ +�34�W5��O��~�?P/Q�'��� ��" ��4�Sm^ ,�x�L�J �lu��J�>B�~��}M(�ҩ�lnP�(a#��I͊��Ӎ+��!�Y¨�"|� �B:Uk�ׂ�\�nj�.I��$�������� ������zy2�{2OѲF8d,��a~ Ix �(����d�J�����rǜs����� ����� ����R6������j9�)��a q�cai�D�o���$�5hU&�x׃�����yV���W.��X.} V��8��ut����!�V��#�� ��}h���@�Z#��(� ~���8B(B�h)�he��ص���� XB�3�j'*h@��`Tj)j�C]n���V]pZd�"\���`��i�>�线vnA�&�x� +!耚�d ?���� C2&ыx�~�.x�e��yQj B~��Eb@ ��4Jx� ̧Y 4g �hꡐ���.^�W�� +Т�g0�JR������`A(�3�4k,j�A,��C,F�X|�X�^{Ela2��I�ɘ�(,yȴ+r�X9JNQ%y����%K%��t(:OD=r�F+�˃:R�:M��Y�M�j'�иO��}��>�Z4�٭�S�햌�|J�إ`*[�� ��Ajƃ�V�� /҃�1� ����7���婜t#��(��Ig�� [FM�T,|)G�_��f����QG%\�n&(��k�]�-[=�~@}cB�б2�C4�4F%uQ�N�f-Bx�<\�ƞ�{a�D&��D��F��J����bڍ̗jt�"D:+槀~C[li� +5���U5S��䈔̀Z6cxv�9j{2u��h�ӵ�<���'�7a }�:C��m����%����$�Ƒxm�M��t<� �#]-�6��B���D$�l{���AK{�-5�$��I1v+V����9Y�β��X�����U2]��(���w1�ޑ�ݰ&�;A��8�b�A�Hw-�4NH�B��^�Ÿ٩�J�AG��x�ZQ?Y��>����Z0V���U�R����q���A�j���� ���i;��S�v���v����(�v�m��k��*��B�{ ��\�5.���Q��P�P��ۚ�B�Ē��Q���L;�du��%��������ʂ�ze��^��l��Z�be�:�`U�m9N��@�� +�#���sxq����%�!���c��0��d�'q"��dH�j�x��v��Z!����oN�P(P��;2ӊ�f��P�O�c>@V�L'�H�L��x�Z�Gm� +M�h��aj���t[���D�[95@oC`D� 䅭��r����E�M�9�s��$�@?�Rsi�t�d��h���� �����#:� Z�.��B�"R�륲�6#3�/O(���r8|QZ!|?���� 4� �V����=x$pq`��x+���e����Ú�io��d �J ��M�A�4�A� ݵ��)2� m�PJ7:���"��Tx*��P���c�[��D�&�@i�i��H�c΁;W3�C��)8ˎx!#0QB9�>�"v�����e�K�q�SgֵA�fk��E�G���5�a^a��`�,��x�/~�r�e$$������c�P�no���/l#�l�x +}�8֞8�RO�,�X8q<`m�T������_]�tZ��䰮�A�1�.äg[�_W� �n�OC�BB�)|@�p3��B�ث�9�E�`u��3Aa�������-������*%f�1m��;�x�d�Ւ��%�\��\�V-�jeh�h -�Y-�1��Ϥ/,���fA� �� �x�CׅW�i���N֨b��Gro�rp�. +���.0�|ð�$��B�D +�sK<��ZJR��q���cp\�R�2�x2�k��A8��'Sҫ�R��� ��t ���Ws��SS�������b �%���e��*�W����@�t��d��g۳ �����]Ł���Lj�!��Q���^���6��|�P�b2���S�9�r d���ίN���~?�N-2���MA��C��6�Sl��uo�ź���``1st�`�UD9(>�De �Owi���P�j�R����Hɯ�k�+/��0f9"p�m��F?����8A&3�(*�� �� �l��F�9ѥ�w ̺M?|l̉���B�R��ң��� +��x B���X�0ֺ�4J�ewp󄅻_�:��H�2�''Z�����q�j�AsL�g����<�Tz���›��R��^Ѫz�4���q'��� D���D6WD��ފҏ|�/� �4��0 ���h�w\���v Z\�����sdt5�oa���Rd&(��WR�-u |�Q �NjJ�Az�L7!D��L���V��JK$� +JxUe+.��Q$X�z7>g�.3Da��&q��Z_ �(%q�.���\J������E=����c^�8���E'Q)�yR�%И@,:j3���h���ᄢ�~�B���E1�/���뻶;3�xhh/���.���-� +�I[�����F��u����$��:䣛�=wfG2 '���F�[�ɢ�cJ.��X� �K�G>M�!�ph��Lt +���^UV��t^�t!����8@;sG|����&���̆C(*-�qq|��tX&��A�L�ԡO���"�,ރ�0"Pj䉖I��T�;mXM���K��[!y���t�C�ұ8���ʗ)�.C���L��M��.֫�p>���P,�H��ՓH�R�� я�~L7�J�nF�(��!$��A�,a�at@zŤ�IJ툩T��+S����0�ӥ5��A�r�����N +�E�9��F��@1�ά��s19?�I4}B�K�y�04�YO��*�H�6�ѝ��NE�`}��*��ڹ���X+SءP'�]�ԯ��uqV���Ykb�zc ]��U�N�R�n�p�� �\:C���e���):�NTG\����Fr`�U���D��[���z���aM9W�L��&=%T~�[E �(�$Snh����Q���� +?O���l�u]#�躤,w�P�uh��ps�Kg p�NA��R�5NJ-���R�5_nJ�Nz�"~j�u�%T����M�#R�-U�]e� )��r�L��#���G��E���N��^?�^/�@^ow���������q���p�*t]Om����B�����z�ʷ���� ��4,u�u +�ۑ^y�J�Lf�C ��=�B���� & `��z.sp��<��c�]��n׿��D�z��t}%>]ȼZ���֏G��j��eB[�|���*�WN �@sa�1`}~��u~���ɲ:*#M�TL��ݲÎ�n��o!�>����?��?�wB� +�?��LX�i֗f �)����/�e�X���0��W���E���7��+�b�9�X}#�4 �x��a��A�9 +K�=�%c��ţB~@��)�2`=�ـKI&3`'���0, �E��T�L�� &�s �'0կ/��?=R�h�Q}$˨ޠ����Ջ�3�?�/g����R@3<��]*�&q����_`���$\�ͯ"Ӟ�c�.��:h��dlF��4;������'�M��Cq�����p��m�D�*��������9���������:(�����6ߍx6�4fM ����r�vR�������Q*�8Z�� ���鄖Od'=��2��d��}��w,(�K�2,f$QCw����G+o����� �aq�1�v�����#սd��L�������c�^�s�qR��tD���M|�� 9}�s��7j��i�'8! +>@OA~�ii�I�@>��GiQPqA����H^��I���%�t�%o����^��(@�ōl�㱻PR{�p�4�~ef����<�Ɛ���O�q��׈*�$������2/�N��=�#���G��Ir��Y����l�#�$#�9 +�9�����&\3 M�M��4!��~q x D1���/�B0�$ʈ �.��t-��<ʺ�&�^f���9�$�s��F�E5�@�t0��M�ԇ~^V +ƃ��G��E7K2��o,d�ȝ[,b�xc)��&Si?"�d?"�lK+�XK�/�%s�ْ����`�Z+s<�򴞧� �J�D�H����6��A� +����'Em����H˫�R�VR�ٍ����,J]�g��1�y�A�W�������&Hr`hԊhb�(ɥ����f9)�Ks&e�&A0/L���S�g��@�#���u6��5������U����eC�Κ� +��*n��X�pUeh�U��fZ�Oi���r�\�ϤR�?d�6)LFI��i�"�\1�ߑiWj���P��@�PK�A`@׿o)'a )��*H�\ԋ�������s-��<ځ+F�7Н���;�,x;��@��:�(.�x��YRB�%Ҧh'�1���������E'��7Z����)�i��߾��9�L= +��»�����X��� �D��֍�Y��x��[��!� � +� + ��u����%V|G�@|q�rx�� �����?@�Z��[���1�Һđ�E 34wpͭ���qjs�, [άC�`��B���UI�إ�=t:�I��b�܃?G�BZ����"�I�Mo<�@�|J 8Op6�kAh�������(�)���`���1#RJ�a+K� �/��i+rR>����5w"ԻJ!D�H1�#��jo��16R$�X�HahZ�: �%4�e�e�?@���1YG�x��X��ȱF�̲��]�]� U>8� u��dj��+ !$aq�#� ��� � +9� ���6��)7ȡ�gu&>`%����U`������o�n<���� !WŞFI�J�� ܔ.֔.�!�.�-�.[@��9��3��>���L�I�,���A�sa=ah>5�߅�bR�;#f6�t�[����jQ�,F�͑�%^ + :fS$��х��XG��$N{�5#��sC����90|��*jF�&-��%�,�����z�Om�Hu�=4�E73ɫێ��e����fVz��1$$� ���ad���)G�Nf��D[�J���d�8l�96�4ө����� h$��9mBF��z�.�:-�u᳴�!�_0��푭�lN�����"��:��Xl�R�&�"�|2? �����;�o��DY�P�i���/H�����l��c�/I�w,��ú@P��র�� �Mdh|�CU D�v�b�iǽ?`����� �ruP�ȕ8!:.p��P�b"���=<��:�0lCṡ��`1���+$��KT������hOR�* ���<�P�C�<�����!Ql�!�lq�ݻ�Y"7��b�T�8ȁE��� z��DŽ�b��@ +����F���PRF�24>����GG�r,Lt �����/�4�|�/|�&;\�����q5k��;K�%��b�X����4��#�8'bU�D��G ��oE��0��,NE�f|�Q��֐��Նw�T��(����i�ǃB� H�����"���M޼q���8b��u�0;4�8�G����kܢ(+�m�飸��[<�¢�Í�T2 P�ʍ�'ai$pv���p۲�?�$G+��n��^ +d��d~�R��/���$��BO�te�(�r���^�t%3$"�qFU��9��㫄� )Ȧ9Y���?A`� E�u��!(1,���$��fs0!��W��la��Q�n��#��"!jRK�լM0f��FAy6 �H$lR��r9e��zKD+ek����*�Q;)RȥW�(��L������+2΄,B��P5$�e�9a�C�� �'�oY-�h*B!��F�P�/�P�����RRQI�V� ������/�_!��$fLΧ�P0�j1��z#ѭ�3���NEN �qJ=��ǒd:�/;��{C$��cuLp� Pn}B��H��C��r�pR��=7.�b�42T�AxS����42�(�i��gР�ζ)�f�Q��G<��皽sJ�,Oh"6@� M:EV�%k�4�p�J��;�#� �2�������ny@Ҕ�q����ø0B���X� ɒ8���mRm�l8�+s(���B��(ݓ�-�Z!S��嫟�rA}�f�B|L�>��>��$�H���K��M#A� +�*�J��.�f�%��{����X�G���{r4C�HZf�`b�Mh��p� ģA���rM���� NC%���G�j=b���AUΤ�j(ɤ�Rj=�kBC�=�$/Eu.�"�q��j�_�Tx�$ ��$�_:�"����z�M�_B(�B婜#�SQ3�gRx)@��tN���À�^��j ����\%���8Y�e����y�(~S� �E5R� +a�(R5�U�(�V���Y�#���L���jS.]�/]�z_:�a���h��'��g8,E3��䀔y� )SJ�uZ��,S�a�S����*'S(T:J�t׭ +�o�A� ++�G��(͂pY��Y/�ے���qƮ��dױi�U�w�V��+١�����|��}��2y<���*�SF��G<2Q62P�2�ꔰ(e�t[�ج<>������'"ͬ�s�Z.�gi�0�WOmf]��c�uO<�zf�u]��z�2�u��z� t�Ⱥ� d]�S���(]�\�)�]��]�B�>��.�2���ma�����A�� ��g�`�;0��1��Y��z����F,�����-8�zS��h�w{�5S�=)O ��<������L&�V� ( �@J�y�(MSo⾟"J��F����{}����d^�?x��Q�������j���� �ߟ���ڹ�4�Z�)N���֯X�֛4�� ��_>A�3�؀8Q���Z�t +'zm�w�,�W�7"�s_����� +�H@zt�61N$�K�e��N�7ͩ��糙>�B�U.��~} ү@��� ZA� ##bFbԨ�_<���v�C� 8{#��S�{!%� +y$�� ����NH��l��3~�k������U�m�#���= ��e:�e�x��L��1_m��'YS��P����5V!H]y�Y�@�n����M�FD���E�� �Gk0(���mZ�i�p�d4����/Ry;}�e�� ����s���pr�skB�v���� �n�LRϔ�^膘�a +����f����␺�r�i�GD"3P G��0�R�H�]���u6�%�Tg�`�NPۨ�(��)qP�qj/�<�ODS��eZ� IA:��R ��2� +ϫ֎��XBю�?D��ry0�b�e,����V R�#e�e�%�Q�&�y  6�ylYTG6 5����O$���t�4�B���� ͻ�FG!�&NH��&��PF��/U,�e uf��D;�m�쫲���)D(s }�).������jj�����մ_ ��:g�Yit� TO�:�$�38c�8"x~*ϋ2"H]e�%feDߍkD�#�(a�\��r�tZd7�!��a��$�drL�⬀��h*!TAq�Ԏ�8u��7��~�*r5f�6��j��Ԩ[�h�(��� �p�_@�nUE� +ڱ�� Ղ|@ò�/��O��dM��8H�*�N���4�0ߎ�<Ń=:=�PT��R���Ԍ�5��� V|�x6��)lm�n�p��j��$傊��� �HJ(�X'F����h���uPoqdО2~ :�R�PYt���x&�9AԮ� ʚ�=}E'�QEƲ�X��ґPrҿ�f�E��u�I^�&['����6��]��{���;�mv���[Y�7PF������;�VuJ�����gH�+��9���S4Q�&|ah$b���_�1�W_v��7��q��}� R�SV�M�rY]%���·�����ʹ���������#(ܕM�����Tk��B��‰pz ��%�P��4Z�xЉ)b�ȭ����a�4�@��}U��z �~?ʚ�'e��&eu����Gj�M(����}���ja�������ro\ a`_^���|gF��Т�5�����I�D��Q�#P�%��+�=`�Uh�q���N �UlALR��!a��W���A��V�����[n����D�}�T[� + ��|� # �� �^%)�nq'3���,��� "V>#V/�&�-A� F5���§6;���{�79����jA�_�|FhZ����@i���U�!�#��jA�L<��._� ��=A��9���<�8��Sf-nY ��& i�Ap2�|N�LY�R��B������‚���;2��^��9�u� +�9��xϓǻ1��Й+�S��$��֑(����h6���"x`2%x�RJ{`�� �`#��m�M� �\�P�w�P%��C��j�`�]y� � �����c���bc7�Ѽ4��]�`*0 2 �Afi��H�d�hc�^OEz�=�N�+iR��y ��ħ�(�c��e�ċLB n�%��)2�B�:�MUͩשA�����/b�y9_A2c8��|[��۠RH��R!X�P���1���;2��}���"��iPSfM*� +��fa�&�n�&Ǯ������e[��e�����I�˙7s�W�5�9�cfq�I���Dg� ��/�p����9����,���I+������^�a�-�G�c��t�/Y�)Q1�;$q(�2�N�=)yF�UȺrjx+|����V�|��U��S�̑����tA;�Ս�tכ��^�fPaF�a�Qɶ�÷�g�Rv+"' ƣ4R|��A?� ��4�A����B�Ӡ����Q��D� L�F�.�����J�%�C� ��BIaI��F�dN>#"|@d��=O>u�B8�4І��1;�2{+�;U�Ip���L!0�Ք�t&��� +�P�i�j'����z�2”{�ܛ��8�����6il�@�<\H�$�*���KW`��� H9�B�OuAt 9�(� ��� ��b���{�[�;G�0I�#>@���D +���E����"C�[CҖ�g�&������Rb�j�rKH��*g�-�rf��83��H�)qR�G���<���k�ئ�AlwK�F��{c( +ɍT�p P�C\.U\̈́�S�DW�!�b셮: +�����K���p,:.y p�0�N)/��-yǐ����nI]�hD��$*�w�� 乳="���a�i!��� ]Bu0����'�����x,)�`���4�o��,�N�f��ot��Rvű��Wi+� �p +餳�_�"�C�n��dʠB�X\kfX'�����"������#I� �Ad�N;R�R��b�Bqb��{��Y�:�c`P 㑉 D��:�8ބ����b�db�x|��8�� ?O��%嫐 !�h���?�b�ĸ�p5�b��2#+J�&�_LgN|��ͅ�A���Y�ZV��NA��� h�50)]n��Ґ������P}-�6^q���''1�&a(r8����2�x���;mVh&/�:��J��D,�ьb>�b�G���8N!,P<����,j$J� +���|�RG��Q��ڵ�3 W}h����,���>%�H $���)�ޑ�4\��b�p$��JO%���W��e�Ei�\99�W�RcY�2�_���i�QƄ� +N^g� ��~�"!�ю�$����8M*P%��аlߌ%�k� ٘��ĈNR1C�d�u� ��Ĕ-C_���VF�Q�l +!���~+���8.��D]lO��̛=f>�JQF�F����n���������cB�8�Cb�#��MX�J�0%��H,lA4؞�8l�h������)�|���%���Z-y��^� �Č]M�`� �Q9�Pfd� ��,�6��E�H���4�Ԁ���N�c+���r=���Z���i�u�y �>���I�@�R���Z��K�A/����9�!�G��&5„X�C&䑟Ʋ�Fj�U��w2P:�Gg�|�JAG<%�~>n��l\� ��(����E�"�J�F�Aj# ���TބH�$j\)T�y$Ֆ�- U �+�'��bO`� �]#B�l>��.J�,�Q���(�;���w4����9�D���"nQ�{��8�ўaiR +�dH%�K��a)q-l�����8mO ��:� +EhQ�T\X�U�s +,T7�:����`�]�b�=� +v ����{���{�� �<�@&f � �D�P$�-�@�ȂqaH�9|�`�#1�%{�&��'���e[(V�:�P�d��-R�>�L� +�&�^=:H�B��*ty�ǚ����w�^��%���h�{&��/��w c�{'g��Z?�A�V��RbEZ�iD8�L���:9>�L���b�������4dXi��Yy������a�Z�o�B�A+t2�Mh����:ĥ�rȥk���[%���,��Α'/]#�^����tC��2y���PT+�(�S(=3�P�B��: �D��lBEÊQw�R�K�<���� �v��v}'�v=U�v]�2��l0�]�̦]_h�]�-�]o �K�ѥc��KO��:A.]���΁/�CO^�瞼t� T{�T;�T{��>��UH���嬽�e}VȻΖ򮗭x׿M��ﺏ�]�Q{�Q{�Cîk�]���]W� +�N3 +����]S�]4H����t�)t���9���;-��?2�ҽ��}6��OmX�kL� +|�=kRa��*�Q��4�}NBa�@���M���'�Q�{���^L�����_eL���!��d��L�!�����fNjs}��2���e����$D�ҝ��S�����WH���^x�i.��by__���K�}��Ҿ^$���l��3���]|=<_����O�d#^R� �"�"�GT�@b\>��)�[*v�:�_ �f�5�a�Ge%�� �-�-%B@��w;�D[�+N��Smt��]��3�'@��?�]��H�X �G�Ȥ����9 &2�cR��=��$��Eu���@_Kt +*�q4҇�9Sꪼ�C}��HL|�� 3�z���~�+j>y�>�`���P�z�Y| H��&��� �T�����4|~��?�5�jm+7��e��6ڤj����x��W��S���N�su��cu�K��Ƈ�,mHk����s�~���]%���P �ҸNg@��V�fE\��v ��B�P%�a�dJ愊TL)|t`X��%p�a�� ���؟�'diB-~^�_�xSW� ܘ��,�·\�lIY�xZ%$��L�0B'�:p��ڭ^Pc��gD�]���^�[��0���Ei ���yU$D�����"�(��\4([N(�TL���r�iAJ͸�ʆ�0i\b�)��NP=Eh�+��J�tj C9�G#3+�lD7�XFi��v �]�����\���ά{ua�^�JhT�� � j�)�H Z��Ѧ��D*��f. +yb;yZ(��d� ��J0�S�\g������(�뗺4̩�k�M `V�H�)3w�Q�����J�j�y�R���u�l����������C�7֓"��Os D?�0�Ǣ3a�����$ҍ��&6�VH/ ��6ʴ��C!}A +��q8i$3��C��VX�X�S MX�5�m�L�.�u��iV���juk&H@����0������0�3�,:�=�zsܷ�ԴD R��-�*F����'Tr�ca*��<��K�~���+���*K�x �l��:Le�|��M$�+�H��� ���f�=®Z +T��E �{<lp9M^�\���w���2��E>�T�ͩV�P��\c~`H�8���,�%�钦"�]��%\�|���\�Z�Z�H��E����p?`� �´��� �[��/[��+ȋ�M��2�`ɬ�MY9�~nDq�x � �o��Ch ! �l2��<D)Y����(�-�r�ms2)CC���I��1t&�>�&�+�&��&��R +%�Ƥ�u�{���v��jb�/r��)}#�s��x�0����V�吅 +���`/@s�&��h5�G�49 ���c@R���B�e����)�=Y�6�h6~��0��7l�=,��m� ���H� ;�y)˨E� �m� 5P��KѫO�&�@��g�P^�Ma]�'��+��� �X�V�qZf���F�u +E��\�N�H�C��$���v0�4�qeg���=�8dM-fas܉CLλOE>�w�qI���]��jEћ��@�%� +��A�1�"x�椾?X�N�� ��P��hA�B��d<�N+���E��g*���<^}ʠ�}�G4��+w�)�.�r�.9�`+2�X+���]�bJ���� �iv��8/�k������a?�������%��=|�/Gh +9*1�������a�p� �?�QcFk��v�bQd.���q"t,��!����pN�9��<�`� �|� +��B9�Y�����Otc�Q�yk�6|�s&=�p�n �}؁�\�[�Zr@�!��hME�RA,.��k@�1�H���1�'G���� ��b��~Y�&$ͣ�x0��@i��<�WV8��$8ˆ�^�I�*��PB#�5j��� +wȴ>@��K�\�DܞJv��Xޅ� V�R*L��F\C�N0��B�>�� +B�hH�$֔9�W,7���BK|��|2�\(�8�n}�瓞����:�MP �^a�4���u +B�6H\Bf+P��u�Q�W$���rP:bJd��H�*��V���(���TB��rJ� W��خ�a2���e�ح��H)4 �&tr��i +o&��2Q%�1���a�a2���f{ S�Y$�e�X��t��ฐV���� +��p/,�HG�p!�6����#;_Mc�/OaF�1 +�R�MiQD&��a�0 �%�\>��$�́Sm��C���f��N����ȝܣ�;�E�~[ ��W�@����ř��R�E!4�j����Q�[��l5�,*W`��Hk������e��c�����ʙ��(����T�*xjo/��5ey�Y������-�bJ|H"h�H?��0:t(��ẍ́��, Ɉ�PW6B� ��B5��u� ��a@J���XݱÀ�^���$�]��>Ҏ�BFVd�]}#�U�[�2�8��֐+��^$�|f��,40�4��'w1%��|aL���"�%�K�g/L���Y|R:�!���Р���å������T< n�p��P=�18Le>cVb��TBU5�Hȟ�L�R�P��kae� ��22}��DX��`��$�\QF��z3'�=�N:�َ�8�n (���H}8��4!�xEe�pB��x�e�B���iQ�2/5<���P"C�I> r@u$ Â09�O�CD�Je� ij!�n��0�= 4���6��碒��7���� +�Js�P�DP��Na��*>�5 ��`��2Gٚ"ﰁC�!*$.9v$a +DOO3Y%82�T�}�S�(�Kk�+��X�J� `G�R"&L���Bi>����0L'�j܏� �B&�B(���� +�$C �����'������Y�G��m��z�de��^��i�W>`f�ܒ�8��e�%�g'����0��#3�y#�l����Ԟ����f1#h�m7��`�Þ���?g�s�F�4�(�̔���2�G��L���z���f��& ��Q bq�֕ŕA��KEQ��fZ`6e���ym�1I����4f�0a8�#�;�F��|���x=��{0�31XR�� 1C ,L��$g%]b[>����J���� �;�!�}�f�����������Njk>�wR[09<l?q��\l6�y�pDZ�ґ|-�A>!w�U�� t)CZ&� !�?�o��<#�g�I�L�0O��*&F斜>��T(BGY����f��7��� �w����O�I�+���J`����&��'��,��e�W����h���0��FE&�����^��R��M�*�<�g7�O�����:����$훳� �I�B��� �bGџ>S� �H���)Un( (�E��m� +,V�Uk�z��{�Bk�nm\��K���V������vҔ{&���N{i���i\�4&�� �� lPtS�i��F�W'=a�P�[3�*�\5R�ge�(:�l�,�pk���̭�2-�1�+E����Kgu�>2�/��/B���@@N/}�r~O1��'�w���;��MZ��(,�wSj�E +�P��-*�.�+�Y�:�> /��� ��%�.�\�� ��r@r�`Ir�k��]��KOF.$�\�%$r��ʥ�)���ॗ��K���K߻���5�=��~W[�(������T&F�oD�KȰK�=������]���Q�u�����N���6�K��K?��K��Z�Nq�.���.�^!\�;��tV��,�^��������S+��(���J�]�žE��,�q� +{�[a?6Tؿ� +{R#�}FLa ��O,P��, +{�Ca�dxgP�Zۃ�ڊ���9��� �<���\�T�a��>�#��P��3i����+�%�|��6/@T��� a��/\؛������h��>�ZaOPW؛���ž��m�H{�b��Y4/#�#��7b��/���.�����T1s������J?����(GEѵ�l�u���7��*U�8�D>@r�Q :a��4�5��;��А�I�A�!� + B�cM>m�K��j�b�%��l���E�s�l+�>`6���E?�KE +��f� �P�#r���� EW +��U�&��z�px�;?h҅E�j����c���~��P�8����#Y�"��L��r�;O.[���s��W��^�_��� ��PLP&��*�%0 �c�}n3r��5?V�LM�"�~@���� ��6N�\����#J��Թ���3��25>�ǧ����t`���$0��a��Ph��O���BꈮZ�FTzь ���1$�����s�K�� J��RJ��E�p/$R��eشSvU�L���е>v��M��"԰�9����N��݉#�T��#<G �G\)B�� �i2YX`^d� +&%ٙXsC��� +��S�1�Αdc�GfL%� +�~�BGE�l���JoUlA�%���]U ��;]O<"��2�NbLZ����ģR͖꣠�%N�Bv&��\x�E~@�9�r?�"%(@�J &�0�=�<�* ��p�R�#|�듹UŽ4�( ��h''��* ��;ǃ�]�T�%YU����j4|�m���)N�|�hp˧�F6NW�|B ��p35�Q懶���;ϴE�'6''I*��!�2l�N /�.�m���&�����~�����nj���0��� �A�N�eU�#��6�U�����Ѩ �L�K�&&�_8�N�Qɟ����9�+�BA�B�"���D���KO�'��[��诶� �q:r��j�#���]�p����[B`�4���m���Jl~���lS^�?�����Z� �k6p��<&*�A蛊�E���%�yT0)���VFy_�N.�Fu+�F� sd�����&�=����E�V;������k� օ��Ä:����*��2 m�k樠���zq +D�% ��F.� ����n�ɪΌR!<�,�7_!�{(�G� �̯-������y1��mͨ�U�䷔����B�8m�.R��E*�P]���6�*�@l2G�/��� I.�*@��%�m8&��RLvb�>��&�`�M���9r�ؿp:.m�L�`V?�!�2PH��\c� ����V��MT*|�KǠ]��^&�a[��28)8�9Ę|w�P�<�Ga=Uy&|�\�\,� �\DI����Ctr�����[zj�U��"w�U,�U,���"c#�%�\�d�9��<9�8�NBᴑu����� 6{�p��c������.٘����� 8,�[�p�5��BҸUB%�����4��c��&�Hj� ���@�ݬٙ��� bp�����Azb�y�V��\����I�|�X;>'��/�f�������G�r���~IWMh���xy!CU�c����F#aA ��)�H5`61�[�(���[�9G�E����LR����~� :$M%T�p.��јT���vJ�Gt���;��U�c�#> �8�ٙh?�R,�FE���E*�|!�.06�nP�3s����nX���!��ţ P5����6�2A��@�")��R�=���p��oL�H�:Q~��u$�VE3�cw@1�V���������x$b� u����E��40�Š�x)s��!�$$�l�Ćc���G6�$6e0Ehbѕ��h9����ZM m'�K��v�;��O(�"�� e��R�#�ҕ������9@N �CM�ZUJd��8ʠխ ! o�I���#��R�Ω� :!J(�|��c� h]Ao;��24�K���IpR8TJ��b5��GA�����������ka{ "O��J00��0����.�d��6��Ks(2 �$�(wh������!��r�?��TA�RB�^#�Z�"�酁F��2�#3��� e�N&�!�1�>�6��6 ��� r�v*����QE����� g;q5�W�c���")���,B�0�l&ҏ=���Yw�w�R� �R�y���ט)�E�i��ʥ�(PSS���PIf�z� +��0A�}���}]C��y��ٟ�{@������ +b=��r�"Ժ'BT ��w�ɋ& EP1E��ᶒ�-��X�(A��B��M�����<�R�=��\#Mh���6K�jmZ�̀�����ǫ����{m���S����'��TR�BI��AI�N�|*�0��e�zE�J�F�C�L)˹P� i�Z�Bqe��Ê�>V�YXl��a���>ί�C颳T6��<"�c:���R��Pz�.h�������m4�ݣ\����v$�p9Ņ�u�O�*.��T�9�R �T��x���vX�U�nQ8�������DH�o���tk������ +~# �c.��*?�����{���;�{M�{����Z{Vrv�qv��� ���E"��W��J~=*�S�T0��+U�<�� +l���c�ɱz�s��)(�K�'���(�^z}�^���^z;J���z靛z����N��K� :�K�����B�w5e��[a�=ˀ�=`I�k��W���H�X1�׬8� +,��k-�v`�����W⥓^��gV�K�L�Π�~��K���K�G���F/}$^��^��_:�p�t͇����y�7���#�w����i������W~� ��_q���¾uba�Y�O��6��~���*��T +��"�}GQ�L#T�����Ȧ�}N$��q}D�5��w�a�Ҹ:��p�=a��{c�I}dCq�*�ZJA�/R:@� Dƍ�ӹ�@2T".8�4Am��O��:zZ@����ի��ZK���7��ڙ}W��Jsu[i�6j�q�#�aP��U^!�I:��g�1@ +��v#)�R����� �tp* ڛ�� �Ri�� ��Ɔ +�5벵Ľ�;?'@t +t�7��9�,B��͈ �c�A܍`��q�Z�V��X���3IR(ZN���!%��"��q�n��_3�&��궨ƞ¥5�2�@1A33n/N���� q�`���1l|�]�e�;��t=D�t��"���ﴥ��1� c�`�3d��QhJ��!6����7~@K\q�R �Ȏ��!'����7�����曡��VC�T�R�nM��D 37��Q�9Zs���b�ٴ��U�e�`�Y�*v6P�35(������E�]��� �C\V�tE�R���5�Abf��=Ur���ZH�ʰ�Je*��a��xÀ�٠( l1ϋ΂'�v�tBu����f+}�W�^>#�����C&E�B"p�B�&ٗ�`��S���l@��|4p�<����~2%E8T;N������R�ƎLc�bK��T���M�K \ �E�3��j�ܑ!W\`���t7���0��"��M +���V3��Yz1*s� f��L���sҜ�OC^�ËHk�S ߭�u�YWÖ�F���N@�n`�� +�RX$� ��{�1�4���" �v�����=IP���|2�g�0IFn%c!�'���ί����`���Tud^���+���H������zq[􊋏�E���+doa�妇<�� � �:�0~�L�����GT�̓ f����v�!� �G��Rh��f��P /TF�Pǔ�F��O +�O���'Me�N}��N�?I���F��e^M�$f?@í/6��z�(�k@�w>dF���y�t2������Yg��`BxP�&f���5o�6S���* I������;o4 J�e���0�1 7�e�X�˪JL.k�B��r+ ����Xڹ��[���Tn�O/^�$���!A}pp� �6��Pz��� +[Zc��Rݶ-r}�`Q1*�%�(p�РHDc�P`�YB��͐<��Y�gi��6o����nG���8$o+�K��*Kޚ�Wu�B��a��$_�H)�N�pA�lh(�L�,� g�JP鎩sP4l���]h�r8L�D��i,&�Pl|�ct����C�l�M�|��E�Y���˟Fř�0�o��ū'P�h`�]�ŋ"Z�W3��Ml�����h��,GPQa��.%�ِ.���A�'C�5�}y�L�H�5�~� �D�k<��1J�:�/�8=��D?v#����z!�����h�� +c�5�|�C�3�����R��l�hi����X(� Fwd2H�����vO�j�6�^i< ��3J����„�*pR��t�r2��0k�GF �E��C q��86��z�K��Rs�lⳮlH ��C�44��:%���X�@m�.񶏀�\y8� ��6}>)�`q8-(��2Asy�Z�G`��S����]!� �7`L-�g�Da.� #80>�o�ü\o�!��rD0�̌քx�R'2�i1�Բ]��U!Ȣ[u6��u i�d�Ě�`]�xe�q �z�o��X�����z<�eX�}9�SĬW�p��[�R bk���&��'q�V:\2=P�[},���\LY�P��:�U�臠�]oU�Z��Q�%DT�~�T�a3��d"���M}��R_�%�ҡ�[������ +��?l\�j-��=E����H�[Y2iI��B��>�7�{�����>�>�o�z�PZPo����ȣ~ �^=yqxz c�~�Lߪ�gA��4�)�KO�(�a ����l�:x�K| ?��P�K��h��K�Z��6��?.�� 3�Z�L��x��x��Cg�B�3}�p�^�<���F�_����-�I�J������k��1� r����r6�%G+���f��^'�Ȁ"E�M!�;[؈�f/_�a��j4#��I� +}���K���@ä/�U ���%�Ғ>�Zқ���:�~/�F��I����{B��5�b���;z���C���Q�D�p_�Aye��)��!*�$[�U�� fB�u�T�\u(��@҃?����A�$��Ic��JD/G4��Bѓ~F��#zC�"zV���@�E��a}��E2٢��)�χ6����zWe=GWA�hU� 4)�G4=BA�"���|�� z��^az��1�u�sâ�������ıj��ȴѫw� + �}��L�g�q����f.�� +�E�^ �ٕ��E"`������}�P9??��ϳF����y����붟C��=b��ZQ.� BC*ib�9$� �@|��PY��\���V텸�-vY�n&��G�4^�}�+1���1ӛS�����,/C�$7:�a� �RfX�ue�ў ؛ (_:��_�� k��;. v"pƉ�I���=3E�︎�[�S�!-�����ِ��}mgpM^8[+ �0�O&�*�!Y�p�J!JL�" ��T̈-[�e�yS�������v���g��O���C��EC�> [��/JK�p����ꯠO�}��^Y�k(��s�X�MR�����C�N�*EA�}:�����B�@��H _���j�9ϞF�K*��d�ɤ�ՙ:t0��4R37�ds�& �C{O������Vr|�F� ��fpH��i#'v.3 ����BU��UX�D��<|��bp4��Ĉ�e�6be�ow(���3�� ]� A��RD�D +������٧�ܖ�t^��D+�O[>�(M�t��Y��j8�B[|��w�j1�&#a�G��];#6��sLVN�!J#)J#�Y�4���x\���[����%� )�'",�zb��V�_I��@�w&��&I{lL� +�όȜ�If@!�A]L��&�Vj�@T��i��Ԉ-c�.>h�P��%��A�dۄWؾ��am������# a��a���� N��v��ox<�ɻ8��hkS�sބ��΁� ;sj+F�������VAI��B;&�M1#�J'ZcU�רR�PcEtKc�Ck�_A����� +iiŝN��O�bS�A +�G���t: +�U��$W�gG���� 6��7&+K���F�Ն�3�hcP�����҅�6����G��b����PQ�NJU6t�T2���JVbWF�8���*���5j{ R+D�@�"q��������*b +�=��ta�����̅����~߈��" +�1��x�yޅ���~�[DRH'[U{�>T��T4�9WqC0��"B����`[�:bS+�nG� j9*��^NYǍ�,�$2��^p�<�`1h#1��Iɖ���?�H�u�\�̤�����Z����=T3b>��`>�֨|����Pc�N�`aN��+�X? ϴJ��"4�K?ְm��ݞ"�ӆ.���$7ji�zd^���"�'��_�D��*6�{*#\Jnh<�A�]G���� +7(�@���^��@7u +�?�r�@"����C�ݽC���;�+"v�`� �OKz�:��܆��^�7�o��2/{�İ�X`�Ay��$`+� �S�Q[ţ��;��|��" " Ohnt ��Z�O8���f�P��ڬ�@l���X��rIՂ����$���Ȭ��Ǫ�5 �ߓ�`�L�a0ʎT��h,����5�B�X����T2��'y̺��cH�?҈��#�fUn���mz��-n����'����ٸ@y5^�F��� ���Dt�hM�X���Jh�J[�J5� �5n[$�lX�\�!�6�I�,@���H89�v�~��? 4\Ju�hQ ��p41�~��K��B�mP +'61���as������ؖ���X�d�k�K?� 0� ��P(�qىb�v��� i4�d4�A"� +gؐ��;yt��� �nE('CV㘎\+*�/9\ ,ҽ׎�о�ܐ��A n{�z���T�[!B����z#@��qZ�!��EH#�,R�V�`���TH�|$]";�~^�)CP� �붬�:V3hQ�ez�f�� �`�Z�o @2YV�N��m�C��%��q�G�V R��@`�A D����.��N�7Zrl�]�bg��jO��)\���I>Z��p�7�|@��P��a�Mj�Iug���㫶�p�XP�&�2��2nc�Ւ&�}�� ZݨK����a��EF����lY|��cy-p��e02�q��y���RG�3P��xy��W�nȿ�B��X�KK,��%Kˠ`�O`-��S�p`f!a��������X�"M�2 +Hc�vI[q�ꉢ3���68H�j`�U�p(�p2�[2p�`4>@k�xt����2A!���$88����� �N&�k�)*�cXД��^����"�QIOB�[�U#��S���CG�L\d6J��T� B�8�!��l�@�v+�l��"'�ё��`��sŒ-s-�lc�������XJJ#�R2-�W]�TJ?qy���Q�XN��� "�I=orD��lNΙ8�b�舉ΙHv�dE��$�;�l*�2ќ�s��v�LK�2�,Ug�Z�)b�S���'W�]�Y�R�&�� G߾�s�6���ҧs��v���1Q*�3�6 �kUZ�0(^�F�dZ)�dq?^�" +���j7f1]&� 8��K�5��hP�xcA5^�Ɋ�p ���@yR��1?�2��T�C��4�܍�"}� �&�O"�L��Z���VaM�JI��Q�M 2���`���&�B^\sN8���s^q�;����w��t���\��S����Oh�*Dͣ��H!R��<�7)mh-7Y +�$���1q��Wt�A��X-c�����6ۋU���wK��-���2�&�(�h#H�fF����lV��f��Kp�aMlGX��W&=���:}����t����Lg!R��Z-�B�DΊ����̼z%�:C"�u���*�$"�����#(�֧'H��i}&=�� ���, �אD���f�A�AշL)�>� |�h �Ov<�&&$� Qp�&M�5�.0T���U�8�T�-���K���{H��R�縨~��Uωo�C>���(��,O��D�Sk�:�K���10 Ou�SO����O�Z �Һ��ԅ'�KT�"S��їP���!��A�A��^m3�<0���.�O.�WY �܁z�K��Q?<Է_����szQ������c��ja�w�V�&c�ՂV�"�l�y��Gg�W�ʓ�����\���2"��i1��>LϢXL�qyL_=�' ���ᘾrL�lL_�$�w+ӗ�kz+͗�TzV�)����~�3J/BJ✥�� �P�����E�l��\��P���}˓��KĒfv���U*��XPȸ��Cz��!}�8���1�>�v�˲N���"=j�Jd��H��B���N�?��H�� HO�W�d��R$}e�HO�e�����L��kt��q��@���),���,[A�v6)�g�q���� .r��J��;��k����ܣ�T��E�=���0z4�޵F?�����;z=Goj�у�n���K��K���I��Hf ��g!!�/)tԭR��󊅏sb_!�@p�>�@u9~�Ux� [$�C�G�T�3:�L��[É p�w���;M��x}���}�}�{�L��6=j�D��B�1�BOAW��?��s��)�%[D6��`yu{���E>e�QR��Ч="K?���X�kㅯ�pd䃳tTW8Ѓ��.����q��V����t>�� ����l�@��.��>��'Ъ �"i!�����J�  ��-CQ��������]Cvp��ˆ�a�Ҟ(7sCA�a��V��1��*�Wl��-ǐ�. �x���u�q�Y���F����l�X�^Zg�f�K�q&���SH�L/��/y��?�-�����%�ת=/D[H�vG +b���}��&\@�蕋�� )'Qwj�%���5�����`S��I�ѐ��ёo�4�o��~Ѥ�g +k�VNvV���(�/yw���Ů̀<�2�<�mJi��C7]hl"�c�8�Vr�Ԫ� �Ljs��C�0���,`���bc�2�G��I�1�J��~`�lM���~���J�}�Ӝ2PC-��tt06�#87����Ki�Z�16�7blh��'�ɥ]ĥxv ��]�>]��y�)c(xbt8ަ�m߄l�B�0���@F��0Q�b�@�x��g�� ��KA�zd��Lo�V�%ẃ��D�m?�� +�;OE��.Yv�,;v��;������O�zH:Oõj�QQ9^������#3\�� ��&W��V� �|o���$��A`E��D�:���%��x��a�h�r])����0��Z į���ރҩ���8 �6h�'R$̷���������'*0���J��A�kQ?���\� �����YZa6y��^��.T�$�c�;��J�R���K"q�*�1 ��"�W���*t?���$W~=P$��)�ܙ6!p�;Zm���K—xqC��qC���ai�$�Km[!�YE�@�T%*t\kNcM�4n�Z�^�P��JjD~@�����e&�>sB:f>��s�mT񦔴Q!�Tȗb���TxA��"H�:� �,� c*�b�pՇK�#*��AFt�KMJ�N��'y7���n�$�c+��$k� ibD��PX���Pz�Tb�3u�^0O��c�*!��,>�i�)2�[��v�� A]?���l>�B7�*h8��&qJE�s��(�b+�o��R��GX��xDj'��Ԑ�ic��T���|�.M��.1,T6�g~@�L�e����Б�O-�d�W�e�ʅ�h�ez�� ���HO+!�J�7.�2Bx��E�F"(��ܷE��*����La���bn�a����) �|A���j�+��I�DĈ��~@�;A3eyi�F}��1Rdλ1�Py�dt��C��UNo��I�r z�)7�U�jI��r��OZ��ۇȱ]�!�y%#l,��fj�r��� Z���J����j@jL-x u�C���9?�8s~�BB�P�5�P/��(�%ZP~x����J��SO]Aͪ����`��R7�X�uZ[�dQ�5�vC�{9��+Q�> ������$ވ�t0r��yE�ԵF�u��gPAS,�K(�I,�$)ܖ$)HY���x�FK$I3�� '���+`U��Q+��� uv�P`=Nk�I����lI(�Xp�!�m�C��0����5�J�dB|X�0�ŴU�=n��V� ]̤PlZ��u\���nA0���2.J�P����5��:f�t=�>]q􅮲�t��8�ޒ)�ѸR��Jby��"�-��a���� �jRu\�� ���y�=�?�ug.0� $�� <�"k��!Oڍip�\s��?B)�nj���6�� Dj0�z#� ��� P��ʟ�Ė�FbY�,��c �@��C{.P�6ú�=9\�ۉY�+y����5�=q��p/0LG�`�U��$�]�]$�|͊_��!�>�9YLӠ3����@4F� ��@*�ڴ���n�f| +��m1D.��3�,���^4���E��ɮ�oa0j^Uu�`ξ�0�� �,`�A� ?`1^���NU�W \�E$�̊��i� '捡����|�T��t�k�Ʌ��yC�%�e|�/Fd��p�f�~ }�q0��͠�1�k7�X�.�.8��6vm�-�*~E>\.�����ŠrbK��&���O4ߐ�Mۇ��&��jC@Y�\@؝0���q�Պ_C�T�6��wGe���eT�I���m���p �0G����Ip�C �(�u��{]� +_ 0�4��8E@��!�5T�iV��G�&p�_W�\�@$Ȣ�����=[4)�R�nE9q^ Ǣ`Y����3P���$޼!i[�c�=P�ڄ2qAgQ�׋�x����6��ݡ��h +�� 3'� :���� �cI��_��'���)2�+�cX�@t�,'3��s��D)q����U +%�C�Ƈd&��=>DxC� �W�7��,�L�_���I!m���N&�1�RX��)iWJ+&�@UB,dZ:�P���]>����*�3#�j�lT�xc�:'"�QJ�w" ��&R�d�^��Ą��$��NgD���4���cE�.�����w�,��K\*,��ae7gY�����3��D�ج5�!�R�Ff1^��'t��٫Nj̏�YFPF���>��J�yK��E�>`�Bt+���0q��[ta�< f�>��"�e\6�d��5k�W�m�UH�sL�0�6���O�{8������O�� IK�C�/��#%ݤTh V&�F�R[B� ���R\���1�� �� 'q�SrNlg˼��E���(�a��x�A-(�N���,�# +Y�yԱ�H1)�:�H��7)�V֔�2��UL���،8����z����uk��5w���~>�Pd�cT���+��H����2?��c�aM ae*`2�4�Ȩ y-P��-�RG �2!P"R��C0��w 4���eX+�fiiJ��:X8�T�w&��!^���t} ���I�>�@��a�kG[O2�X���O$�W� �N��,�e0Cr�d̈́wuHӅ�DB2d��������!V? VP=V����@���~3�W�`VϢ��o�s�'�K��آz�V�O�K��^U��`L=�qP�jq5xIe��Hn� B����Ӑ-�U�œ����;.5��YM�\JS/�i�Y A�+8�����5S����u\�)���Xx�. � Է+��3p�ļN�-P��9�q� +dx �v���b�s+�P�G2 ���/�td�L��~���x�i�Λ4==������o.|��>=�D8} N����Y�����==d������X�O%#ӏ����1��J����M�,mz�ݚ�n�G٫C`uR����@���"ϣ*R�����eu)��E�Xf� +&�R`���1J������{By�?�fJ�Ҙ�k�K�Mޥ������Rz��(=�:JO� ��,�� +h�u�+���J_*��w)҃t���f.�$Hk��"�T +J����� B�V�vxz�NV�Іj��Z h�i�Q3��V���F�V(@zL���p��O;&��7I2����H�l���F��ΉFz�H���Y���M ��C0i�� ����6%C�9A�}�'j�@^��gaj��>�Ws�a,�O`�]S�<�� �&�MC�DC��H}*�^R؈���,Y��+�wN*�?b�� ����;%��K��k>��£�:�E�� |ԁ'�IL~�#����0���m��<�I l]4�E��|5�zqw��W�"Wkk�F3x �F$��r��| ~ N@�O�P��������x}�����;��c��b$��\%g �^��l��c&��J#���; ��1 ��E GYq���}ܜ �CP�HR�1���M^��:�~����kYb��R3=�8�Ǧ��������Վ_Y��,�sZ��c��5�z�b��DP'��r�9�͖��b���$'�n�7�b���b�V�)&�)�%n�I��E�=�+��J�qEM�� ;�`��U��2�|�����+M� ]^�2A�7�Ms���z4�� +��s��(�Э5��ms� "�\F .8�u�8C�#v��Ct�Y��P�|��a��D�x+�}���|���h�����R�Ԉ����4� e��>�r���lO��I:��� �r 8�G0p ^��t<�H�>Ɂ%|����(݊7M�p�t��L��pW��0�y�H�E�΢�3�IN$�Dy��©i����uص$�J��0� �+�,RB$�]I0���^$,��b�@� ���&���Gjf�����1Y@�����2�L�Fc��ڶ� ����$�J$1�:r�o5�+� M��D�\h��:�YQ���0������Lْ��^] +��ɢ���Wéʽ�Ƿ�x&(��� ��,iV�S��U�J0)V$`)V<f.v�J,14� 3||�b�x�TLr��[�%� (� e���A���ئjp�$WQ��)3 ͬf�V����C�vNlі:n��Xs����4���6=�p�06�j�ۅzA��$ �i���tu�~)-�4f�$S�aA~��A$��ƒè�D݄J����F�MA����Ýd��g�7'�b P��bP�%HC�ڕvkK�P(��Eۡ��-���@�u�[ɊS�\ �feB0�wt�Ab�ϴ�5Tk�l�A��e�(/n*o� T� �3;�n0W��1=�wR �� ��=���H2@?�}�.�i)��VzW�򰫪X-�:+(Uh��d�nԓ�z&�.͈=v���PCm�5�vL\-�����AT �p +����+L��<�3�J��i�o��� PH��Nɧ�(H�LI� ��0˻*z9#��`��N1>Vl�H��3�`Q�h?`t��Q=����40H_�qi!P��NP΁uϟ�[�%����h�O}A�|A����r@�e�� +6.8Ӓ�~�+��Ӓ-jUM�E�HI�RxC] � _crK�+KK�f +�`AJ���h_8���^��yC9 t8&�L�JF�2���i}he1|Z�RZ�Л ��[��`�*�� +��V�x�Vu(H�:�"K%��b�_O�j����N:�m�2%���Ɩf���`�!jW��]2$|��� +��,��� ��U���w����dQM1��g ޕ� +�^��*H��:2�4"�FJ8uQ,4���Q�Z�;�ZC4�BF�di�`OҢ�j6ilU��hAY�Zjt�������^���߹�q^Xd��4Ga`_�/!�Y$�Y&���b�tz���Y�h�@Rׁ�@R�����DwH$���Tʌ���-�F!��sB�%)j!�&j�� �����.tv��F��8��ݜ�S6 �;RAb�bA!-Ts����͒8��L�&*����τʹ���)��Woj%0`L��h�`g��̑>&�3Q�o�Y|�~ ��~Op��ӈo���ؼ6���Bc��OR ��W�7�|{$�p�*�-�CNx>���M�1�%�i�:2�9E�"-�'�� +�Z45k�\ +��b�=ݲ?Hq:� T�'9n�����[I��0���(���"`UV��R +]�}�q��Xq)W������: �����q��EQ*f A1��Ax���G���@�E�V�ܪ�SJ.����f�>�b�w +�9.�+ږ%H�� -�8"�z"��w\R ��iP҇�x8R��j��=�9�Yk ��4 �Ĭ��hY����h}���(F'�C���l�LM�f�a],�� �QI7Д���H@��u��D��0�G�^E��d�Y��#�4EP>@�;����9A�&��<�4#;ܴܰ|h r��Y �5�!��j�� ���B'.p-�*�^�נZ����i�6�C�lMN��%�P�H�����H"A �|v��Zn^���Y������L���JB�=�$ ��xr���7g��G �#��@��x>�[��@:����������Q�ͦ��-�4�aɤ��XDDK�)Iː٢'�A�&�6���,rv0���0t�H#~a���� ���. O��YB3@l����-����9n �jܑQ=�v�.e�Vm+"8#�9|_�v:��o �5�(>�Ġ�E�0\�� .Ma���@�q�1*O��S*R�6�I�B>��$�T���s����E��}R���@ K�<2���)�V��h�(e ]6�E� +���(���(���,�Ʋ訬�B�� C���FѬ���:�G9��d��(�'&�u�z�BT���S�rQ�E8#8��X�$���”XQꎍ�ĩ,q�z��W��Q�!��I��:Q/ ki�Ucq�����:��;bH�r|�&R�� +�(។L<.��@t��(m��`�9�`�ё�g"+�K�۵Hƛ�N>Z�L6�R0z������� %�(�� �1���d>�O�A���ъ@N�E�"&*�� �� +�I� +y�b��8��"�@�#^�I\�"AE�wR@􉆀���XQ>��xe�%P�2,��]�ПK\dNb^N�`V�UgN�5k�2o6��r^^���� ���� +��H����hM!R.��d3�S>���(dEyRie�1P�EdX�h�tjAt �ڍa���5�4��d>lc��ͤdz99�8P`���Dɓz���ԝO�/���i�3h!} k�6�}&[������2�>�d��Eӈ�׬�| �6n�l`�夡��7���+C�$@(�n�L�U-���+0�&;�H�Ú"$&=5�}���T��������,�0xi'��Y�zúN;H���(O�����Y�>�R�ៗBpZ���<��<93�wR�I�N/j�&�7�%0�rS7ɤ�?�Q'?q-P-HdL�$8�"yH��C�2,�G���J`�����q��1^��%�%���K�H��2�ze�>~z��(=u('c��tDj� �J�U��m�U�*�+���X� ksm��wa]Չ5뽸��]\��-�O�׫���/��� ��������t���^� �')��wJ�-��$�^�m%���k�Eu�m���������\�cE��f�i+(r@��e��`�g�Y/�Xo� �/_��+��zK�d��9֣�i�Y��zS��z �[}�C��!���;T��l�>�R� <�z�P�kR���R�*�ԟ��zUC1W� ���m~3 ��.��05 %>�� BԶ��y B�H2�^���U���+��ʕz�t��t��#���.R��w��ݣI}(���¡S߀���~K= �Q/x�P�8�7E����bk�z0�����N����x��_�N�&`�{M!�$�@I�(�XVG�X��u��e"�<��kl��o�~zu�P�]����G�┡�53�w9��P�T��0T�ϳ�����g�qz7p8}J�OOJ�Ӄ�zz-UO�����]�c�e�i����J6���:R�;`�e��z.��Y����0?J��؞XQ*��9F�Kf��uE�*���bf�= `�54��>*�*��~n���KE���X����z�n_Jzl�a_��$�TK�3���8��"XLm�l��|���j��ʂ������ ���lK8�:�<�"-: G��[b�YZL�X���kG��zB��� +߼Mm�D��>���QF3�5�DgF�, +B�uMn�ܔ>��/���Ub8� +� �ͼB�%��'��XM��Ǭ�f�G��)'Ed&�V}���� �+�CA���7D�F!:O�u��d}d{b!�x.��>R�� ̷� *L+ XSR,q���J8r�+�Z�+zL.[��S.%E��T�B�s�,�Wu���� ����������5%��P8[�8u@�Ȱ.�#� �Z ���PtP @��Āt��f�$1Z��(�� +;��+R�N":Z�:��c�Y�j|;8J��O���pН� ��ҕ�F�j�f�O:'I R'Ӯ�x�h����a��I�]�SH��a��D��,�1X"�2#���FDĹ��@tD�ptD,@0,��}&�q5�'���)=Ld�s*�E�0* 0'4�P;���Af�yx�IN�P�Н�4hJVYґ���Id���^1���,�J�R�5&� �"���/G+�� $ �HH*���*���� S�� Q��ANi���.�D�i+Q�c��͍��Kz'EKN��9����aJM=��Y’n �+}Y��!�d�Q,�#!���`�V*1H�O�z�]a�P$w����&t��pa�@%_�R�l3G춙0��\ �T�дh��D���|=�� cW}�\-�&�L�úR�úN>��:NaK�jK �iK�L��u%P4՚�3�v�K��)k0�G,�Z��n��D�\�Ny/=3:/����4� F�ppZK�30�ȭO�����h�~cS�`P ��5b���>�(3� � A ��� �� � ��67���l�FcԂ�)t=I;��� rC���լh�p� �[%V��L`�`d��"� �'1��[9D8ԁV��/, ��zS����{�ޯ�0!nPAÐ��B"'��E���A�n� ݜ���Z�]n����CW�{n�V ���2�W4�8o&��� L�l��:Z`��'���'ʲ� �h%�����;����� �K,�����=�M�?�;T<�D)��nLk `*����ZX�+u8��v8�r8� ��`�K���g�8�`�3E����%p��$N���2+sX��|iҁ$��Ŝ��4-���$��BW���A#6`����Mz@_���]�q�-���K`�ĝ�Z,�(P��"8<@�`�^����`���Cc������ �z�t��$���Y���x,����@�X r� x���F�����������hJ!����`�)w���T�P0"��%��U�&2X�jy0�D�y��T2����b�8�T�vG.f�@�M��s7Z]��?इ�H7�BG�2":`�|��ᑩ�6�Q�lB"Tݮ�2NYb�aP��a�V��1?f_�^�3���j�ԛ�����#��A��y�b���Pi��C�o�Ad� ����!(6B=�M���0�K�C�C�B�tI�ک��K��z��ԭ�[��R�H�#-���C��Ў�}��*p��3���$��]�ab��ú�.+HJ�����I1�&�5u�U��|����@x��c`C&�)��]Fk��Ȳ��z���G|��T:`�H"\hH�X}_�8}�OB��Ŧ��� c݅21uBwn{T��]�t�m�� �#��1��WFĄeB ��(4�Ov�N����b ��� �0��T ��<�>r�F +�j5H��P��<��x(�9F;��/qX<�w�5�uΪ��k�a���X8�n���� �"|`"�R< ��)L�`��?/H��Yl>$C�\ E{qn5b?Y����j��<���xh������_~�I.��/��L� L��R�$U)���e��0Ɉ�LLߋC�|��ˇZ��]9�hwH��(����I܆��b5V�:�ѓr�0���� �� *yg���~ClT��3gU��Yq9qB&o�,�n�O25��fRNQ��2 KfĈ.�H2��o���8"���B����5�F|P}�y�My��p�G=:7B�� i���A�B�BkN^�>�,��Bz-���z' �:� $)�RX�9e^������WZ;dZR�P��������hW�qX�&u0-���s6����,;��:oiq9N��x�4���ۭ�.��}#[$�rX^� fyI�;����RŽcE�%^��i1�!�:?�C֢ ��7f� >�� ���9���g��!ئ������KګJP�U���G' +pB1I�Ynb�jS}���9��}��Ek%J�L\4�-� ۍ��L�I���_���n�c �Z6;��rT�r�1mFlGT ��I=L��\0��x|!�v/O�H��aP�%�pIO�@_�ȇ�V���Z� ���6X׽{��m��l��ZZ�F���ƅR�����9�ԘwlM(� "��ml�O�Ȍ�R�@��e���m\a33�����Z�Ë��x�R���J�:q^����P��zu�>3K}Kk}4��ls���.;#������Yڿ��X�Qͣ����ċt�c[/�1��,a��2�T��o ՙ�(��)[�BK�j��fV��,���D�����#��2��Hi��������Mؠ�2�< ?����ڤ��*�ɘ�):"�@@�⡲U��� + S�H� +6�fk���I�,-ѐMZ�X�E�X�-?������;�ׯj�� �{}$ѽ~�q��s��G�&�W��%����u=�p���+�7] ���c~ �<>@�m��ɰ��0B5k�����k����pK�=��3i=ى��p�,���'���M�b=N�Y�t�w��� �$�G8#�6 ��C���IJ�T�V��,VO���磹�Eɥz;?��P��a�vT?�q;#��Y�+��}�#���&1)�tv#�J��ӻZ���y�*�P�(�P=囨�vHT���u +�s����a�z1P��RU�3�_^���"J��Τ�&���;"��fN}j`S�Z�QE``3V'{��E�1���.�R<:��Ɍ`�z9�T��Ѽ�ı��� ;�T��&N�z�A=m�Q?fԷd �1� �o���kA=���^e:P�5PO� �gx� ���Éz�P�r�KU���:������F������T��v� +}�Dň�@�*Oa�F0����%�j��F���vez +Je��8���ӣ(��+.��P`�ӟ��������k�ߐ��s�?=��2=��L��X�?#Ӌ�����3�ӣ˸� �;T��Ž�J��R�.���VKy�n��]SYL�╏&�P�-��� ,�&/��3JQ��)��o�H�G����9Sz:�)=�aJ��ғ6P�5���! +�@��C����`ʀ�!Ӄ����q�m���{��n�[6����|a��IJ�夺8 �1��S�֐ix����J�"�Cc�r�}\tJ���I +�v����Z-�Rqq0ī�3��i�����BQ�b�Q[�A���ч�D{�o����k��n\H_mYK��> ����_H��S��Q%�<M�����6�����P�(��mjCh�@^tm-��8���]P�Ds0��̯��.m#�$����� d3�j�r&���:׉�Х�5HŢ�����&p��H��І��k�`ā��� �5uE�*젣��k�f �T�ԯSk�p�b]QA��D�I���r��u�x1�(W� `���hB�y�Q��O�f�����}�30|+���D�����@�G�?����Ж�A8 �� =�h�^�j$��i����Le�:�+�b�C�>�%M�[ z!b���1��O�0��;嚅���@<��' ֙�� �E,�#�L,b9TK�-,�Z��x¨t�c��xa��w�ը(i*i��89�Β�QFI��R�m[����K?g@aR �i��S��@B�j�/hD`ʁ}� ԣ�q�&�S�%N�hx]$"�$"��t�"���j ��$l5���� ����"�r�Z�� &M�0�)d"@<�m��hš�$�������#��.��CЇ�$ .�K۩��'^��{�5&�^���z���U>�,9w"+��D^�D~-{"O��DZ��, ���˅h�����$�w��iZk�p�Qe�$���>H�uIgv!P]�TR��+�2W��������`.�.0���%8bcw[�K��}�����!X���� �0� 26x0�z0U"�̴%�\�D�)���<ʑj ���A�: .�����)j�����DjWE��Z �� +l8Ŧl�ю&�t?�K)����&�H +K\jX|6�:/�ABJ �`q�(����yl2hf���EHA�f)�і��膡ʠ� �R�S���F�~eh�Zޮ�F�|%Q4��1�*�!�PlE϶�5���Hw��n[A��t�:8�`�@����+}>(M_�h �`���p��o��>r&��9a<�g�zU���J���J���Ju��J=��Up;Q ي]Y +������YI��(�����"(��et?��hE�c��o?o�yjX h�T�bq�*_1�@�a4�2+�:f�} |��%���N!5�*_=�2�m[���Y;&d��YךY_�di�j��q��d�����l�H�h5C:�.ՁpS�)䊼�~9&��P��#� �h���>��<�+q���\����RI�A�p��7���FD6��D�`����3��Z>�mVe :1����J.'[��v4����R���=]�"�8Y���(��f�Y �Buw<�ob�}$���+F�D.h6�@y��z))�RF!Rˆb0��]�e��#M��|@6a���b�8"F +N$���d:���tp�9�\�C ��dx�W�^VՖ��?�����O�Z���=�%"���-Y�Nɢ3�DK��"���W��K(�����˯�Y����!0*�c�ŀ'��Y2M2��=�8�[0�5��D)4�q (�@>nqO��s����a�,=�N+Fj0B���)AL�%�)�Ȥ D�q��oEfp�l�����}[��J@ +��4,����S2T�Ȅ�g��̋�r��=R��#%|�rEp� (q�m�c�:�T��`n8� �L�I�5c#5Wn�(u}3R�-����� +}d1ԫ�n V�zP�N �J������ 2�Q ��a,H�����H%�˙�%��gɢk���� �5���sV`*���pt�FD�9�7��A{��:�i�)� ��3|��S[ ̇m�$��cu#l�� vDF��b� È�8*L=4� Q�:�%��S�8��B���K��3�p�Rڣ��&� ���ýԵ�Z>I��ia +��@��2hu������SAz�������9 ���w�4'ƍ� z�q�.��12D9�!�����,&-���7$��:t"�5��lj�^���|sAuw������20.��.-�� �YW�LtD�S"��-X+{* %T��AA2����3`L(A��E��E�Ȥ� &�/�;Pm�a��ª�FۜT���PL�"�(���WT�e(&�MQ�"v� ��KX��|���h4yX"�VV �+L6 (�X��M��Am ���,��04��7>��Ô�*��ҭRqNak<$p:�0dM!b:�$��m+f4:����\��W���:�8Nܝ➓�[*���!,��s8B������t��]�w���l"�˜%�K�'��{)� ��N��E�JC ��M>�8��%�l�� V��L� �Kw���^iG����nx ��IB@z F�R_�q!C�� +\���5�O����Au�H�/0y��D�m���e"BkQ�@�Qi[-j��S��Pʼn��%2{j�єR'���秓1A!�l �PnW)�A{B�/6��)�ҳ���1R'�@��d݀IyP��vI}G���]O�K�O WNi��R:Gx�ާE�} +�%/9�%�8Lj�Q�P�=Z24H�4��6+HmJ�v8�{�M�Z�F�NrR���X}T��X�����z9b.�)�$��`��ZI����0P�[��/&^]��vc2�e�1PȨF��)�mF� ,�6,�l2���Ptr��u�q`�ԓ�6���]F�̲���AfF���B��2}��2-]7K���%v�= ��)��(;�c�6]�m�����Ljp2�k� > ��[�e�P/�,t������p��p̏��K�U$��"0D��(�:ͣ�>�I��$ٴ������%��lU\�Z$�z�`����u�}�]�S�Q_e��2��c�B܃�x��@p�Jd� ���\hբ���Gm�̌Ի���"��oR�h�^��-7a ?�u�D��Ș"9P��� �+J �Y��jٳ@�_��8-��� X�M�D�ߗ���U��J'Zh�O�qբ��F�W3�V��D��E҈�D�>����r��IOR�� ':�Z��dL��U�R7PUbΏ +���Ն �,��ĭ���!C���@���@���s��kn��SĚ0/��.��290Oz�� ?�>c�^y��Jݔ1%jwD��� +�l�$K?�|;�+�/9�D*��n�aF6֊A���v4�~^����//�z��zF�u݁�z� +t�E�X�_���/������ �~}B�_���{ ���K{=�ꮟ-���ծ���[۩�(S���F��T���8 V��� 0$��˶Ɉ�zQډ$��������ɑ��)�#��E�IE�/����G��) ��ן[��wd������b�zLa��0�>č��`H�� 6����@bEX��qWog��p���֡�:�؝j���4� 7��B�豽V����Uoˠ���פJ����|�`6�_x ���e� ���K�-7� P��n xg/��VG�� �<�uYS_r� �� 2i�-N=��~B�S_��Wo깗��`!�ԃ0.��̖z��>����G%�˔�_E ��F@ +�����w�ťT��ɻ�'\�2�t#Z�;��#��;R�M^�zJ�� ��ئ�8�V��"I����r�7�^#pNO�lN�H�'أӟ(��?-:�J����N_9C�o�.��)���l�`B>�}�n���?S���kι����B�b�%��<�'��c���O�3���2pP�t ��t PV�1 ��1��畼��A*��n���ڷ�2p��3�g� ����`��[D.�0\��hKL#x�X�M�X[A�K+Mg�0�[W B��7e|*���T��&rXg��I�ad��7'DBcc�I*�NJ�*�@S��@yP^k�*�oz���Z�q:�@k��6 ��f֓ȶu:k�=��\��xp�8��*��v�U�����#$Z�ë�[UP��4b Q=3�z�*�߱ѹC��6c<����ő��̜�L>de2>@�<9D�B�n5��]� �]�������8��N$kJ]d��^A'����/Ĵ�����c��$����8`����G��abl3���*a�gW�.I��Q� Ї�"�Q���h 9 +�v�E^"h�>�FiB{�f����ԡ�@U��@� �����?��^ �,����"4��K@4˷"v��K|]X�R��q$�[#GD�$E�A�I���J�(�X=���Q�h��'�����iY��*�@�lt����9�`�S_7J<�E�q$u��LR��DTu\��(�E,)�`l)�&��$z�"&GF�6a���� S�#E���(?��%����0Q��� Q@�!��)Aa���J�>�4�\购0d�t@&k*FP� "�0��^r�/��bc�`)�R`��h��H�T�b�(�d�Qd����y�qқPP����2����ѪF�N� ����IF ��S�� ���tj���c�`�����Ay��pM�Js���,g�ֆj��F�,��"�:'Tc��l��a ���j�X�BtS�-+����l27�M�,lF!��dB��R <;%�}B[�B�F]V@KM�~:V�G����]QrE��Ԓe7��Rv0m�����F��,�*�F��E�_#���:| �B'��C|�6 +�B���Tժ4(�Ҡ��B@G��A���ӏ��duI�BE� +Nץ�{)m��A���(�V��m �K�C.���I��? 0�qA���)�@��|��� +���F�L�T-���Ig.��������������l�U�� T����)�����j��$�Z���-�l��m���"],{�\� +_TizC�k�<)x��'#�m��'����;�$�����=T8��B��,%"���,�MK�*��`�U��|�ux�� +*�$�g+�O� ���Җ�tق$�� |?؃ތ�=��8�Z7IOeC�-��K`�w#� j0\#F}��P�vcT���ςD�u�L�8��%%�5G[�t�d���e�9h7[��2��d-�݌}&\�,�o%�/�u0:)p`��h�� +sF�b1X�J��d� s]�hi>�`%>;^ ��K.�~�]A�!��#�K��h���*�d�H�����F:LG7���9_{��'�/�.�\na����/�3w0����m +4����Zb�x��*q7A_1��$��H���\ H�c������H��<~�:a�]��9�l��]�dW�"cob�)�Z�~�+"�Ȩ� ų�l\5\�' �� +�ְ���p�70k����p�@�1��"Q��|�v�%��q��i�@[a�XUNs��.h�%F��Wo6 OM�6���{Ӥ �� Q�ۚ��\$����,��J �V���Ğ Ī�/�C �>��>��"�bA��NmɌ�c6�jKX�Y���\�(�߼ �,�X�2����R�7��cȈ;Ŏ�i�f�a��Qa:9F�q��D�H��Dɐ�H�;��%M!��Xr��Z�^����t"��Y2!�Y2�X��+;<�N�Κ��4?�_��2��| �$ �����$y��&��b�)�uӾۧN�=�q�� EcB<�P��:��G_l�;�J��r}@�V�f���g<���ac���4{�i�-�>����;�U��&|�ǣ �T*� +b+؇] ��l�:���I�w;p�{hԃ_�ԁ��&D�\G NX��C3*������l@<J����8���(�+̔�M�C�իCѫ�]�Y�é�Х �O�)��T6h +��!�F�mgw~ӾS���>`5e'�L}J��T'\jp+)��`�X�1�|rCc�'�ɇ� �g�+�'J�d���N���M�8�8�ߓ����o� ' �e��@�-0}�'a�҇Dp�?�����Y/�9-�P�δ_��w�ߜ��徖�V���ȧ��*=��L���1�fz��`�':�h�|p�`��V��^U�q.D"��0"�wT��/�o���2F߲HF?�7�Ϙ���CkcX�]3am��oɟ�������F�K����_I.���P�l/Ћ�2�z� =�І����;�����C2���S�a���3�w��@��/ �y��{ ��of �m�j�@��΅�q��3����t�#���DQ�B� ����q~�89oؼ�QΧF�1y��Ŗs~@] �k�]��W��y�*���r�}׼�C�|�4/Ye*��ia�z���bPj�P�m����"�A0Ӗ��g�y��n��ʛ�n{�`�46?��?D&�F�ym�l~�$�_�"����fti��w4/�44a4�ӟ�2:{'+H)ma�E�����(�*�R�Ӹv�}@#x�Bb���ʏd���tj��y5O�4?X%4�m��E-D������h~�X4���{TE�*HE�@�+����ot��-�O�F@�8�=Ã|��T���=�ȱ5s|<��W��?�?�"��q���2�C�<֤;%FL���������}K��Ǖ�x���)}�a���]��t��=����P��u[��i}�Y���pB�W��%2�{�c�_��� +�@l�=��3j����+�g| ���� G!A2�X<�HnARAK�Y���p���S5�<��ʼ���U����������.�/�H~?*��o��X�>Bj��;)�$� ��^��g�f X��r����Kh ��p��q����>�r +a^fPŸDŽ�`˖ � T�3����Wt�,2���f�3���j��c�9'����9�T�Aꉆ����z�aɂ&F]�Ѧ&!������y�c�P�2R~�wV�yMf>�3��_�����K��7�>��g��Ba2e��,,~��p`�J��"��Y�#QY��,�$�t�BcX\p[|X���yAh�.s���㘢����"��Z9ԒŨ]l��|Fg`�@N0_$�oi4�Ǹ2�?�����`l1��R�?��{���_B���-I�aZ�@cOA��7�Y"�OY"L,>"̐�B�����4EN�7�'�xjd�b�$�d� +��cI4���O���\��jz����Ήy:eb~\_̯.�1�<��xU�� +}���xXؑV��b" �m*FQU*�ۗf����Y�!v���0'�Ĺ���i���m�<��(ˆs�L�`*���Os�8B�A��Q�L��h'��l��%���K�����b}{ +�8.�hxJ� +v�2*�ñ4��ؑ�^�S��4N7�_"��� ��O��'�\�'�������>@�+<["��;����!5$�E�R���i����&Q�c�>$�P�צ��+p�D+�1Af�?��*,�2T(BB3':�B�>e����J�1ܥ�)�$}��MIt�(x�An,�5`,�-����a[0JϦ���n��ݢ�<�qyվ���9^�Mv�T!��ϭC��]E�G��o�9 ��]~u���!��@�x�o�jQkm�A�H XF me��Fbo���c�v)U:�L>���d\��D4.�~�@݃��� ��<�x;�~�M��M�b(�B쐡��2�T9Z.p`����j���AD�&:� ����� �2J��2��E�a�9Dgs+������׋�ZSÙ�� �$�ۘ$���⥛h�E@��A���A���A�����~�p|��4V0��!E��bf�:���+K8[*�f�Ӂ}.�߸4�e'ñ� �7��5�2��Y7��^ r�8��L��n�aϏ���R�t�:��a�2�?�B_}%6'�/J0�3�l:gQэ0�L�ĵ(��es7^�C�2��y�%�Ƶ:m�V"A�3�o�ҽ�P�x�2��d⍙��^,���j�����i���i���T����A #B�z<Ô�f����~�H���g%$� ��4 G˗�#���>�d��� +E4��JO���U�r�$�G�:�"���{�S�]tV�z�k!�O* +~@c=�@B�����#�*� �G���a�����x�c׸|���=�%�R�'R��Zi"Y���L � ���zdJM*��p1��y�LS����p�Y��G�r���� v8��p���Py>����� ��i �hP��x�4��ǙG�Nq��,*O]Z�����Y�g�ײ�̔��fy;,fH�^f���U�� �a��`آ*�T�sT$��N�SSJ�JCち�6�hm N��<蕧��M���)���9h���Z���OZٜ��b���t�'|�"�ɩ��S�-�Pr���V(����A�/D;U�13�@��J�rcAb�FA�嚈RdO$ȇM��в%���Ý����5tD +<�����.�~@�u�S B�2�;�Q�j��)�)<#W,'V��Y���,�K>l���ڄI-�6� Jse�I�����lD�_� ʯ����}��~���7�=�P�k �Jp�Hs�p:a>�������a�W�z.n�u|N;��4���N��E��~�J���&�!�=�9�G�1/� +()!H�L���njт��ːk�e�1�e�n�2�����(6h�6d3�� ��bN[K:�Q�t�}�t�e���31�\���0���N%��8��61�\4pm�=���3�X��&�����-&���D�zA X��J�Ե�yT�x������+<5%����y��{γ�g��[u�_����4Bƃ�v���R�Ϋ�;zRh_�P�(+���S�[�({+��;C9J��T&��D�H����f�?���]!IkN�Őr��0�܀ٚ��1b�-Hp[�v�~q �۔@�l5�A|@�u ܳ9�E�����Q�[2ٲ���k�w�h�5o��;NQ�C54>�.h|�J�BD0s$�>��M�Ȱ��~�$MA(�+���mỲ��� Cm��$���R8P֡d��h|���"|@H�P �/��g"��Kp��0FdN9�@�B_lT�p KKь��b1���5���;�ۇ���b��&K���=>�Ņ7�� +�d�h�i�$�H�띨%\��"3��%RZ�JT�[y��k]\�ƴ>W�Q�jF����h��L'��|@e�#@��$�r2�j�|&L*���U�2�a�9]�B����$|!C�'�R�`�h$�M"AN8� �w O�E�C�4�&`H�Q�(ވb�{�&%�� 5@Ɣhh��M@~TWT�V,D�"5J��yD��UF�r�z�]}H�W�Z��l$�����׷�V :r����%�����9}��:=�����d����O�Մ� �tԳ.�҂ ����@�#?+�� ��+L�h +Jy�܈�kP�E�7��Й~&��?g���~G�J?B�i��Nt ���5��n� |"��Z����Go +�ѯ��+�� e�(���F�ʴFj7�nj��?'dC/x�л� �Y0A� |M�g�/��.a0t�Ƨ�W�y�e_�~���w1�=#S������ЯXy�?��Ȅ�"fB��̡�g-����e��`��S��2��~���u� ��IqZ�����’�#HV��L����ß$��k&��L�ϛb��F���|��|���/�P��q��YU�|��>�ED��m�&\�R�[F�U��xp�@����Tو��R�ׁ��p���"u^��:�z �|Ń�������*�z~þ���7��I��U��Q�y�[M��\�λ4�γp�S��'4��ڄ������x��Q0�A�~�c75S*m)����U����Cr�`1��.W ++�Ff �Q���Tk�|�s^P���JY�Ki�yK���M;�� ���@;?�h�;���l���p�� +=p����B�{ ��sl��3)a��-:���|��P��� 4b�<\w����b[����!n�E$E��`����6J�͏��I��qj������l��l�B ��;��yL�m��"iaUK�0uL�YӿiyS�|��y ����${׷*�k�����u>D��t9[OS�vk�|H�5"���‘m^���a��=2����|힛gO��C���o���U��S�r�#ۥy�{�<��h�jh���1��e�@���̂ ��Ry��\6��e��uMi�W�=\�B��P(ƍ�tJr��+� +v6���\��9.W󈔠��@k^� 4���7 �ϭ[�����x�y/�5�rؚ/Ŷ�?]�� ���%м���x�*w&�e�$f�~ K2���iL�a~�u��I�@����3�P�S|I�����g�/N�Z����X��H*�۫������E���hH�/D��re��i���J��w;��i�|Za��p0�_p��� ����t&z�f��C?D[�~n~��A�V i��W�ncpY<K�?��e2?�1 endstream endobj 28 0 obj <>stream +�/�̧X��[�O�O�aӓy�B�|F�����^� ��6��p���r5���T��*��X�b��Mu\n38�ă�t�a�4����X�! qe*n2�i��X��NV +l�� +���< +Cf�!b3{l�� �E��e� +���'�e���Q�1��Za"�T���3�J��,+��Q��)�F�!"�4�K�l����|��݄��� �z�M$kA�W���$@��Y-�a9?N�Uԣt��NA�ϑ��T(��U�����"�1 |�,� El1zYa�+��ŋg�@eYI��X��Mu�������WZ���c�""B����Xe� �.5������(.�˻������^��vd�&Q$[��fb/:A��c�iKk�,�8d�d�0}A0I�`�I���0�f/<�g�L��r���WZ���Y�r���a�}��� q#�P� i�� +�ڛ��l�n�����#��bk��|/��O��2A@��D�!2�'���-��13�æ���`����C�b`�����t�.����+5�Zp,~j,> &Gmr�F���-n]B� I}����mu�p\i�k$l���� ��t�$�}�d� < d�x��~����QD�4pG�aI��!I�qJ�Ӫ�_�H�P���:9�`��C̨�Ch����#j �Dhl^"4-S��0%D�f�b϶�P8n^MNm�N ���`:�@�T(E�����\����q}�/�+hqQV�•�R���b�OaF�.Ď7#���z?so]$�J�U���eE���������E��4��q�Ņ���������;�"�S`]�F�<�x��C�Hε{��u�`�O�X_�� I?@�ZI���rS�Q����|"��R��D7~���!I(�7U�E�t}H��\"K����#����X3�q �q;�)T3�kә�q���F�~������� +����9��� 5���4�,�QMB$Q��������>&�G~�h ;�@r€���B)���iD N���B}�8�����T� + �� �9�BlI��1L�@цB� �_� zZ{���~� ����#�[.$�A��,�c��#H�|ƭ�=;��EO8$ ֵ��tI"!�r�2Sd3to3d�3$�'��\' +!���9SC�6����EeK {��^���F@�p�;0w� NJ�c�Ѕ�I"�c��|F �H ".���!�]+�OK��$ϔjb��`R� a����>7X191u���6��� lQ�n�I��PҫT����ӓ#u�+Ǥ���j�ȹ⎡���1�t��j�G�8H(>3? Q^2�[2��dJ��dJy�c�貲�=,&�z����Hk19�~6��%�*/<5}���3���v�c:3�o���ʓ�K'V�4��{�(�ö�BP�w3p`�� �صC��Hr�&?�P����B���������"G�� +}�PMA�����=�E�'ԔT̎��d'V\S��� d�{��!�a�Zh��i]Js����g�]K�q5W(���my_aÜ >��wS6E�� �2��������U�XӎF��@ъ)��MT7���;����&N��*�=�(톴F��h��bt��� +*�z#���a/2Fp�\P�dV��Y ^Sc���� c<C�)�d�$�9 +�S��'ز(M��kT������y�����o +gX^LVz���Ã�ê�k"i�l����� +�*̐M�II��8�lb�!���D�:�0u�$<��6T�M� 8t�i����j� � �H+�wBt�2�`��It�9��Ny�G��dX#��2@�\gl��:A�cź���~Btc�2ԝn����n���3.:���F��Q��7'�b;Z1��£}y��.��Dg�2��d�O���� ����K��ZB]ʌ�}�Bnw +��#}:�\0IG��$�:�,6)�boJie� PX�1,m�3^RȖ��� ����0 �Ug<k�l-T���8�d� �x� j��'d*�jQH3#�yKH%=� P�"=���@>��&J��%.�G�1Z�e���iJf�m<]j�d�r©�aމ����7��1J���J�����b�-�&%�a�2 4����d�T?�W"䬺�ai~�j���������{���o�ꇮ>`ë������z7���Êze��ñ}��ӊ�fD}ʛQ/P/p�s� +�K��� �oB�@1A��2�M�{�$S��R��. � ,� TpH �CF��D�W�����3��æ� �6�B�0=�Q���#��%�� +��X�>#Yҧ2"�A�f�a�1$\ ��xK$S��'���:���n���k����pеJ�ܡgt�_]�л�N�1q)����ԷB�)2ѫ�P� +(:H��#s� �z�����o����Y©�%B"���%;���i���4|t Z�<�?L�'G����>O���A)�?@Dc���A���P��zë� ���{[>����?�=V���+[a�@�d�Ƃj���Ѷ(���x�w)�Y�YgF8�f����yR��yG�����x~C�<�R�<�A�<�Z��-,�h���L����;w������V��f�y���|����U'$�� ���+�y֣��;a�8��c�1��~J��������Ȝ���(��Ew�&:�@:�B.��,�Ŗ�[V��3��Bg8�1��Χ+�����m��|`q༾��_}"�O��� k� �y �Jv�F�+#=vS+u2�v�^NufO_�\�U�a+:(�Sk�j�w�m��Ϳ^�y}�l��^6_X|6/f<�ou��s��?�i�Gi�oY�|I"mރ�6`7���V@��I�y����$B{�c |T�|��܆�����:�͕�zӥ)������d�JXO�F4f�-����M�����k>Eii~��6O����ܼ��m^C~�oP��Po�,�ۼh�4��/��'��S��I�I�!�E��6l�Q ��q�N�:"��} �� i<���,�_6w5 t �P`c��Me�>b��&�������j>�4/�h�dB��yL��X ��[��Q[��ʚ�J��[�X�'�2�Q]b$|D�W ��~�7���gH~�m�-�u ׁ:��#��wJ0"�jJ���B1~�6 e��\Nմx�r)��� ��{��<����{An��3��?���J��G�^ބ�O��A�|��\��+��\�JU��6�5 ����O?��(�K�p�4b��8[�}:������p] W/�!� �����f�����Xgв��A����1��2� +��7��� � �=O�F��hNW�.�H���-��k���#k}��N��#���?��o0�v�����x���p����2�' +}L_/9���4�& +��g��4�to�M��,�y�0�-{�>��EgA O�Cl������Sn�����Q��jKw�0:nb��4����#C=�#��^xV`�Tvf"�a����S����͆NBK]��zt��c���{K������8� .pn�:M ��,P�0.�K؂��G�x�(T#1�fև��mv�%ﹶ7�H8����[O��F ����W*�{!�ZZ +I k�F�xDZ�u�ۂ���H|�V �8�c�; 8��4��Ehh]��̝�1�b�3���f��_F�� �I��l T8�!%�� �;,�2б�م�6%���NV�[{�?=����ۚjE���"�R�"�\�M�������J+E�a��5HY�>������8a�sPb��b�2�Z�<%}�����F��C�� +�D�4�\P���9 1$CƱġ�d +�t�.�hc0�0U-;�.ǁ���� +؜φsϻ�^�]s�C���҆k�Q��`�P�Ǽ�ꍽGbQ���~�l �ؑ����� +z~�B�N~@�<�B�*EY ���#�oD��Ex�&K��+S���;�[���Y��d���]�/� �� �C�i�'����:���Ia�� 7�x����>sw?��|�Z��샀 � � +`��$���?�G�NA=�sw����c SW�,B9��r$�|�N#�1W�:>]���t�~k=���j����mpmZ�"!�a���@��`�MV�#�����@��0�x�.r�P�K�X�D�L����0Μh|��#Q�5�c�w��\m%�:4e`�d�������bqʩbQ��4�(g +Ar���B}���F�+x�- +�p\��uC��xyH�#Q�#QK4F�g���V +�AC<�c�_��G��W�̄��CFt��CMY�rfʘE6Y��b��ҟ�E�>����� �r��ꎅ� ���<�T��R���*��^�'�Ĥ�7_+�&�U'�D0�@�Y�M� �B8�]�'�.CM�K��%�d��G�LY +t� �V�DER/���I��ɉ�H��؈-Z�rt��P��Ԕ�9���S%ٙ��&��n]�\1L�X}��l ����`��l���R����3u��j�5�r�x���-0�J?�J?�J?]�٢��lQŧlQ�U�h8�����S��A���;Ռ�f�0a���ĉu�փ���{�� �a.�k�R-��s�1��ܯU�.�Rd�� +�7+Os� �[�� ��4ۗNP�hx��Oǵj�b�\9��2 +������jl�Z9i�z����.�u��7�ɓ���=iNZ�4w�9i��ad\I^��c��Fay��?�.&0A��l��t�s��aj� +*�6�!����)�@�\� ���#� � ���r]����;���/-�%y+�~%�g܃��^�IayO���~�=�3����׵U�����XԒ������ �e��ː'��8�`�Āy�v� �4βy��k�:�V6���&�ri� v�2n��i�+��$�#��'"X�\��w.�����oj|�dP1C�N��*%��� ����X��x���7ũ�1CY�]��C�ڑF@�!M(����\s�ͫ��4�����"O + +͋5(����{aoD�@9>��[m�$���r�a�?�ʭ:z��:�58t�4҄�$�Ռ������jz��B�A�GY�_�=��8���6��w�@��P}�1���!�h,����&Ƃk\�/K�X9%n3Wӫ ��+����0}RL_�'���6�7�ӳ��ASa�LD��5�>������X��40��ϋ}�h�C� �x� ���!`�60�Xj#Fz����a9I���%�+�I�(H��䤇�����ʬ�ɭ�k���%B��p?�g�e3��:��&p�:o~^�-w&�0w�)�Z��^��B'���xjE���#�,zzr�>D�E��tl�[��!��z�=��mFr��ϓ���Gu<).��)�����٧��J��BA��Ż�ih�TW���f�0����/��]���}�c}H`��U=��2@_��}>m?���ҳ|~���CS�2��(:�m+�}����1��"��_���е�������5�����y�`���Q��Ga�5 +�5XY*զ�j�Lڪ}��np��։��p� 9�uCA�bڙn�Q�X��� ���%�Q�� t�ym�|(r�<��l^�~6�1<�G�:��Н��,�� ���o��0C����W�y_?���p^{D�`,���P�@yI;��hSɛ�kq<�{���,\*r�`1��+����w;ߔ��%�h�����A�Ľk~�m��>m��o��6����7ܼ)�6����&N�:�QV���]'�u$��0%sE�6�/�U��4P�L����:�h;yfץ�u�X����A�b�Iܺ�H���S�s�diUkP#� ���|P� <d/�2n�x�*f|�rcX�ā���`i�W�c�&��u,�+lFwvH��Uf���?��� +9� ��~Kc05�f'i�K&��@W��M�*���G@��@E�3R���^�O��DY�e�֩�� ��\>���5�����¸CC��:��z �+��/��(U&zq�0��3N����鿔U�}�9X�Z�� M �$ͫ:⦏6Ķ�w�N4�6ik]�S�s}+����$b"U$���)Óap��O$�o�d uǽ�F�c^l��9�j|��A?�g��2��_�x�?M��I��ҖB�dF +�A�$����&U�Jq�6�P~\�* &�:ܞ�\��,�N��H��?� ڿ��� +�:�}vc@��H�f ��K�v�U����<�@��YA����~+��TKM�:Z��Ph��4��z��P��f�/�M���{LLw�n�m��Me������3��N3�d�vOo7�ǒ���}$�5@Q#��=�N��t��P�N�(3�mѲ���� +`��@P������xq�ϐ�YPf�9���X��4�v���>1ŀI_��du��z�6��"]�B���u�t�mG�C�RU/0be �y￯�\��C����t�_#���Q^�������z�H�|����9���+����& 1��#|� *D��)�(�B�9;I\'�8��b Hn�m���u��5�R�C�T�(�ْ���r��Sstt�����Ri����|�A*��4��#�>ן��8`w>�p� + ����?9�P��N�����1�B,����j�8 EBc��H;m�~?\���K��7���|S\���S+��3 �����_tw�Zh�m����S\;�j�@`�&2�;�׉a����B�LhR-q����*B�RNE�J#12Ch<�����C�F� 5R�#(|3"r&��1��4�t�!8���:[�ESD)��6bM�8�H�ڀ��gSC���P� +f�\EZAB+Ğ[�v�L%�� +#����t%k�:�F�9 \1��^ \ɱ5W� B9ѲMiH��\3���4d����g)�PΎ uQ˥A󆉅.ۚ�(�Hk1�Jc��T߀ä�*����hU��]�q����k���ӎ#��E�U~�VK��b1`l�\�����ؔS�Ɣ�pPήSNS`��D�E�UA��f��������Sԭ8U�:b��,3��TL���K�.4e�~����ٺ1��2!�Zו ��4�,_�%b������ Gc&�V-��� p=���q ���K�2����s3Ԅz3�K�����QqJ����U�k�_D�F�7�����[]+B=8m��\��� �ȸ�D {�Q~0����ôj�������o���,�����$���#7d7e(s�a��.P�h,��Q$. ���Z�JPh+��о0\h3�[hI{��R,�E|�vG�=�R~?�K�7C�]�V�<:\�p� �!䂎D�d�WTA�L�1� 9�JJrl��A� Z +�ݱ�Ѫ ���Ɣ!Ԋפ�(P��(��e��:Y^��Ș�%�b;<� |rؓ"e�V@Q � a��e��րA��@��C�R�7nٗ��lέ��H����" th��НH.�&Dv��x�:! X�{���Z���聲2�8di��h[FF2F>� �A����6 L���3��3C��@#P ]�D�[�au�,u��갠��N�'���,� ���vjlq{��(��B�`J��M)��CDo���h + +i�Zp.%�@�B�~���!庭�r�i�\cP�\ƒ�F#�W��\`�4zA��sC�`Y>@2xqہJP�]��=J7����1D�/��C|j �%̀��]��Zl�`���!�,L��e�.+����������f"�ǀ��$�tǣI��-I龨X�a���@�Q|#,$t��$NcG+D�[t�//0+ٲ�诗!Y�Do�ּ�X�Rǽb����e�K<؏A�03� ��L�kx��?J$Ȣ ���F�T�"��e1k���^z3:���;�ei���Z]u�EP3��rH��4 +��E1�<�Ύ],�T����^��;�X���\Ȋ�A`NxRO�k���y!@E���А�5��,7}��q�ǘz��n�3:�ɴ��[tA����4pF�P+����qU�c�ļ�U@��pL�@2Qv;TJ��ț��'#Ť zK�Ú.�2Q +�)��cʑ9�*���XT��>`d$\��È��7�e��c����zu���pV? +pV_�k��j0bk�ٟ=$"aΤ� t^��{f ʁN���]L������ +�d�B}����R?����7���M��Ӧ~Ѷ��@�xz?@e���h��&u�I¤n�Wy{ �v\EY��P�����5d�e���c��������X;���zB�O�bX�ӈ�Rkz}���4�u�W���A�I�JE��-�Ǘ�UHǐ��,"����H�;�� l���SJ�]�3����u,�G/�ԺzZp�v��(�>�C�z�л��g�B��7��N�xB�����A�#������3:�q �p��j�7S�^M��G����|y��N@,E��_�4����;�� +' +�x(i���\9����<�����*}~�J�Wŭ�S� �u +��b��<У��9'z�ƒ�a�>o�>��-��� �ޕ�ϧ��y��~ޣ`�wW� ���$����L̃�T�e��Ƒ����p�JQLL�m�*�<ǀ��������|���|������I -(�#��;�\�*��a;o}�iQW +���" 8���6��4��ۨ�!X�y���<�Ju�{S�oyP��Ћ�<u�<�q�|��M�_5�Η�N�C���o�r�w��I��!�'�k"�e6�͏�ŏ�귙��r��3 ʜ`�I��'[1 +oG��|���pq>��:��[���y"v�{��_�a�;:��H�|"�:O��w�Οn��b)����vx0�:�+�>%����e�2����~���d��$! �����|A +�9�=��8W�3�Z�&��*������9�.Y��M��Us�ek�k�Q����F� �t �2�Ŭ�cA" +fR@6l7�\+����(��A�� xL���)�}�faL[�8J�Ҙ��tA��8oz�.j����^`��1�����x .9��)Y�3��:_���c �؎y)بn��d�5�=>7+;�7+�Տ�_�{|��=�8Ҝ�Gќ�FQMZ �m��{��P�����m"$�؃9�=D��Jm�&���� �y1�D.������U6�\��m���6��<��6VF�6VfBf�c �&����<���<5g���Ħ��禤��'�r��| \�q#��~��*5{�n�|Y$5������������(:g�t=8,�6�9���c +!B��.�cj�����j��P���Qv�� CC=C�RAIC�&��Y�mb����@���lNf���pס����P�t�5�#?� l���0pې�F���\��*P��B@�p�Ji��d���B4 �`�5Du�\��C�0h�� v��{7�GlGlv���@ r���՗�p�P��>�b�u���Mw���"m�`ˌ���HY%�@���:��_ά�k���g�'Q�@�Ch���<�3��.�=5�J�-�M��͛��V������ޢ���e �[� n�<\J�=܅�p”����� 9��NO�9�� с����]Q�Z]_�2� ˡD@3�Y��y�?|� +���$p�b |����N�A0�, Tu��C��f�6]���Jɝ:%ԫ�kF��8 ��k|��Wj��kͪ���L��)"�6��R�݊��n��ٹ(�q\7g���a��Tٱ�@�2V^��B�@Z���b�:O�rfJ��I`ѕ��2�e����H�ł�B宴�h�J��U_�yRU�\G+�b��DҊ�\�$�!����vAO ����*���'�_�4]^�lp��8�� +��4��8W񽦥~z�A��IV����U71U �UÇUW�LC����8WQ��i��X�~Q�kujhS ��j��zRZ�f�L�V4l�BP��m�L0|���ΈZA��,��GR�g����,� '�-�8C򐫠� +6+ ���\� %� ��1�X�����M*�V�i!ys  ���2{K�B~9Scy� í�c�)t�aQ�k!d������8�-����L�JJr�\�����f�������KC`�Z� �"��1t + +F�� +&/��~@ �z���������� l$ �r���!^��V@xpVW���bPq�N�s� ;MJ���&,D4@iT�<��� ��:Z� �P  �4��z��,����B��[�è�����g5$FY�6^W!7��ҥ:�ؕo��ai�L8�S&�C�"KI&ͯq��N"�8� �����ok�%i�i��2/a��,5�9�zG}��B]�B��[(3Y2 =�'7e� �q㖄��@y���� ����a�� d�ь&!z�z�:"�4� r��W҄�$�j��k�y�� ��^Pl��po*+A�J��.n���f*�Fm�t�3j<|�Bt�b�F������B��h +�k�Qx>�e����Nj �T�tyd�s$�2��� 0+6+��Ҭ 'Wfe���j2�V�ݼ��e�/�j<�p4q�&���aiE]Br��D�h��ъ�G�(�0���Z ��ˀ����tW��W Nc�!��K�%�����V,���r�Zu�� P��S���$J;���(>Z�� �L�����k���Y��p};�Xq��q +�R�(�@9@.��sT$ϴD���E���B��.�)�^s$�H0ɹa蓲J+�A]>��������2fXS��J���;D,G9T���7������H�уn��n�$ͶB>�fN�td 2��L{,��"�K�w�B9� +U���X(Y6�,�P����W�.�@A4́U�6�f�z G'���ʤ2=������jB&���B�`�R�%���%9=�w�@�IEs��3��O�*���{����%.��ĸ��h�[3�<-�n��9�:�Džc�O��B�H��0FU���cj�r�(7/%��(��}i7F�`��g8�h���9�9� ��e�O/3*te �N�ݫv��1n̏⽌�C=C�� +.QL��Z/� uZ �5 +T�TG ?���Y����N������ �3����#K�:͇{���A�4**`�kD:���Q bfF{N�I���E���ś�Lk"�0�)�SLT���L������W�6�]����z�.�^�Ԭ� �e}�"Y?��[}�i���]=��Z��d�ڸ�L�y���&�&,-E��Կ�J�͑zQKI=�0I=�٤>{iR?�5���2�?�t�-�� +8�]�R��TZ� ��,�nT�4x2iV��r�}(w%��ӛ��.�^�֧7؊Ӌy��+��qz��p�y=�>݄�g��Nc��'Q�:���#E��z�hFO9K?�0 �f)a N�xp���tQԱ�& +�\��ޜ-�0K��қ\m�%q���\��(�ҏXw�%�􆐣�m�(}X�+|�ou*ҟDҋ��9���oM�F/�hF�G�� ���G���F�d�HZ 'M&�g�W� pe��lh�dY�V���C����{:���c�i�ީ�~�+�_Ԕ��:g������ѳ���?`t��ﰸqr����VD���#T��T�I@���b� ْ���or +�xK(sq��֪;9 Ы�>�E�-I��O(� +�F��V�B?��Ч��)�z��Eφ����Z��s��RfBiAB�� B�X��/�c��q ����_Կ}�RfLv�\���Y5�[K��� ޝ�,�"�#�바㷔e��my�Y�y5����J�� z����4_@��������7�ϋ-��_��K��7���#������7p��ϸ�yXV?ߪ��ٻ&� �g'�����s$�V�O'(Y DL��?%�(y������&[���룁ww�|��4{>��=��<��nϿ@����yť�y��x�sL<��A��� �?P +�#r��iX�y�Sx�ݲ�g�7����� #�@ZX\3_��Cߑ�[1���_� cJ�1� �<�J�@T�4��N6�� ���p�j�t�0�<��t�aK:o&4�oe2��d��#���u�A�o���A6Z �~:�ck&�X�b���l�,^؛ �{��Lͽ�� �C �iW�ݙ���C���gx��="�v�`�� ʀ�,5"`���%lp �d�:�%�:+�1L��9�B�s��V0Ǩ��x�+�R��@���kH����,���8;���k���ǧZk�Z�ONZ�Ϥ �t �؅�+gS��+d��4�ק��TF�@��&!˂S�f̙`� ��X��R��Sֶ�������2 +_���O����N�����$P-�E � ���!(7+(7HQl��>�������;EC7��B � i��� y)quE"6E8� ڹ:Ѡ���y'1* ���Hu��& E�&-�H�`@��74�74JBb� ,�}�J�[�a�6�� 9�k���)�:|�*tG����޼8��^ rO#�g�7 ��ۆ#​&iRUA�)�]͜t>N�;����W�NF��֕�B߮�@ez�s҇Kђ�Ӏܐ�=�h�^sȥj��Y8����ԇc)��}�нX#Ngzd��ȴW���i����R���� l��my��ES{� +�y�G \��("U�kc�[���9�U�h�:D��V��#__�5�>PB�|�Ad�U�Z�U�����c� /(� ����`ٰ�B !ɇTag�b�;D܅b�c�D7.��u �p�C��j�i���c ݘ�@@W��M�v��4�T��sq���~!2����&�A ��x�1$�S� E�� #P ,I���z*.$���*�-+TDO�!v)�It�r<��b�l$iĤ"�?f����r �+ h�P�(ə/*Ҙ�jNs%�S!��ʒ<�GOk=�-�#��G��.�w B��uS��0|�(���=�$�=����x~zC��$�Zw9��G1^i\�H~��@R"�ʱ�ѱ�ܐ�NY�N��ms��5�}�g}�xT�����T�����"����d�)�5�܄�1�Q$�X.�y�R +{�1Dͥ4% � ��i�� �A�\���r�N@����J; e��;����6�jjL[d�飑O�$������I��(�5w�A.���HyJ�dU�Y/� +{�iM=&����n�fp ���Mp�@I92�T8�0�����Ga��qǺmb]�6O��fNJ��lA���Jm�(�ƴ|��D@�)0K���0�e.�R:�J�6%a�<����jP\�J�Rx�\8���tidi����Ӷ��l{e �y ��(\2���4�ht�@Z���A��¬H�lFacU�s�������p�z����Q����CFG-���*U�N��/ݡj+����bM-��ZZt�'�Cl�l����v ���]��k�l�K@a,��1������z0حI3"�9�@7��+r�����i�T���W�T��\o�z�{� �ZX �.�c�@�x-A�QX� 8��#�T1�4d���g �4�b���W�h���թS�[)5� �x ��/�/(��6D1x?�\e./V��P��Ĵ�xK�;˰1(��쥑�͆�?�֐�A�`+��[:��F8�v4{:�Gg4X��\N�㡐k��� ��&�‚]H��2X��t� O��Y% /^=9 �K�y��NQ +;�U�F����L�FSr�{����U(��!>�����IZ��E�C�P�&tT� ����w,u���LO +3�� ��֬� )�Jms���5�yw^���x�I +�� o�����FShT^^X~;a|L��H�����"AG/���PX%zլG���T��A��¤�Xk 'k���ee�e�M�n��2n +5&�3qxh�C�3ވ��AؑP� D ����h +WAg��� �,8��2���6Z!�j|�J]��� z�Ɗ��9���f��}<�#}�4, {y-:/վ��9�a���Ʒ�%K'�Ǩ�O�Ċb٨� "�,������m��&�D��BS�THM�"�L<$����F D���R-O�{0N^Ydt��ʙ�a|Œ��$��N��O����%3��(RZ�D"^�D ��u�xy�fѥ�+]&U�fM���FX�6׭s>@�Z١��MJ!�k�d�"I��l���Us�h:�,�@UT�ȴ�Ȼd�x]�b�6 &��8R�.�`�� boe�e3�L/�:� �U'm5��d�"P�I�"�R�G��g!�Nִ���ի;�.�����,�Ơr3WŠ7���6�kN8XJb;�xXuR��{J������t>fi8��A�O�2H9"�C��> ��/�CS�%��;�ǔ����"?�r�5VH~K����*"�Yg��������D��� �����X0���00a0�0"� C�T����B�f��Q@@"A���|� �_&s�.X�� �r(â�B�궐[ N����2-�f7݆;|'[���:e$��!y�_� ~+p·����Z���dhV��[���8j�2!���-JF +��L�:��)�&bG�ĭE�fy��=�2�S�kf�Jo��DzWR�p��.�﷼�so�� HO�Wj�7��;�=�)C����7�j(fxI�'ݛ�Ro��Ҕɮw��*��*h�oΪPY� %���`GiU +o�Q����u[&��e��� j���=J�Ђ����_�+v6�% +u�K��dՒW ᢾqS��� b�2 Q���T�e̪���E=$��mgE��r�b+dž���e�;X��¸PRj�׳��f�K ����RF=,���_� � ��Ӧ��Xh�>?B���knu5mY���,�*���!��,0���J5�r})X�Փ(�����8��"/��� ��WR]�ZM��%/z�'�I�S��S���+c�u�-�p��Y�L�d�6I������0XY�����Hڽ}�ۙQv�,X2,�ⳡP����QC��_��#�l*�� D���V +5����#� ��8���|[��i�W��jT���G�bk˓����qH�ޅ:U��NH����HTK"+�`�S +K�l��y��� �H�V)x��_��]����v�3h���U��-TУG��q�AC���E!l�bj�N�.�8(5^��5`��O$��NS��GjW^0�pU$����fL�N�� +:j�u��J�Xu+����+� +�l|���aُ�4��VW:-���]�oF��5��L>�y/ e�d��J���)�1�"�Z�'��k���!0��J'��ɊĦ �� R��ՁHa6����_T%ET#C�?t�iXC�1�%^x��������׶�[��@��m� )��L� ��`�� 6�*��o���U.��D�&��r^�ӆ��Jq���d����d�'���/S%�0�n|��>���u� +u��M�5(�C.Z�Y/.�p�T�`Z�#�`;���c;���`f�{�A���܄�>瀾��7L-��UZ{����L�H%�^� Ҁ�!�M���3���/���݊]�ԣ:�W����êM�I$���ȟW��u.���| �@���e��"��m��9��ײ'h������5�_��1��Md2[/�j�i!ji��:e�+�r�����TBF�v-���Q�uO���`�'��qqH�zو\�0\��� *;n��ʔ˹)7�?�o)Gߢ?���]� �,F�j�oZ-~����� �-��r�!S����ԁ����l@��*�|�ݯ#��>{��rN]X fʎb�����W5hVZ6�vgG��Xˋ��5��Xq��R�n� `�����أ�&����l�a��p-�\y�k�[ �%�P� �(K��� w��oj�u`���&������`�g����vh�� \5��Gߌ�f~��Və�ޢ�X�ipN�X6 �2)xn�������4�*8Հ�*��v;X��P��©*���i_�{�t�R۝U��YC���o�\(J�W<��O�~q�N(�w#W �ˌ�k��Z⶞B� ���U1`W#2�҈�:��Wc�w���-d��.;r��Sq� ��֔�o�"�NtWߤD�Z/⃍(�`-c,�o��xc��o�.1Ir@��±�A~��p� ����:��S I��K.HgzX�P���G�g3��U��DFK�5�5���P��Ɖ[M������bC��Ϫ�����P�tN����\� W��M`#�N- �:��s�V���.�S�=����w�ej~��頞�|��v� ��)����*�~\���>����eMN��P�]� ��`5B���taX-�B��F����%Q �bh(_UU�Th��#�˱D�'FC�o���/0���k������@zb`Z�B�ue>�s5eŏCXQ������ � +_�:p�xď 9C4���>%@Q�6?�\� ��/F�ǰB Ɓ�h(�t��Ǝૡ�9Uԋ�rK���<��'3>X`�pE�)��dy��+�{�X$~� u_�"����q೨��|�c��[�2d1�F=�`H���ǡۇ�BiP�- U�MN�!����ub�[8�V��Ძ�9��M�#9���j�1I�T����kJ��!}#wp�8���y3��$�f����g j �|2=��kh��������p�Ȃj�o5�����P���U���E�OMD�n�MH-����w p��'�y �R�f|�� �4ڇ�Cr�F�A8bXNW�a �~�-����=ui�@�W�]ƙ2��|Ѯ-ܽn��\U��I�4�Y+~c� ���At�$��R��#�q�1���;�8�c����p�/٘�D�(PJ�9�OZ&�W�-j�֝Ȓ�U� +x�N��N>;,L��c�� j��aOk�|?�n���& ��H�`Y;���8����&�@�����|V��AM��k�85��?_�g���̫b�� +<4y6��e�N�`��^��L4���dP��h�1?l��a��.�iz|У{�?<����(��M�v��0��%j$�`MHe�q>Xe� C��Hi�aq+�m��C���v����B�A������Q�Z�cF����|����J�E'h��P��|��k�(�I@n���4261��x���m� Q�<�=Sj�D�hD2���|���2�p"�y�C��$�0��%��<��M�-�3_0�) ��k i 1��Qc`�ʐ4��G���oR�P(���r9R�ᒯ�h 2��,�e?!�&늄�q��>��ECUtk\��f�F�~!���m�)L�at�,��R�v~���5,��r�3ve��B|�"� e@|'l��N�$�>+vs��::�Aa�� w��� +��z�"�O�++��Mr�m�� �����0f�Fj��'�[p�y��S��b���:�ݟ��Jn����cG���`� � +:�}�3�d���9K�Rq��`l^�a�:��$*�!1��_9?Ah�7ɩl�4�?,s�v J�Wp�O���9I�=Aa-a� �D!;�*++��8D�iY�ZhĮ���M�Di';�n� +`s �#EE� +�x#�Y(���A���G�f�ʻⓃρs��…Ot6��x�P숄��p ��`c�w���4K��0��W(% JǑ4��;�FF�)K�&h�%ޭ�&GH���KZ�=D�F#�Y8ƪ����>���hC$B�� ��X9�B�q���9$�M������� ��k�v �] +��@�‰��,�hCd"�ڱb��F̌s�sV#v�H��JR�H��`wO�LL\Y�-!S&�-_�M�����bw�>l!tE什.V�����_7h\]Y#P�,�� ����D +�.�K��9��:�B���R 9�T�"R:0����:�*�J�JK�DCa(>D7*8�� 4Jy����&c��z�c*>9L�"�48�c�"i�iD�AiY9�^ʻ��[�����E%r,���1RtX�� �!A@�D ��ɾm�Q_|�� +!��c�@�2�tP�]� ]c@=K�ڎ�X�$�A�> +����(?6Is��Z;#��!a����}������M�y�Mbm��hD[:�<���;4�(w���۶x��rt00�~�v�����|5fU�VES +��Q,ݘ݋gŚ[[0y�ۍ�U�Z��Ap��a���H�+'>VT�B�5sh�Q1���@ ���"� +�3GK����^���=vfɞ�3'���w.R[�5�%(�c(J��0�M Z��=1R��i �\ [�1^ � �gL��YX����-��d���W揇�h8O%r�,C/���(53Q��H�r��0Vu��5}�'߬��Ӣ����A��� 6��;��\�����r��2p?�B5�3�v�SK�!7� |���s6�ʅ��X����}d�P���cA㨾e���_tgT�4��S�(��;��J�1P�]Y)f�ݵC������2Ms?�K��be���C�1���b�] ʨ��a��":)?6ߒR�%� +���z� "�P��>7�W�Pc�6�^�g�*�|�"%{n�N[S_�JP��9��7��}�w?V3�O� �N*Ŀ<����L%�Z�R\�fe��c�.�d��v*єG'�T �Yp0�@��U�)��<��o1�t���!Oz}jT2T�j��X��E������+ �}Nf��>p�cz.B��^Y(�.`t�Ke����|n.��|/�kXBʌ�8��ݨ�s�����x�ab15�Bn� 繂δL��IJ�@�� +d`�\- +�}ɣ�����~+��>�lp�[��q�=��N���N��� z�~mʂ�6��{#u92��3�� Z�T�و+G ��H�%�Z�H& +H]4iQI��YT�O�"}��{�߯0N�w���.Ƌ�����T3�����l��V�3���o����x��%Hk*���T�kIߒl�ΎMj+~I."J+�L��� a��������a;޿<�����˹�B����j�=� d��#d� x ���!l^�Fn8f���sK\X�p�O�th�}�X��ْB!���.U�����M�U\;k�O;J��~L�x�`�~� ����o,����d �{�-K���� ��u���ypc�4�ta�z=*��ܗ�@�����A��� �^0B%�TQř����+��=Łx~쮸� +��}orc���v�技��H��yy7.���&A*�B���D��B�9�����;�&���*��$iTk���(=n�k!�#�Js�~���7Wd����=���AB����+ؿ  �����8��0��,�@sr�Yh]&�:��4�:@6���mU@䢛}�����(��C90�E�>Լ��bE��w��}3T��̹�Y��<��_�?�ć'��1΄��s����$H�OB!�A�B�D����#p�0��x�j�ky�ID�(�G���KuD:9<Jy�L��!U��0t�0t��u�{�A��gm`�__/�'���9�_9���:`r�� 3n�<4id���a�>�Q�yl�A �>�0kϢ �F�I�K��=AV0���.[ F����qW���SsR���X_e��o�*�2;����GN�;=�=n�ѷJk�H�m�~\� 2�@�(zB��1�qf"7��h�\��Je��'���O���Z����)���L&��w��C�q5�?=U�`� ������l� ��{��PɂtJ����Z�Њ��#ϙ�D�ӄ��s(��6n���GE��i�t���I����(�*��������q��p�o>��1�!>�C��y�_]�_����p���V��p���h��.Ld��(�+u�+�u(�X�Pw�����M oI('`K����.�z@�1�N-$�����F �s!�y�����B��nA���>�{�O��I��{�z �4<"�?}P�=��0�|�1cQN1cч�r�� ��;j�EKR[ޢ�qd>S �ePbP��u�%�@E@��֋N���� � +I���@�YS������ ��p�>��=�S6��KS=F%[�p7|G�|G�Ƶ�ц��dE ��S)�Ƞ&�ÉNA BAT E�ud5�U��τF;�� >ZH ~b��%����t�����G\|����G#9��(�N��M�H�� R�����ېh��"��(EjU�Z���SI� PS)��J�P�nI9N��w����"��dF��H���:|o�>��~�� �_���ﱑ�HP�2�V��%j�g�Tr��ҭ��R��%ʠ��/�J�x&�c�LGq����D�[ +pOjAJ2`�ZyL��P-�79��`s��s�C��G���1��Y=|�Fz�c�XiNIrT�cQ �%0�Bb�T�80�I6���5|���,#��`N�c�9�f����59��y��8gYepm����\K�V�O�ÿ���7h+�����z��<��G�:kū4z)X����A�}᱒����3>��Ũ9�����p���X��8A-�Q�&���8�0���"�N�$�K=�����}rUR���e=�1J%����a1��6>�����pl�puR��0�U��� +]�T{*���+A�垃%r��1�_Q�!,y��:��Y�pjI�, �.$M����T����P�b<�-��p-鑂'b�� �%9�2~�X,8���0��y�^�"A�Y��R�/ J��Pܢ2��4y%��:���4�&*�Rh7^�0�f���hO=�\D�rs��?���E���/z�u����4������K�{%��b3� *�8!ٓ�y%L] �X��r�)�)�i�4j5F����8�Z- +?9�(�2�o��ce���!�,�CD��s1�J>bJ��%g������\(�-�eR�W��x�$��$�fRS��0��4�[@�{�R@\��v�aWg�~ݲ�3J�|�zy�c�c%v��!����%%0 �I�Ku�rF��2f(#�P��<����E��V���|�׌�4�V/�E%�!W�K;�xluam蕣�| +��&;t�U&D�OЭ��,M&� �9~��h,����c�N�T�X�XZ�+��upI!�Gi�$6��7x�Gs�5��zP�u�3�J���8����U���I-�3?oOA5��g�{���{m�@QK�A�L*�P�<�E�kK)��Cځ�f/��+ L��f~J7hT��rzL"Һ�!+'��mk�x��"m���?)z +�jg�"}������x�����1#�TfN�Si?ڂΎ�b���E�]Ŵ"�L/� cv�>8 �Q�����8���/��vҀ�� �fg��0 �5��׈�c/�J����>����w�? >ݏ#iKҗ�ҙ�ȅ�i$ R�ɚز��$0��r��LȌȎ� N�0Mt@Xt�m�NM[�{�cz�+]j�� ��C���W-�-���&�������� ���bJ��1���5�Z޳�%iQ�*_�] Q���*����HJ�l���u��D���t=�x �UU:@?�O &,Boe(�������P0�/��7I�R� ,K���cz,��s������$ nPe-z�0oi5��jdќ�&AS2�R1�4��Xp$-�|.Awu�1��Rݫ@ O�hJ��4�E��K����Iw�L}\W�ښ��Z�I��B�D�̶*Ϭo�x�EǏ�)�Ī��f�� �<"Mi��ϸP�\�Х�Y)}^X!������+���]w��P��}��n ��+���.�s�,$'ͪl��uo3$r�L+)q�`*'rC��l<����먻| ���c��R�Ȯ���L�~�Yy��x��d�5&N��g� ���k���yg�� FeQ�>�$:INU�r�hU��?�g�&fP�=!�V +��1�! ���\�*��%,-q]z��}��z�pu�9=������ߢV���� +�F +�SZ)T�X�4h���ϪMKⅡ��"�����F�R�TSxJ���a�4�*�e�:��� Y���G޷#�g\w����D��L��1א����0Z9�h�5i�� ��l� ;ZI|#EZ0I�B��M�{e��^���Ml>���*��p)�y�Ţ���rO�{�)������#�>&�t_�Q�_�!��� ;J���8 GndѼ7�Y����%qI��]�W���9�ԝo�4�2W�dDv0���{(��umM�,�d�?�S�5����S義St�c�8�{�A[�ʲ���2pi�kv;'� )@'��̩�@ۧ�{<�38�a��VLH5�@J�UOGCꃱ�\�B���}t��>�̹J(+���x€+�ĕO�K�6�� X�I�S(����>���S*T�� +]oP����چ���4��9$��Ort�m ��;��e����}F&��P�~�It_~Q"/�\� a]ؓ����t#�G�6�:ȳk�YrxL���S���L�5Ch�OM�i�I W(�Gx�R[k�W{HK�B�E��[���Rs���O���{,`�ܧ!�3��Y_ J�8Y��:��s]���H1Jܤ�v�=&"8Pܾ� +��{r��#I�cM���IP��w �����5�d�}��� ����r�c�Fq<7"��@A#�$�l�c�*Spg��'E*���nB}Ha@�G1�t��A�;��zQ'����DpZM��L�L���a]�U�}�n� �ɠDl�E�F�J�X���x� ���z)* ӝoP��D�`�,�bhQ^�jj����gTZ�:�-��_!��I\�,rE��v���wN�qy�w���O�Az����+�����6�X��y��H]0�� +W�㶔��W�Z]���}V�Ϙ��7r�[���{l�1|hRk�k�܀��^j=��Y +�S�z��ҝCV:A"�Ӂ1�A��hMW�9��+�K" ����2�H�*PnV��J!���F��bbV4����>��u}�^�>�g��� 8\=��i�1�Q� �C�l��uFB�N�>�]7 z�/�-�E*�w�t>��4^\ ,��U��U[��G�\4�)ކ�{��}��� ��Ii��3%z�Ι�*��q���Q�`��Gl�0G5�<�f_ +���PE�{�|�F$�F�`�2�'5Y�����i\��@�\�3��j�A|��q?�ܟ� �X"���e �䇫#ҊO����=���J.�P-LHA���:�@���}?X"�H��W(�� �ݴ�Of��R������eMR��ט�� +�VY�_�t�ࠒ��]��@<����Y4-���2�T,�Jd4���naXG�����BF>��� +a�ai'�c�c F��]� �~����VsV��Y�/������}QԜ����S������0�9�-��'�-CQE.�DӇ�c��XI���N.�;1Z��2��CE�ڐ�l�Iqܰ0 <�4�WV���楾(����9����{��r��c�d���Ӑ���Xk�8��㦜�ܲ�A�,�Umؗ5����2˘ܩ�V7��S� +���-Px8 n"�.�ȁ��M�L��U"xRi�2��c!%w-q��  e� ]�/��z�I~t,�<�\D�/$C'�����1������kP0��Y����Q��"�ZG���(��c���+4f���T��S��h�mm1<^/ �˗����� -R�:��Dzͳ���/��F�ي@�"�ϙ���h��ɥm��p/�֦��w� x�T2v�]�&��{ �1� E��. +��ɽ"�T�)���L�E�=3��1m��$�W��&o�z��U��)�j�� K��ci'�8'Mъ�@r�Hr�V ��>�Y|� ���GÂ4)�E%��2C�!�U�����i�Me��T�1�Vv���y�J�hA�L�ʒ���d�Aw���j4ޏ�L�{lv���9��Ak��[xG3������M+y'g�9X)�!6���/hA�9�ZZȩ��V ?#�e=_�:�����["�c)�`�� ��/)S�_���oD���i�� �����qPȋ���8G����(#ѧ,y�S��ia�����:2���Va �*�O@b +���YhR�"3�TQwy���/&��1�4�S����4jSO)ঠ��MM7�P��� +�:Z]&��~�ڤ2}��B�� �eD�x�Q�8%��QT�w�U*߸�é�d�����y�}P����X�go�Q��J�ؓ�i�N*�E�u�h��J.tl�V�6��Έ7�Nփ� ~Tߨ�?ꄳ] <��ęRJ <*�5\ý���H6D�l� ؚ�d�Wʰ���||�����~�h R�����M>�'�X�ۥ(�b�@��P���5�^�餹eEՊ[ @v�4�����n��}H���dP+lhq$7�X�[�}�)�N����=�$xff}��v!NY�b��Ү>�DM����@B!�aң���'�QyU+sY�Ba�/!�����m�i;�I�z�,~Gp�F%��Ҝ7��J[5���f9���>�D!u�W �HdLH\p��S������=Y�rE�=F���XW�ݎ�����x�¢��rNt��_��R{L��r/����cZ�PR}B�u�2��DvI�T2Rxl�%���a�m� +ݿ�o���#ּ�1�%⼞���!���'"�B��z.4�Đب��;'�{R/�qhQ��"���҄���d�R��`��!��F��+5u�=x�;6��w<օ=v�(� ��4&�R�|J����l�Y�ۦ��8���� +p��0�nz�B�5�B���c�Q�!������t�_Bd�=�y�V=(��)ţ�m�Q��B�Dgf�����.��d��) �����S +\�#ϡn{E���a�!��#ǮA���x�˭�g�� �R���� ?�=%E'�)��] +}�M"p�qePܥ�x��hy�:� (|�c�-�������~v���X��t���,t�U�l�H���s*�Jv�<)�TyL�k�!�*��&��1���>� +Cq�B��.������A��6�(@� ���m�R5�/t�����}�`�>c���R�%�W���$N�i�������؏)�O�eJ}D^'q�2����&�<��(� x6X��"��< +ߩ �]`��V>j�Ov +��2j�aw_5n�ήs*�/P�� �G�Iԧ�ǨI�%�Q���Ga@�E�t�B���~c�B���L�$���<�.Pi �� +�L�[��3��>�pw�c H�}�y�c��\�R��2ԧ%0�>�]���X!�sz��m� ����-�7���x���'�s��H�F�t�|-PyL�y�V>2��_�d��s|�}����q����)��b�D5�S:�����&�-F�Č��F"8 �/���Z`u=;��{�E��a$EZ��(/Ci���q�|��T\�K�x�e!)����H.�|p9�;�,y�GYz#� 7enI��YT�D�PK)��Y�繛���x�);��# y�K)�OHc<^�EA�!d�a��PXd�e�)� >a� �1X�Y� aPn���WCS �`t���w��X�V� +I�.��l�bPC�TW���b��U���)���L�k2T�`���3D���f�������Iy�4:��qn�W���������X΂}����TDN�3:�c�-�c+��B �ö�� ��Y�2YԹi��hTCh�[�`ʒ�V�z�JuU��!Kʞ!V��� ��\��G�yk� N/�>� �(�����PߟK��G����Arin8'�\�ӢQE�KEt-M0msա�*��ж��i3��zLt�w{0&�����̚���K��v*a�O8�߯E��Nj�}�Ѷ�`®���thV��hT�1�j�Q��c��ci�@����������~)�w�=Qf�0��#�C!���`�}�|�c��~�Y�?F��� U��SCi�|��H��f�� �Ӹ1�XO ��Pɐ�6j��Vu�pHǐ�z�?i��^/ƗR�ZgU:@{�y�`|��)�?>��{L�*�Jh�th8��G�q��IK��?��`�å�ʙ�HD{�azE>���I��L�\�ʢ:� +���:�?�����G��� �.9=F�>��� ��N=�ɉT&��1 +�IC�s��~���%��V�!=�J����V��3Z�Q�M��h��o�q=�r�V۽�?t���DŽ��7����DPӇQ�6 �N:8e�Be-O���l<���ɫkg���T�s�C�λh��K ą�ϷӉUz}*RWeJ�V{8��p�����Oa��1*ঠ/qӑ�vSԘxS�y�ȲJ;iZAz�(��4�ʙY���:$��q ��3 +�x������������j �s*�{8��]�}[Ů��A�������A�,O��'1OWQkc6�;A������FA�/�w��{Hv��T���G��G'B�HI���R�0��C�����(���-��7�!� Ç��đcS�B�f��m5`�}Q +�O��1�z�k���t>E�=%L����O�m�'�A&ԍ�����PJ� ���C�ϹD�����ǃ��� � �����ma32C|��t�vW����V�,�@t`�z[c1&���ĞRD_}�ĝ�U�фW'L�c���H~ �X������Nڱ���S-h�;��D2e�Xe��ͦ��%I�E ���,��@w���11�էs S��3���J������T��p+�Sy�c�촷�'n�ܟju�+r +ͪ��uG�S�>}�����q���{c⤸�U8���E�4&ŚDV-�{�G�\�{X��)��=�;��I�ț��l +Y,G���u� � +s�tJ4W�ȍ��!�q���s:p��ǿP��JS�xB ��"yl�7��Y�^���|��� P.L�RT P�=��.fni �N�+J}Rm/[�o��WF���#��ɷT����5ER�t冐C�[$B�q)� ��@�m��S� ��(���P�gdר&`����O�� +�xLe������Q7lJ�x�g���Q�H�x�I�&�U��/y,W����d�`f�j�h��:H"�O�?ۦ�vLhwN,ē"-�n��O��7hQ7g��&AU� `�"6L�c�3e�^�F�d��0�N?��&��Raf�c���}2p"��;�UwuL/{P���Aݨ��"�7�x�2�B�l�t`�>7�xߣ��_!���X��1s +#~�j$ڮ��!�A}N���8���tuJ���^�c������;���M!�$2P(2��ҡ3�Z� ����ߙ(��`\�W��}���U�Y��h�@���VG?��iQjuL���ڗ�!���C@��$�~N�mq���� ��&�Q�b�C��(B�Mg���co��}.����q�o!��W�:����V�e~},9<)�t=+���!Ɋ����R��|H���)�(�m +�Nwp|x=ʠx��u[2ܙMo�)�z��sw%���<�1�y�c-�;_n�֪���ɹ:�S��<%���r���؈t3>�Ae�!��S�A���9�9��;� OYٓOd]/!R!��RS����w�����x�c���%�@�C3��vlZ�L�{�,&���NdSCM`���VV�F��5���T2'�c�<(��2��&3��{�ԕ`MT�76��"a����Q8p�.CJ3z���Q��()G�@A�\�r��! +ɢ*�6�+!�,5��r�� +�fV�Ӕe!t�P'=�L�*���hڂ���1� � sP��]b�"H�|�Xʿd�$����g펲���%+ܰ���ԡ�!�(�y/�8=dD�pU��JL? @�t�W�H��.�jqd=c|Z�j=(+�媕��m��?\4�l��&�HPΌ��g�lehfuHP3}T#�9��U������������;' +����%2�O�c��m��W���`��]* +�H+�<���n���-]�nX�v��(eh��j&�vE"B�h�ƞܧ.� �j{��%3L,-�W&�q* +h��r]_ ������KW�o� �:�e�=6�-��3�� �έ��ek� 2tV-�4�l�ӣa��xzL��h���ޏH���̰)�[G %�Bp�s���T�PV ����G�8�d�$Fd��1�@�^<��Ռ&'�b^g��E[�h��x�����2 �<0��8-�oY��DX&��0�ʦ�`��;$[⋲/�1� �=f�xES��楼���0^gk; +�F=`O����aqHhJ�=y�Ϋǂj c���# +���<��yA�P0�w���B�t�����﹠P%���B��� +I��"�O��}���߿�qO���ɑ�ѓ����>�(��.t�����^����)���&�W��+�jR��zCY�L!H�@�L�횈��c�>��1�rS��JQ#g���M=%���ZR�0yW������Q(J�S�*�N� M� B�2��k6�{ ���H��/���3,�}�`Փ��RYu�XSe�XsC��+5HW�] ��؂�!zR. :�ުw�R��K�x$�}��z,�}Е4:Jk��9`9lTuwx�2#�.�n��Bm�����8�H�g�����G�{�8���H���I�~?�)�O��X��Po(�W+m$���M�.�M뚎�S��S����F�fm�*vX��i�~ˣ>�'�[��G�Ɨ�P���Py�x��7���{L�)�_R7i�J�Dr�a �.��Ժ�ԩ�ѩO%T�>q%����l_6J��>逞���-y���4��pF成^�ȫ@�������'T�}�"~�c(W�0����?�]�>����UIl�i���lS��;(ֽwR���o��h��< +}���8Q���!e �W���#���M"����}=b��.�b�c�[/���B�f��ElW�tJ�wJpa�X&���<��~T���L�]�P\�\8�`rH���*PW�~į�*��7)��{�c��<�1�y�%z3{7��^e�o��D�s�.���+q:��wJf���xn?:᳸G�uש���� b|u��=T��B���C���'�������/�C�.��J J������RY����B՚�����a�IP�~ˏ�UddM�d��U��֥����W-0X[��p�J��Ӂ{̓��������� ��I�k�H's��Oٖ��I/7 ^1����hkʙ��ܠi1*�3�`�gKauPRS�*䅲��e�0g�G���`A,��XE�2#�<���c�[#dN� A#q\4���Oq�*���������'cO� �����x$�R3ņ��8�{��+�1|CX���������-4��G�Ou-�]��ۜ�V� +��*:���K,J�)KِRvqnL,@ʑ6s��ޑd4f�(���g?� +����N���T}�_*���}�E[0�ԊV��U���J}Cj���և��„W�zL��Z�����NHyI� $ָ��'B��$�r@�2��"i)�y,��ED��Z;ʎ-����J]Oܪ��]׸2��b�%������o��_ e �)��Y�}�cnq +�`� ��c�k���� Kn`<�YR���(���|#���WC��[�+G�XZ��������l�/�dXnu@����2��G<�.���QI�� � +�),�$`�-��$�nG]VyU�I��l��Y<���@�}�>)å�Y��&*ׅ�E�Fb?\�01��Hb���GJ�:�;bqH�� �$v �8�&~���$�EO�U��PFy�)���2+\�/�E�0�=��^�IQ�����J=F��U��,��Ӛ�T�"�XP.�6����\����L𧃡��J�U�r��"�%ѩ�-�cfw]�X�Tv�rylU��u� �j�ĚӚ��ÆT�xE�%Q=8��7 D�Ѭ��WG׼ ��ĵ�7��W:��*�29ت$Xv_�J��t�ű,\ѱ;ˏؓi���zi�J#0�l,�lL�ƉB�A �؂���(5��9��{�j%p�U�ue�D���%cO� +��o��cx �����,l�����YŰ�hV*o�ҁ�@�� �Q�4��*bB>w�h�m��-�6S�-2B�� ���,���N�Znt܅o�����SC� +rB��H��F���EB�Y�0�Ǽ��|n‹q�)N��f�ВU�-��`�;���1S�--*�x�b�����-�B|�d-���@��,-�耠��s{�q��4�[h�y,���)ӂ�����>j߀v�n�퉛bj���뱁��9�ᓳ�N��9-d�����W��>g�p��+�؁��0�*&��\���L|�>�v���2|S�m]j��(\O~%D��x��� �k#�h��]�})��T����%;�@�&i��R����1�����D����E� 93�.g�^͇�^e��f�ܧv��m�&���y|@��qæH��c�k���Y�- ���}�ߖ����L��ڄ1�׌���A�VRO�Z��^�Ԭ�"߹��P��k�����7'��a2���t:a�[.n$g��B�$��V]ΛN��A�͕:e���ֶ���U��;k�f�gՕ��сp�0��na$��Ö��h��c\̼?zO!�V]*�N�+J����������LlZ���;����F��Gu���P�do�)��//ׁ<�oL&��[�D����c��<�1�y�cs]��� +�fqFv�bWv��1�T���qh���^��LhvP,���++س2}�gՕT�ܛ���e�u �#oL�ӄ[��}��~ ڿ��ݔW�*n���YT` \�(J�F���̷� Lϼ�?��� �[1�P#�Ud���?VMC�C�=��1M6�hN.����rj��}j�R��('AM��Q�FR���P5/�X-�Y*�Y�����e-�r�2!��B��'��&�������|��b��A����8�Km@�wG���Ea�ζi�_HY�(/�C���.#�*�V3�����1J���T�����d[ViG5I���X��r����ݎ�P�=�^}N+�k0Ƀr��"%���ԑ���N>�Ui�D�!�[&�ս:����<�)��tY�+b�.m��踧Q +�"��g�T����1A���./��~�6w�[O8´0C"p��/d8a� + ���c'K����XÒ�,�1!`����wE��`��3�@dc��&C�Q��髓�Ԑ��0m�̡<�[���F'O�fy�%Q',�DIվS����lR,�Ӫ2��1W�s��Ŋ��: YK�LK�.�V[��:�� �x�͝!�'��mD�$�0:&6���M��Τ��|���1�}��^��&ي#� R�gl�y�2�`� �A������x,�p@>�Ľ�3~q½����Fϼ7k��4k]X��?��}3�o���y�I�Ѭ}��}�]k�ٱ�N�� �No�L�p»�E�H����+�иXc�J�^T| �&�+*�b/�=0��9� ��m��L3�u~"����Iě����T�iqbtM�i�� ��&L,�l0�L:�+T�8�Ȩ ����RID3�"��V�P��~�g�#PBO�A>���mF����.n��.���p6���/B�ʻdG�;g��-��@� �B�K�%�8_I'�"�� O�nn��N�geB�E��)���r)q�e���1�T� ļ'��̢@�yŎ +4K�i�� ��f��O�z������E<)B�����}T&�K�2���訉�je1%n�J��X�P��C���jf��r}:rs{,��d��j��G���<�1�y�c�Dz�!3�54�"��¼$�r8�*��j���+�m�+�:-�;/!�����!����M������0z�r.�h�Ղ%���f�x��K�zL?"�Z�]�LWv>-�VN�"��M|����*�N�[d��80݌9+ue�Ua�f]� +��֩���݇�֜�~�˚���Ç��{<D�`��� 7.�FH`A� +� +�і3Y��\��U9�n]�e� �o>���P������ +p8�����h��t���?!-jЎR�c���.����oT�iR���:�Z�3�ψ���R�� +sD%���-�U�X���ɝ�m{w�(<�/�I�������c���)'k7�<��J����/9����� ��5}�^�=>奓l��|P�ͱ�NǶ;:�@,4��B0��/ "�� C��Wb�W��vHbf�����V��tܒw�(V�p^�ά��Ӡd�=vƩ̃�M����f�H1.#� +�E�6��Ǡ0�w����LhGA�-�.�Jhb�U��/iU,\݊_��,Z5qf��$b���U9)�j�)�����B�a��ڌ�wMoJ�Z�c+��rv���_rě}��i׽�!��A��ѡ�����b�D\�&���g�1R�b6�}��(rx��'���5�1�b��Tk4o��Jb��yPF��x���&�V,�P�IJ�/�J"&��<�� �6� �x[��w���Tg*�$�I� M�=� :y�0{ҋ�ޝ�8Cxf% I@����҄��$��_s[*=��ԇ���d���3/Pe�in�,�΁ �����B~�:Wx�"�P�fk���.P�r�%��!){'����r��d�ә�}��fosF�P�h�د��X�Q��;Vp�<�ߠ�,(��ejO��I ԡ�j�����#���<�h恨u� �P�Q�~QZ���i}���❆� �L�X´3�j):+j�Q/��;�Ȍo� Ro*o�L7oid4o*G��X�\���ٔև-�P���hB�g/�5���ꌦ(6�E��<�1�y�c��<�1�y����!�Qq�$dB�U��I70��챭e�肉�u�թؙ�=���aE����P �K�g��׋"�*�O,y�c�Iz��,��Rm׬atZ���,�aN�%y50+Fk� ��g����OX��Ѣ�����J��.�@ ��J� ��� �7._I� 4�����"(hϧ����4�U։N�uHڈWN�~;����zR/>A�wˀ�쑧���hH{r���Hr���Z+6��\���%6NtCcФWh~)�%���X�z���Z�]K8���M�׆�%00HРp`�HBf�3�� �� j���-F�j����*�C�x����r� �,k�f�{l| +��(�O]S ��jO�n����u(����F���]���,��� + ��?�x�ȹ��3�VY7V#�,V�c&�҈g��M�k~!1Hq ���*V*g=ۇ�*C�P%�� +��A|��(фJ�f�.cA8�R���R���x+�]F(���M�xlK���K8��s�L`*+6Q�>��7\���5,�Ek� � + 0�����lӡ�W��?��^"�g)t�I����"j�F�j#�&d�Y@���9fN�1��J^�1H��jmڜ<��Q��j^OAo�Q��+��i>�'���3a�e�N�� 7���yT^5/uĞ,J�E"� �� Efȩ�3˜A�)sC��G�G� �{� �ds~�yJx{̭�P�� ��-,M3(��ę�����l/RZƔ���k6ΐe��<�1�y,�d��8�W��r՗���䠕���Sퟺ�> �U��*��+H�A�5"��� �X��i�6��E�U�^��{g�l�)q�:��i�I��ϯ��f:���0P�:�{����* �d� �ԡ +��b���(+���۝pWf��v �Z�-j�����^���J�����O�.������n�ﱮ���'/�C;���L����`��\�7�O�.��O)�Ԛ������)O�+G��lyV��<���g'`�w/�������+���-���-��T.��X|P�%�pA�� �}��h��hi�B��i��_��������&N�{�a2 �G�E�^(W�a�Y��X������M���*��j|��~�v��� +|�_;i��1W� ������!��<#����@��O�)آ}{�j_���p^폔S��h�A���ŷ�(�b�1H�^��v|� �݂ �}��I��g.�����l��Wxd�Xi��4��I�y������J +|�B ��!��|�����%\�Sw��2������q���Ă�*���k��˂ |�;~J7?�����T��}Qe_г/f^����<�wU��������_�k_���J�s���b��*|���� +>ɐ�e��ܡ�/2z�{�SU�׷��*#�Q�@��Tv�G���}��f?~��?Sm�#a�}N�d_�n�ς��'���{�S��KP�3(�О��� ��V |�� |�" +��a� A|�*|H� +��~�!�ˀb6@�b�1���YG3�|�Y�3�!fZD��i+K�j&q��\��-J́��͆���u�F�v�<8�+Y9� &u.AQ~�l�?ϾhA��A��,��DH�X(5��]I����� +$�.�\�Bs]�U�W��֪ԗ �Du>�؂)�nwX�b,��'�x�l�+����!u��^�N�gI�J�KA�L`F��R8>���O1��1g+�� ���T���q=6!T��a��[V���<���b>h!d��@�6u��Be�[����Cp J���(��׉*ƒl��cp�%�O�� +��� ��=94�| ��40�r]��g�!Kb��)��UU�vs]��ĮC� �&*C�I��,d����E��?��" +��|�L��)�H���Q��At���P&�9mft��m���{,���ѣ#P�|r�RhK;��*'g�O�|�"ʋ�䑜qEꕅ�p@,��W���P��E1� r�%` �R��BM*cRSf��;j�����r!�/^�KFs���+ES�$��D�(j�,Q��%'�����S�k"Q �MLw�����RT�_ +5J8���,�8:���)�q�2:�?Qt<6R��;�ZDH�������2�%8�-��1�q"| ��> %�0�O���@ �4� �,�%��)�J�)=�� ���2*R�������Ƌ�M�nZ���ń�=���� +�"���X���Mi��2����+�i���3��d���(�1�Jg�&�a�B7b߷%�t�Ԉ�8��\�$6�c��f�Ɣ<<���ޔX52�%B >��o(e�e��^�sa�'�D���~X�_���UU9C��Z���7�o��l2� ТF ��)p�w�XX��RNV���C ɭ���I��Ԡ�����l=��B�4�A��MIDO@/-�<��\�D�1O�lZ�J�HD~ �)|��~�tl,��ٴ\�@�r����F���v_�2$8��uw�Ș�f�EΑF'*� �I��8��`�xN��� �<��t�Л�EQ +�l�2H�0vQ���`!D�fw���X���!H�gX§���?(�=�b�w�(/�{��@�F���i�(e��-֦U��e::�\x"��I�b�sh� �`�@�IK �F.@�1�~G�O�`�D��|�/ gq W�� ����x +�ݜ��ۧp��m��.��q�*K9 (�=6�3�l�L5�垣�x�M~{&_�D�cH<ļᕠ����� ��H��Ԙt�!t����^zҰV'�Fg��f�S�p�߁��7��������m�2 Z��&X �� ����I�A ԡ���TAuJ���L �̏#7Q�yE��(eZ���2��H���i����S�9��\�(� �R�)����'��*mc�D��������^�l{OE� ��P+ ��5F�Iu0%ty�$T %�,t�~B��Q.]s�_U�4i��SB_%����^!���g�r� �n�����2&�/z�� �L�(/!��Tm_��'�����#,��K�}4��S��7�=^:�1�XPIc�CAQ8ݑj*C�fW*Jfb�:\ӚW~�bM"�+s/B.Jh@�����z�/� >)�|�۾iz�yG�� ��bw�� ����g�� �I�ra����h;T�Ё��"܍J���*�]YPo��Q�=���/�@��X�i�@i?�ڵ?��/T������E��� ������$>��F�0 >'� ~:&�T��K$��!���#�H���R�U^N53�B��]Q>�E���#�}O��>�������о�h���fJ�{Y���־*���ؽ��� m�+�l�\1�'9�8+1�/ +�?���_��ɩ}�$��!_\N�b�1��?" �*�B��c���� ���7��k^��7G"���"�o@T��d���TR�ȭ}U���������*�/���c�����y����Р�uR�J�X|�JR�G��O��M�={|/���}���x�Ϯ:��X??�P_Q�>�� +�k�'������O����h����g��;���A�F4Ҿ�Ѿ�y�0F��be�+�Q��gTp1 ��'T��w6*�;(�)(�3*�Q�S�ב=�ӑ+�+�|H��n��{��ʌ�/R���!���)���6��U�������j��T�_y�]G��� ���N���6�ީ>�Gب��XA���2�K�đ�s�?C߁?����p��� +�� �j� ~h�|i#�4$�A���~ +�_o��7"��M�Ӿ�, \���@��ë}�����Y>Y���'�9#|Xh �u�����>:|/Rn-��B�؊T��Ԧ �Q Nޣ#H�i���L���!�f1F ���%RQ��#�R�]�ɢ#&�c��A���|�����p��M1!If�8^�7��J�ZƔ'"�xxx����=^^�i�w�W��P#��sy(_���2��{dR��6��Y�JP�EYY��U�z�����,@:�d��]P@�c.�u���W����c�����"H�_p9����ދ� +�JB �$P` +qa�P`�D��pĒ�W� �C +Kbzw��bq�\�B�,�OE��^�i����Ρ�s p�s 6��E|�\G�$��YyN��NЎR����(����$^7*\ ��HI*0�c���m�,|rԢ� y[&�`�5�H0��:^&e^�l0�U�t @�9_} �'����$#F��@L�_��^^�s����g����� K�Oū��2(���(�@���C4�h� +�+LU�$D֑N�2���\<��-�8'��� +��.�G��K����c/*�$?�bЖ��pjI�nҊR#�$ Kr-<�e^�n���:X�e��|�DR�}�� t�-<��r#�J=TR��rqR���ʄي3�T�tIz�+[ ���U1� lF�J�sZ�(�����B� �h� //��/��c�;A5 �D����C�!��򀪭��R%�E1�T�-D҈���WP2�R]Ҹ���t�G��p�t��S��k)V�'�e����b?��� +�l���i�(h���i�c�L�Ǩ53�C���GB1��� �+���F���n$GBE<���b2�ea��W �������lF~iZ�IJ�C�AC^� C�@��Lu!�c�Kh e�;F��d��$�MR�6Ȩ��@.�A?�=��9�r��ԫD���ί���>⥒ST%$�ИcAA*�NJ�ڝ��M3��C�]��IU�H\�JJو$�::z �c��E]�O$�#�(0B�$���/�U$�+(G Qߠ&I�Nd����T`{�/��*3,�"��t��`�A��(^uDY�M#Wu����b};I�g!�tV*����,p *���_����z!�7=�������:�Hq%.�q?�@�Wb3��h����i$Qlgf�m@�X ��+'��^B��Z��&��h9�-$�J��[b�E�����9���_�T:���e�L��ҕ��1�ΚE�p�#~h>f �c*��eY1r���������>�Ա\�L����o�)NP���{Q�����2�� +�|��s�{l����1M��pE�f�����|P'���3(��8z�UI��zk3~���_��l���li�~�7.�讐\9�W #�eA��)h ���Z�2'6�����H�AĴv\��E�׫zV=.GC ~P�ǰjX����C����P�W��Byl��|JO�}���@����Q�����LdK�Q��`T���ʯ�3���L�DH�ݾ�Z�ɸ2�'���Kf/A���� �>B�@u�4o@��X�S�#��/VoU��rcz���$�S�J�LF��c*�{.�z��&2t��` �a�p�2��}��u@!8ᓰ�}1%jvGJ����e�e�T� 02 }�$��} ���@��i֌s 7-�8qu��Iv��꽤kz�t\Ÿ37;�׈�2N'��PQur�ue�hP���|�\�X�֙����T�����24T*�ʈ�J��GZ�����W�_����qj��$�����Xst��UDI�0M>�IAFӼZ����� >i (B$��:n�c?)ҬE�i�"�T��S� T�+�J2�|ݠ|�^>�g�F�V�����_�K� Dͬ��O�#�>�6�-��K�8$t��N$���#�=Z�Ӂ�$��"Tʀ�^ۿ�����X��U�2�/����z�pjZW��je�'v5&����a����Dc�e�M[�$��;��a�B�.��B?��pQ����R�%�H��u�?~no �c� )�SϷo)��P�d��l8Z��ɤ=x���^{�zOp����mF>ș̈0Ob�BC�W�1�E� ��⣭c��0!HҢ�9�K8�4Q���Tn�b�4(�~�m���_��۷���=��I�!r���cא�޷K� ΂29���4 +��6G�7l�eg8�U��:%>14�yN���J�{��e�0�\\U�G�c�8�+��8�4,�3�����R��J����Ţm�܏�@� �`Z�ளt�b&f�� �=�XU'sx��H����=�=�6�9�PB��>��=�D �(} +q�Z����W�s�F�pu��7a��_q��ll!&Z|��|��S�@5��� y�*i�=��8I�ϥ;- F`���yI��D�B5�9-�Ċ���m:QJԧxb�s�LV��e��s�N*ïk��g��+���WR�ۣ����1| X|�qvh�=G��a�!��љ�-҇��!T�V����(�O�k`A�N#A���:E�H��)�`� y���YV#$1� ��ʸ�Mfg��A��cZ����u X��F$d���,>���ds���� *��3��}q%uH�]�����0�:��J5P؛�˗ +��CN, C[s�p�R��D�=�hm����g9Ᏺ��9(N�[RN�s��?fŸC��7xk�3a�=V�8���2��[�[��P� +�e��6NRԙZ���k�� ��"�]�>��P$�E�`�mMc�=�yd�$�����_��_q����w5)�)�7�3�Bۦ�����l���(p�c6P�([�����&)XI�h�#웶���P����� �Ҡ�� ��4@�b: >�������G��w:��Հ��=&6�?R5ۗY��_-���l)��,2���cYP�0 +6dR !�jK'v%�� ���?�Z�U!�)��T_�$w�#��w ���������?q_� ~��:5��٩l̼��5�q|uA�_������1��;K� +x�LO�ҹd�\ �����S�Ծ�`j�ao� ��Oٳ�� H�r����ڵ�y�{,|+�{���b�i���^�̜߁�_�1 ~h@>M��m�ljţȀ�=f�"c�����Z���C��á}�O�ߥ��Z�8��;V�0a�>�µ�O�ρ�\��+��_���U��g�r��:� ����'�9����j�}������&@��+3cq�t-Y�vh_cѴO�8�7@�( �{L1��H�O30�߸J훡U��F־�r�����W�I�NE�?Y�_� |���7�Î�����1 +C�./ee@��u�훦�}����?1 ������ C���u%js�ڟ�����}� +'��&�h��]�I������#j�=h�����> +z�O�$�OJ(�9o��f*|�u)|�c#��ڤqv3�� �*l�I�o��Bh4T�B���nr�C���@h�`�iR�%T���Y��R� +5��ڸ'��C��� +E� f�>�M�v(�j F�4�)C��Oʍ#O���&��f|�0@xq��p�l]�U�l�U�Њ��R���4��u�#<˷*|��$D8S+ �g_4b�PLV��� +���c�@�,Ib5I�u.QV3�IL5u�h N����z.]C4 <�h0��l�x8I� ���0++G�H��5M�Ui��)��$F�Y+���f1b�W8\ʆ��X��J��~ I�C$�Sz/破��\n���C�n��)P>b �]�PiXp��\9�q��ĵ"#����Z���A���F�1� ��3���m��C�(L�_58��+ux�D` �U�c��8�����Ȑ�H�A�:��'ml)�ᶎI;&��݀<< �5H(Nt� ,�����G�W���`=� �(F^� ̈K����jyͶ0!�ʼn�tC��( *ň�f�G0ƄȜ̜q�Ayc5���6�C��q�C�1�"�=tr��Ӣ1!�â.j��;��'.T���*3:�k7<9T����-N�O�yOh(� +�1ɼ�G�B�%��a�1��S���E@��7QG�ˎ�����L�<<���@H�3yd2��eFO +U�hp���=�A�:������ +m�i�E�������D.5� ���#����\F�D{�&ph�(�A���ⁱ�[��\Zz O���-M �/�� x�dC��U"$D~��i>�'&�Lj@���@ �k�P�,��F�;�05JD8�<�f�� �u�����*��l`����98[�x��P� R��S#�F�N �̬"❨���pE �:�x,%Iȑvい��IR ]�13A<��_P�sňV�R�Q �t~��FuY./�%�����W���Q(����)\�3L��;�T?P.�}Z��o��9O�B��44!��q>I��U!*2���d� + T�4� fD4\JE@�8�2O`<�j����P�Q�wx�.�B��ii���<U��U� �0��"��j[��~R!��>�B +�c�P�+I����Ye [ +�0��Q� &�&I\���\d >>��X��B������e]dvM��P�oP� R�������cރ��Y���>�HɃZ��ٺj)���+R������p\�� �*�\9T^6EiO�X�;�gP���e1��C�Q07{Q��Ҫs@�i�� F�2 �,���(��O G��<�M���� 7����r��?�����JݧQ�C��ЫW��DN�~1����5j��Y`�,'�� '��T>6���Xrr��X���X �y\���Qu1G�ʐݩ7#��]ADi#S�5)q�,Ȇ��(���W+'�ȌǶ��l�!CX�Bè����,��|";d����01� +�b���x:�R�~ �c��w �� ��$�i�٩��|p� ��9@��-��cdᴨ�Qh㊜��g��P�ÏG��OC���D@CxDBG�B�b����Cf@�ݛk7��&c�'%���Hk�`rki���_��S�VoBt UyuX�u�E�z���aj_��J+�z�v�i!)�g�V'8�{���"gA㈜��#r0c�D`���i���]��9��8���V�Jq�j�9X x�����_�����V)�=��l{��>�� B�O��B��T7V\��mg����Ć�y +� D��‡T�;�T��)2-�NԱ�Ҡ�T�����E���2�<��Wr�R�b�̍Q��_E�x .g��6���0��"�W<�����Z�D�#/����� ��9�J��b%|ç|��S>��P��%�s�檰����p@�=� +׭���� ��š�$�/���Q٩���a�V��k��P�TĤ��2�Z +���U��K +��5��9�7�ÿ#���᧍��=&����|�L�d��Y���l$�I ihvw�C֋�C�8�H`���J�.B���U �@��q$g ��0����c�4ץ�RuT�ɀϋGd~�Wr�4� !� �@i��X�ͧN�\��n7V� k�^�Vf+K��e��·���?/�_]��W̹�{Lנ�oo�����k�N�0���g9C���/�.֓x g��?j�<�t�JU �]o \X屃�t�4Eg�j=fˤ�Z�2r�٢�3ک�C�4��[�0�,_é ��8 ?� +����� +��kt}� �u�%��)���.�������M�r�����X��AjMׂ��.��=Ѕ�O}��q�F���%� �E�{�q�>��`��{F��3���ç�Q�%|ڣl���9�������<孛��X@���c34M�N�J�(����#��| �*��χ�����Ec>C��@B� +4��� +�d?��@��_��gO��y�����e@.qM*C���E��B�jo��nU@_y��~�^�?��H��=����?���Bу_ ��&���p�o�����F��|N���(��)|2�(|D<>�u����$n�&�n�ce�Cf��ԢhGn�gL3ឤ: Hc�9��,�]����� �6���|�Vc�uQf��|Z��U��>�K�������A��yC��&D�O�ar |Q�۾�_�͵�gjs���d�P�V��ɗ�8A�v�W��R]�c6�v����8�7ҏ�F�ͷ�o���4O'�K6��2R�?���)t�M���" �7� �1t ����~��_�D�c��5�y�~*8�J+�L� H��K�5�ʲ��5פ�*H�/�R�E,�=F�߃A ��� ���|� 5�_����E�J��oF۟ģ����A����r�:��uC�O��A�M��"o���ĨU��eQ�����/�#>�O ?�b���˷}����oL����ܾ���&�Ä�W���o�I�#:1V�bӵf�ry�)�Wh��_���J��o�a�q���9B�s`�_���H��΃�z�l_��탍��r<������������f�����F`���2���z=��� 6�*�,*��4�:`�K���ڂ������y ,���h����H�'��Y���� +�C?��h՘$p2�(�H���FƎ�phT^��&�l��ݐ���E�g([���L�J,��X���a��G RO���_�6�AF�m#�Zy�!�!�-%ۇH<6���v Gea ���@�Z*�����(y� W��/+���� +h��N�y,����g(8��Vl�R^���� +GK�!=��+�R;���!�NE�����+�&R�q9R�:��c�� �& 2Cn왱㱌�s�c����O"����⟀V *��I䔳VԌ��p�@G��(�%=DUW�{| AȀ�]�^�>1���u������I��f�zx����Ǧn����C��ؕ˄"_���Xd�(�bT�pbT�[Z+HB\@4yq`@F�i����R8H����5������W���,I::y���[.D.%'�j22Y���R=�R�6�����}Ԑ'd{�-x�5p�-]��#CR �� �"2^ +����xE�h`6[ox�k�����l��M��)��OH��o��Cb���&I��+���@X���\ܮ=0j����sﳔ'#�T�v�M>�r�Kb"~������P����)$�U򸞏�;3���>�pd�Qj��]� �e*��'@zLU�R%?�v`���alF�=�ܚ ğ����h�a[��v=�M$� +A� ��<�8"�b�c������U@��H�=�Ve�����W��2C1\I���P��J�����/2��U���bV=��i-� O����"�K�x����������aR $���"�����X%Va���ae����H") #� RQ)e�+��z̜ߍdl���Mw��ϐ,Э"HQ��7��ڂ��ÍK&S�^<��&*\3�(�qJ����� ~�`��H.�(T��8n-���+V.+4[��B9��C�x�*1��9�,�S�|*�\����4��`]�'7��c��CsJ�B�k \�hTzxC�zek)b�D� �~`q�݇o�!��*d���(*Ʀ��s�u>�܎TR�(Q��SbhQ%��uϔX�X(��N*�Qq ��g1�6��hÁ��*���{��{�A/*I)rn�^�؋�c������~�">M���Q9. ��X���8M��#���ț�� ��� �r�CU����x��|P�ȭ@�$4E�H2� O��~~�� �`�s�D'�)�T���'f��4��%4��/A�A���Ӓ��{����{�T���\��ǥ�����?i +)����� {�R�*J�,Q��v��8�$bN�žt�g��cZg��D��<~nO� +�[I�j����L�������ˉ��.��Q�09fa +p�E�EK�-6�J:6�{���b"��bg�|�����x��1� +�%[Ex��(9B��ƒ߻���W@��y�;±W�}�ۈ���q�c;l:|\�R$>sqH+&�p��@�8\�B�1bpD����-�<$��Y��Ow���ց{؜]d�f,�6&�h�쁨)��R��o�+��&��B%��0��~8�p�U��?H�/w��F�� I �iPr�#�Қ�Üh�C�Q�H�Š'����O)[�� +��me@q�4w9i��f�tHԠ�%+�;��U���t�Wd��Z��u������~D?p�*���~L>c6�hcv����rQ��_����v/ +��h`�3RTIcRA O��DWN�X�ۢ��Vz[�4  �%�*��8u�(�J��I���{��䚺/�=#�w-^�ﱛ�)|N�U� ��:Z���h-*��� +��T _���E�R�m��Ϧtj�.�|W�璟�����8V���Jqp�& +�*Q<.��U�ޖ��?�q�cS����D|�V���=�0����m�\XDk�X����QN|6��U����n|��U|�8��$�E[�R��ޱ�z�� + +��W��r���mR�@����<�"���.a�9�� �!������ :�6a ��HH��Y\�V��z �vt8����fr9ی��uD;�7R�4� P� yvV՗��~:&������$�VH��_������L���~�+��=�R��W�¿�m�s�V"x���0��eia�j�bTS�3�c�5�����6<��=}�8�@�=vB!� +O��R��U��47��ES���͋��C��WAB|�&�j&~R�p�-|�� {w'��R�S��+�%H1�Q �dc�U��]�_��kn�m�| ��H�;k铣�"�.)Qi3Q�x ��Jhu�������d�������u">�8|U��'J�}���ʹBg���B�FVh�]��B�Мo���J��v�� +(��+)mЩu��P�NJ5*�L.O�A�u�q�qp�ฏzI������膟�|�wt��F��/�4#c>�=k�S�^eԣé(LԀř<�VK���N]X�DxD�� �C��ay,�ݧ�J��}T+?-�`�7� Ⳮ|���4��DxC�¯�9{ ��Z#���oo�=��%��j�%�F���C2�Q�1땂����R)*�wu�I)����֪�]�y &1�A����� �=V�_ ���h�o +��_�N��v ��=�����J�Ǎc�=S��G��6� ����{��<�������tW��`B�D+s<�j4�;�� ?^_�7���(�� �������?��K����'|���4�m�I!�ħ5�_PZ��-���1�J�R�� ����RY�ձϊj�Ȭ�/F�X���� +ȑ�c+��A�����^��i��od�ZKe�9j��W�$ӂ�iZ&�V� ?ݼ�{8A��`�C��l�@�i"�:�tX��lW�}�W��`��he1:���:_�"�2�+ ��a>n� +� + ��2>C�0��M1��0|�i8��G� §����D�l��@��r��D��3�L-AJt���Z��+�WV���,�I�щ��%_K1�J���\~����v�� �Of>[z>� ?1߅�2]�gw�g.��7d$��Ǫ�ϛ��7$N�k?�,�G�1� �T��%�Ȼ�%�����X��,��4��pm��[�����\�����4O��F�W��%��=LX�ߡv)�'4V��_��iU|���~�h����cxg�R!N���Q߉ղ����LH� +#�p�>�p1��xr!`��� �����P��� ��U�H�"�%|C'��V(|�@���`�n?��۟3 ��Td—_%Z��Fy��&);�U��`�*��Z� …Ѥ2.I"�q9����S��+�-���Vؾ��~.J�?ۥ�����H��� +"|ZC>�� ����>�q76\ �c3I�P�]�?����"^k�W +�HΥ���Kao�����=����v�V �O�—#�;�����}��l_�d��BJ¯�x-xp8D��g08+l������u�ĩt�J�L�r���Ӫ��:�2�$�7*6^A\�20�mP��䈌>y����C$a]�(��, I�F�x����X����{��N.������ M��3bz&��{����D�>H8<ՓP(��@�|��e�ވ-"�c�ɷB@�~� bC��c��~:�%�J�K���F��0�>I�f��'���z ɕ%/���QM�g����c��V*z�T�������*ͣ����]2�8"��8�`���D(k�C�&��©1Qd��xe� +���mfwy�4���걚56'�3/��y�xI�Բ��<��Մ�ך����t�H"�'0����T)Q�f�u�Z!��a�+aH����},q�MtI�t�#|Ҕ����LB\d,\ ?%\�G����� ^�l� L�c���8hN��hK�+_ju��\�/��cӀ"�o|��Hф ���� �Ԋ��z�sPF�P I*˘&��&Tfpi;�"���4s�^\�+���Q���C�yV�o#BtQ; �>\-T�򾘉t�t�?=�{ T��"ҋ�2��Ie��e�1������GJt�28i�Jg�2��&�V��-�(��p�`aB��HF�R9����y���A.���+ �+�l٢�*��c��3zKH)��!��C�����.�*\�x��L��еnA����#�����v"�_%���o��{��YL �����2CY�"��*���!!�hu���I3�w��R���nn��8��P{�3�Ï�Zѐk�̥�����Vq�� +D�/q:�ρ���D|H~(S" _��E��0^M%� 4�i1�@�̈P�9LR������% 6j��CԶ��ӛ�3�0R:�h��=�.� ��dz�O �1P�?t��1��~<�>d�__��j]�2�/Za)��j �E��O��峤�³BPk����c��d���a��B��Z +Y@�k�?��K�wGX�W Jum.*Rb�"n���@��)L��8����N������"�� +jM�њJɒ�JI��J1"<�fD�Tj�N��q9x�AD��A��܌n�k��?Ck�O��k#��Ν=}������Xhz�]����a彯��ݏ� ���Q�eC��4�4��ȍ�YKb�f�́=GB�EK�e#Y�v�@ ��A�� h��bG�ԝ�4��FV)�y%T(F-*:с�ͧ����}���}�#� �����O +����/f0��`�r �X��@ؘ��9k�MO��i����XNd��/��9������1`B�*B�,w:�#R/ݓ�ꎈ6���x<���/�� +�7P��Gi/ÿA����~6�z�l0�Fi5�:s�]1��7༛���9������Ф�"�bVrx ��t7*ZXhy�ѫ�4��ԫ1VS�"oKĞ�KNݯ������.�>\��Q*��ʓ���=݌@�����c)9j���O�Q粭I�ړ���&W��')AW��)_cE +�yb�x +a{[5@I-�~x$v��>|�Η�� ߤ +��0|��_3�^�촰�aW�&�!�/�Pδƨk��T|T�$�<�XϢ �c*G:�&�A��tto~ȫ�)P� ������1���dG�~�Rs�eBp����Wغ�J����{��hh��I] o"f.��x@�ɫ�_�c"�7H��ըzlH�HT�N�3�+�<��iKAB[G�$a�"����/��1�j�Ϥq4H&���O�����=BYJ�F+ ��)�B|��o��/<������R<|O���H���wR���9�,(���6��x!�PP|B�5��J)@�Z;i��L�W�1�&s�Xn�(�@��*&Su+Dd5H]F @!�vT�"~�~ߜ�?��_W��_*��0������6���vEIh�9iթ���MbqB�|��i)oY�i�ȴq��SZfB'�!Qc��"Y�72Qե���xFk��n7������H >fA|O��Z?�\��(��8 ÷/�qxՁO,�gI�ǓZ��; �VfIC"���c��8+ tZ� e�� �"|jB�;)�����U܈�Zi��b�'n &�/B�O�P�ϕ��p��%����G.��=fS&��i�ҏ�����@!��2�B�҆�����'*�>(��CIQp����D��Ã��D���7����Sk��枟V��ï���?|��/�"��|Z��4��1�¯# ���l�18��B�'%�!����,�t:�ݨ�gi)VOPR&�c�.'.�S�G+��PTb�G���0B�@��T���x[1�v��FK`�~�����*|хT�5a��χ: %2��i����Fq�Nա�Ny�-X��K�v�j�+o�����he��t�1�=���b��%�k��Hc���>&���� +?�x +�N �c�f��M�N��t��'S�S7��Lޢ� �Y� �N"쯏CD%B����Dd*|��T�ԥ��˥�&�@X��� ��b�mNN�i&��wi8�o���) �PpP#�H Uߚ*�N�U��O���򨞯H�d�*��BMD�iR�.P8���#�B��i���bf9��=��R��/�g`��;\ +_�����󭯝DI��FF�L�Y}"�|ծ��c#��Y ĩ�: F���/�j �QhR�w����}�,(��(�������'�����b �#������]��v�Ux����Yb��j���eZ�&� +Q��4�A�˾H˾k�e��Ue��Ne�=F:+�~7*�>�(���P�3R�]�(����k�'1�������]�_4�=�;-�����=�"���[�}�[�}�<.��0Y��S-��A,�� ,��2U���V�=�T�����;|����R���Q����c�ȸ����#��]f;�`O�Ƞ��(�4Ĭ�/��3�\���`�f��>�D 0��,*J��3�g����:���/��i�#8a$N��_����eZ�P�DeH:!b�™w��*�.�N�=ZM�! �0�Z�0 |�0s�\�y,���L�0��B V ���&Y��"Z�W���}�]0�� fUB)u��_�̺b�� +5�,��a�IHf�ff3\�� ���P*��'�̓�"`�:!�i0sm)0S�P`F�Q`��l� �JyZ��s/2��V�ه!��9�c;�ן�PVF�<�PH&�mW��:]�b����&̶�3����9�L��Yǣ�����f#g��D�2�h��E���B`j5N���@�O�q�<��8�2 +CNJlb"Kt'��Aw �ʛ�D$J%\''q�V����v9�4FZ�@�%s�4�@<5��4��9����)����\a|*8�<6�!��Z!ᕌ2�c��L� �`���� `a��p!P� +%M�a�dk`o�n +%�!R��×ON�J{�`�!N�GB䅗�H��J�8M�Վ2���V�c�j�PZ�mf��*]5�־ ��*4���tpw��>L�Ëyt�3"� +���DFU���h�8�u�vq�;��6��$��g�wJP�W!|��D�L��x�U+�Z����3%�*�GH�IzX�����%�MB� b�B5 ˊ�ˑ/�,7*�c��ӽ����hp��R ��P5�W����W�|�O��`b��8-��+Hf�.>��c���r�A������cC��Ti�`�jD7��@!�L)bI0�#���@�p`R~����=����%#71kobC�����*����bf�E}%����1^�"�P��C�Q��? ��!�zA�r����F:ԊR�&�-p'��l�6I�d" |L���KO�Qߠ�b��2��W7�1DZ�i1S>i�>��B�;�E����"F�����ao��&k�m�d��,q��^� &n�3��!g�%�T��$��e�@j49����*�F�^�A���9&B�S��C0Ѯ�W��5�EHZ��dJ��1��c���88���1�����S�q�����ɣ�!�a8w�����lC�H�ۜ��CAa�Kj2�'.�z�3#��Q*���`` �i/?4{��6u���RI�7����[J$��"�� |�4��F3��@����n�Ĕ��[��N� 1�m�XZ:�HD%�O$u�6��J�0Q��I�+@���E�M��MI�� +V��ޜ%W�d0�0��7�"��э։ +0�˰�D|n�F�uw�M��p��4����v�?�"2kFH�2*P�Q�Ȩ��g�ʼn�d�,��69�-m��&�2�~{ +�dpUD���!d$�QҔ)EŒg.E@CQ"砳���\\6c�{�e��d �k��P|>e�AylVyS�g�5ʄ;-B�?1)4�M +')4�S��_��$�6��!��ꑓs�2�Mp�R��D]J�I��/�v ����ئ���f�@��_��6WF�݉I_9��)g X�m�58o<�z�a*��V&6�L:��x�.�$lRR@�n��Pgd0�4�����5�� pE!�Z��X/ZD�]21˔�RbDv��xP]��l(�<5� +���O�8s-�L�fq����&����Ӕ�UGE�@�̑|%�%�T% 0�"H���?�m2��`2r'�W�`��0���[1��E� ����\�!J� �F�b#�� +TOLS�j@ �u�#K��bU-b^`���)dk�2 +G���|���45)�:Ii!��&\�Vvr+�x�[��m�QaU�G� ���+1XUB&��p�2qA߳#+/{(#4L�(n�g +t���V5��o'�&2hn�jj�#��k��X �:��e�K�7&�(�$$���]� �ݽ��9�7s�ő����ܬ�w�I��]pPF��]>�)] X��J��u�U������<^ 2��0fƱ�3^�2�G�M<aM��3-e ��'TD�H�#K媗qʕ`�-l&z{�:s[��g��;Jq���N�����׀cKf�!�Հ����s�-7u꒱�;��o8�}�^ f�i�p�O��QQ��d����FJ]S��g"׊%�!� +6 8~m:�"��rV#�M��� 1�<��|�=v�щP�g�2ͻ��!�.�#���<6�[��p��� ��ۄ��؄�8�.�1�3MM�AMȐ����&�g��aゟl6�!lM���R���y=��@|�L<���2�kV�r���ȓ덍�tJQq�_��"e +�h��y��袐�}���P6_�<�/���?��F��YK г��f]#ـK����e%$w�*���/l�$`մ��� 1〈&��R���Z?��κ@X�F��Y"�g�2���Q �0�!���J��4��� +:(�$ep�H�����%�i�-�i�=����;�$���s��d �{L�:P���M�A�� �\��nFclq���S?����P�CPeR�k�n��{��C�����FC���is!e���,�B�C��'�'�*�c:+&��vrN�0��j�� {�z͌u�����}0���7���m,:pM�:�|A=�z4?�������y9����.��:ϕ�t$@��С�c�t��B����G��FD�E��7u�kF=̐NQ��XJS��ȳ���t��@�wE�w�@�}w�����^ڼ�����/w����� ��;�U�;���]@Q�]���Q��{ o�;��^{H_��,_�Ȳxe[��/r�Q2�����|���p��FȲ��i�w� �}���*T�wӦ�� He��e�Y���%H�w5���2��WM��4��>��4���{h���ܑ�8*�*"f(��Ŭe����*Hb��bV��E�3P,2m!f[��*�*0:�O,�A@`� ���㾒B�x�Xic\�b�D���Qץɛ�}���+Z���3�.n�!f&�3 +�!f��B����Y���ꂽ�J5��y��/l�$�ꒄ´� �#��Y8�$c�"�t &��4TVA���f7� +���L�a��]a6j^� �V��fV��+�8�U��'C�0�������*�Z)� �1 ���#l)��t0�0"v�sb�F�E#P9�}��2�#QuH���u�},�`#~���a�:gƳy,��Bc�'o{5A娼���"�7,h�(.H�:.( /Wa;�\�,�0;@,�� h��]T^��Nc]�9E���i�ҕ��w.��\~���|r.�Z�e� �V�2�d��,�ai؃�F�3L������p�q��6tyu�#�<��"��Y4�� �<�!��>� �����3(<0GI7 5qf���SiBD���p��10(��_1�T� q��WjY�nTO�n��;`�w�2�措��:�"���u�(N��X��JAR���g�P0\O�24��k����@�1pːc[\"�y�[�8z]�l�Z����AM ���v�-�s� endstream endobj 29 0 obj <>stream +��<<_F�L����J�;���8�I(\�H���pzw(<�V:*EśQ��I��ir��� +����|��bC8�&�F�A )Fmڊl�����P l֒�!�L��HW�˰��/���Ce�uޕ����`G��0Jƞ�E5��uGZ���g��� ��2q��qSkDPQz+T��iSо���s��)�����pp�\oW��Z;�p��i�1W��!H�H��ј�: [7G#��x���0II���$�H�U��H���#ԩK!b2�Κ���՝����F�����FZ�cU�����@�ߴP�6/4��t�T*��Y�A2���U��MV��%,�TJFk�`�j�tS)�M�6!ݪ6ڴ�Q<��򧘣��BIm�K�`��"kJD��0�ԡ�� AkN��@Jߌw����a�p1���Q��a�� +��C��~ +��ɴamVS�2�q5h_#K0�c�%���GRI�'e$�8��kDF;�8�*�k�[P��\Z��DH��,�D b�C�k<��.��<jn�E�lb/M��\��i��-ũ�e�7$�m8{7�PIrQ�n��^�}Ո� +KAB*;D�T���)C剝�)};��:!�<�*zd�-��t� �Fy���8��j<tz��m��Ӣ^V?��Ek� �l�'sU�P��1�K-y]ovU�á7�v=�HĢ�)�}�u��)J\\U��ʸ)�ϸ)K��,�MY �TⲙP�e�"NR�&2e�:H���9�dP��6/�S��h��|����S ��� �e��2w ��Ÿ+C��2�z�t�w��P�3�ܠOB�F���4��cݻ�t�#�#�5���k�v��pvJC��SB���GK�8E4���� 66(�Q�Г����Q`�\�xLpf^����խ�GF�'h��C�i�ix��3��%�ߎ��"d>��m>�n��d��q�0��:�3r���@vffq6�����%�=meѷݤiZs4jy�1�d7]�GC��|/"t�P��� ���B���1��ښ�^uT�l�x��l ��rD�V��XQ�ՒpDsǴd �f�j��eZ� @q|�ɀ����4 +��q��m�6j���~%D���������jecɰs���H��J9٥s�u���[����2<*��n�!��H ��"�<~L�8���N��]D�'���π 0X��cEI��j24}��z��\�j_�MgaG�b�t������oW��r3���}��� �=6PY(��@F�'2<2��-q���q��%�l��T����.�Wu�� R�Y�Р2�@K�\�rEm�{�X{Au���l��T@q�GP��z4XnH�_[���{)��4�̸��R��:���%�1�`;k3֓���so���a���ۑ��8���5�v��?*a�_�)��P�+� +��7��f[�����%P=\ۢ�\�m^&O��i����4�!>q'��1���2m�Tfwa��� ���z�'��b7���C��K2֡�&kG���O8W"O9��Ԫ3�Z�K�� ��*�i?��\�c԰ri�z �J6 X%8{�D��K�(Ir�%������7���@�Nm�(Vv�x�:�B4yNHe���(�7�ǼU�F%�m�<����#\�Z�_E2��E��UI��k �2&lZ�j��P��`ei�c������e�]t"�����)( %O�2?,�l�Mt��^'.6�e�s褘Z9�]�Q�E&�RP��ѹ����:���J���f�{LE�h_�Ҵ�w.�?0��F��� 8�F��v�m��C��z����2��xp�GA�X�>�+ "��$8��ˑ9D)q��J J���!ܤ��*Y�OM�J�?\ "i�i�i�G4��S-��C��_���&�9lz��1N�ﻳ��ۃ5�#�o��@�`�Q&x#�Ì::��T��x�C���B�:�68mx�9���z� 5�d{��XzLc��&�,���E�,\�!�]�P�}���Z}_�S�����:��#� +$7�� C��!V��/��břF ��)����}���s@�L$ev�+U�<�pX鍐���:��b8]��F�R]R"����>���k(��2������� +�GTB����T���7��1� �j�|Lg<1؀}j̒ ��`2��Q�~�c�qR��v��Ҫ��Bi��R[���)�e�b�x+2��Bc�<�a4���z�3C�Ms!���"�n��~��d_r���h8�����3��"3��W2�����㥪cxR=J��$O��{�F�:W��AZ!�E� +����T�v�y���M�S��C��'.�k/t�k�R�kW��k=�}65^��ɼvK�~����|��P4�-�}��}D�+�A*�c�½�1;�nР����K ��-v�P� ��, �3"$���$�>]��^����& �g,���쓼�3��k',����ko ��<4�,��j`ɾ�X�A� +��X �����￲�;���; ��n���S\������~0������{�I��H���Q��gH����`�6`�J�}����i}��}�,����>���$����w��8D~�ݣ������<�����y��D2���ǿ{��� ������-��縷��R�wW �;�q��Z��=p]�[ �Ϊ �}�����:��� ��Z|���y<��aƇ�%81� 1]b&�b�nHC���B��B��B̼ղ�C}����yjM�F��A� ��2$8����PAy�#á9a�VJJ[)4J����s願ݎP�&��� ���B����C� �� 1Cqb�I4� 6a6����",��J��$`�����h.Wa�L��+\b���,[*x�+�09�˄��^�������.�Z[�k��bVZC1�$"b�1��,ϼr��=�t��!� ���'�TVP/:$Oss~ac7�Pn�!�_b,�-Oh8�N��!�@9Ϯ+�Bd� �#1�UN���|T_��N��Vպ����+���k5x� =��D�<�p ��D P�83�G�ЀTh���Oȭ`�<�c�ƥCP�IA�o +!6�+�qPK��s1� ��H�]�QL pfG���-E>�$�ui�ƌ�+��� Un�㱀 �"H� �S���-����\�d�_�(�0�+-�X��^�_����\��O�������V�T�,_zs�Z�������h�8��Z5DR(��⺰���)0��NhsrL��f��z ��Ž󃓆K�4#�c))q +�й�4�� �c#�۫�P��q����Љ@c��P(�\ +��X���]��J�p�`��� �yb�~(�Ź��C���edt�N#��j�yG,�%�'�h_8��xW���y�-��~���z��k��,��bbd����)�g�l‚᱆K��QMjh�8w��G�� ��J �& %��]i��/ �s�T.æ:�3.)<ֆ���O:6.IR�iNb3h8 �j% +k�P�N�J1���Lk�¯؅>�R�G�v ���KxH��C� ��+��2�p�]Rbݚ�$CӔf2>>�qD�߂�H���'��������ppB���vl�Ц"=FA�=���{ �ALj��Y�᱑r C'5-�Y:�jyĝf���U/� FD +� �*"�DI"�M���M�(7ؕ�̖�{� ���0x4�'4T�C��D`��gV�E �}L�;u�4H��J{��Ł�F�[]^��|!�K����U�R�����x7������,�HΑ¸@��Aԕ�\T��%A��q_D��9�y�H�ѼDl�eogp�q(�Թ�{=�/n!�z�N+���C8×!ݷ͐A˛!9W�!��������判����T���Ő@sNxJ�J*�s, +�� ��T��L�p{���Jr�� F�(g��0g|��vΒ�]�4d��e��m��CCr���>A!�C!q�6R(ڈ��Iz��W�B"z0�I�-㛆j +��~����2� ���6�7V[�JY�k 5~D�5�(@�a������Vj��yx<�4P�ժ%��l� b $A���##�/#ѠN���N���):^�AB O��.Y��t'�fVd��Z6*�~�� ��Zr����� H���7�BP�zj}L�)�v�U/����  �'$�m�Q�>� %�U�A�aH�~X ��1�}�������g���D7'� ��\&�h�FDP^�@�����SƥV�R�5TF�Z� ��%<��B�xR���Y�YzZ���*|]npd݁�mҫԩ��G�,Z� ����?x:���];�#u���]2�[c���9"�ua�"��1/��*�QCea�>I�9W~8�����i=��F�J#�%W�$Ś�Eb̰VSiw� _Q 68r ���@�i�e�����f�jΆ�1��2�]�-��[�ע�(���2��%P5,�O������=]�.&�ߑ0'�`˄Pv4k5�N��S!�E�y+�J�)�}`H�r��� )��;�#��9<%�}o�Q��J�(��4�\��Py��P�'�A���Xb�9IE�� ��#*��G�$/%�t��PiH3�B��JƼLR���@�fM��NRQ�d/�Vk#�fv� vaoj�Xu�@��@��v<�:��sc�$�X�(��N��l���eh�SC��M0�7E�0�# ���/��{}���1/����4�iu���P<��2+g%��5Q�6���_�B����0s+�Q��p:i����@�'4* �� ����R��݈ ��"���@+1�)1�04�'n�h$��q&F��$�\ +}�j��b���n���Fe3'.��c���]M�n���Ő�3̈D�_ ���'D M<4ۃP(CC��Tw&��Q��F��ޡ�h ��aH��c ��qB0�<�\�9�(;!Q��Х�c/hTn�0�0.��,� ����� '�z���rZn +fE�c<��,JA��̻����a�{�T����q!)�/�HB� �Z!�|��#��zW��v�ĹG�"�z&u��#E�#�~�>��_ -��2��_�I�A�������K�y,���!I&��1 bT�o��_!��V'�C ���u�X�S�09iU�J_-���k����I�4T��$�R�����Xq@��Ղr�8R���f���Z�Pm�ga��L@ +�(����R �r�y�JZ �2)z����W"*�葮%�@qSJ4��T�9ɑY��X��Ԩ3!S��DN��3�C�p�t� �:�V�ȵH�Q�����]��}S�_��WV�Į��C����N|��q����bt�*��;�R�MH��^*�����)��}u�ܨH�Ry@�X� ۴� ����U2�% +�%�v>ge�@-�����|� >��v�{�N���K��-�A(��-�O'ښQ��J�;�������dR�Ih�X +A�����J���+W ��d({��_�l��1���,��W����\H�������9��G#��W�! �c[�|m�|+���|�eZ�Ҋ��JQe��(b�#��2]��E]�������I��B#�2��}���$��(�>� ���$f�K��g1�(��[g��L�7W\�K�1��6� �:�� +|����g�Jʾ�̍�l�)Z�k\!���q�td�g�����k� �׾��ky�k�I�ko�������_���� ��+4�k/t�k�����(�k���������B&�zi�;ݓ}����i�O#�� �_�%��Uⵓ!���XL��>vv�9*�a��~~���{l�v�;���Of�ޠ���`صQ `gaJ{(P��൧��k����̯����pO�V�=�ɬ� VO�_0���E2�K�s � ��(d�̓�[ �~�%��.D�]� +v�� /!��8��!سM`��4vi�� �����0���^;���W4�� +g?��_�#�D �D�B����C�@�C����@ 1 Ib60Č�b��0Ĭ�1�l���H"��%,4q5�> d����c5 �.JP�X�b���a�(��gP�!��F6#����ԑ�х#L�=@����xp���7��f@�/��������x�� +��@((a-*ߧ3 Imp"������<:�Q��RV�~�D�d%��{��R~�Mg�*�"�����0 �r����?q��?Q���ĎGLDV�� �����Ee���A�.^��`���װG��pET�0� �1���1�Y�P$�4���"U"m�� h��͉XZ2ܔ�����[�V�{$�FD�1�z��y��r��C��Ta,���XH +�J1���M��Get���(�����gc����T#K>��@hq37�R1Q� G��E�z�C>ʌ�nTL�D`�)��/F�!lM]j��� 6!Ϥ��JL�*�g�W���qF k��=��1�$\�RH� J#"jp$��q�+��,-0��.���@���'M"��� eSG�,�u� iŌc��+c@J�ŐQ��R�(R�23�Ř3'�Q��,H� +�#Z�Pi �ê-�����'�&���#��9�yTt���X�W]��C��Gmn=��n������1@ͬ����G�ۅP���-��rJ�H�P���h9m8��Es�OLq@�9�9�I�XE^*6��c.C 3A��=�däb�gly��vBS�C��h2���;��4�z�e��=3ن �&��TF��Z�D�g�n!�m�\#9I��D����售!�⬡��a�#�!K ��J��D@@$)�m��HQ����rB(�δ���LC����Z��ဨk�3�V��.��"Z��O���Q��9e�<��H�d'�8�~��rb��|���c������X +�!�'��3r �E�(.�e�e���_9 +[9�ӹ-��@���p��!��-��xz�v3=������S���=�kk�ZQ��ѵF�� �d�^�S&�s�T���rQ@L�댏�DSc�2ƠL���hJ�b�*�%^Y66S�{�F�r��2&��1A+Ux��#���[OKŰ���e@xP9Q1K�fTJ��*�xT`�t�r��9�O[�`�ITk�d@Kyέ +&��T@�!RaՅHe��V��*�hߨKd�JD��`�G�3����#J|�_#�9&U�9��A�c��� -�����hO��rg�����d +%�2A#?%��#\��Sh�G^n�GbB�%C{֋�������3�E�vY���|h�-�9R�I0�Y��Z� +@d�� ¤� ��RiaA)~5�C�HF��Kp�:�ur���7��8�VN��<�O4R�����>B�>��J�% �K�'�� (�r��rof��oӖS�O&��^�v��!�[�c���J�̭*P +bI���~j6����QM�)S��f��������U��-r�t&z����VPf�� 8���R�x�b�(� ��T2��[ɜU's!�:�"�dD��Ąu��Ԑ���� ��R���*�D�5���掭�R�nh�Up��J�h���6�%��1d�| !�jPr�ʣ5z�V��¡cvħ�}�d|�E#���G4T�5�ui>Z��x�4*�'}� �BD���x�*��̺�=7��:�)���C^U�ᑢF��(��0ec�&���Tzsb���P"�P8 +���dp^�����`��� Y:�NL �@5Z�EU�%��Y$�>4�R��:�C����V3����h��h��z�����U���H���� �,c=Zp']��En`@ � q�yQ2(��ęZ�8:N�Է�q<��f�ɏSJ=V~�RjZ�D[�ʒTЪ��Ɔ���f}܈Ti��nnW���b>���J~�ޔ�}�QL!9�wzE�5�x;��~\�gy�D��<�1�R$r㨊%�`Y��tMp��\�}�E��1�cdrc5'�aU/`oZ%�-������nd��c��[��uu�aE⨭@�k��%u�27��H{�w����f���9Uw��C${�$WG^K�\��D��k��� pŸ��g|��=�]��/� �gL+����.���{PO0�a�8��F� R-�{��eR���v�4�݊��S�k���I���9V���b�����#@~�����dN���l=ٰXR&��� |��n?�� >A�o��� � +�L���ԃ�䴚,���Y�g!�� ���,W�R+{B7��E(<���>/�}R��ܥm"q�����u ��{YoG{S*�l� uJ��1�V�X��6 ᓞz�����ǂ� `�7t4�G5")��|˛�(@ÖH\ϧ�ѡ_a��ATL��1�]p� ��A$"�$�N��bv��i�2�;5�@^��dL� �aL���*՘ �馫���g_��I�۾���GA��0��1��i_#�z�p�{*�:�d$��#��{ +Ȏ($�����n�u#1%6;WZa:�R���p�F8����^R6�c G��`��<^U�S���X����x���g�U�3��E:� �#L�� �-�,�}��ssF�򘝺����b��$�� ��L2��Y�#��b� ��T6��΂-�T��U*z����|,dK�q�Z 4A� ��� +a�b����\���OJ ���^`�}D�}Ä��+���b�ς�B/�r�و�� ��9E�Xg_�b%�B�c �Bbm��z����"CWir�]w�4�e����=%�A��2���j_'y��,����f��� ��8���(�GlL�_�^��1zM�&;�TN�d Sy +�Q��J�HՕ(ux���̴�ǃtUV��ވM�oh���*��� +|R����&�/K ������ �����@���J��ۆM��D�dZ�>���"�i��M����_(�oW��*���X"NHpy,� ���C�;�E��"�/�E�'*���{"�[q"�K�D��D��:�, ~9Z���G�o��q�#- ��g!��|��~|���E'|�$��避��� ��q��=���.�ٿ?*;���fM��Cm�9D�}�e�M�S�M���&�6��� ��?�9��l�>�Ƴ�IN�ge���9]�J��;�%!=�qA��B����B�+���X�;sg�5����ڈ�~ƥe_�h�?��� �&� ��)�}� d���h��KD��{����E�Qs�}OD�~ ��~I��/n���u�+*y�{�:��F ���s.��������{��$�מ��n��� ��~8���A_��u�v>_;ly_{ʽ���r_;Ⱥ��K���j_{钿v ��Ә��˙f?����Ge |� ��0������OA�b�bV:!b�9=���=�,�:�L@p��>7�,i���H�L�����B�hrl�Gg��%H���a!���.`,�l��7�HV.}Yς�P//����5��)��W�1�%�L$"f� �پz� �����W80��C� ���>/�<$��$�@g��v��QAB ӫ�g ��CWZD}KV�c4L��N/|���$Ҁ@�9 P �7<�,���mˇ�g&4����% -c������<*"ySܸ�b���h�|���asb�����@-�$䉆����u �<:bxy]��Bx߱(��Y�S+J�g_t�M�qFF$�ƐO"�T'���.)(�27) �s��c�,�ua�a�zdz!,/U6(��<����Y��[��y S��W1Y�a�@�C/E�ӂ0 ��x�������� �;�a(#<�X����IA^&v4ZB��&��2��LF���,Np���r��S������e�>���i^Ϩ��G�Q�ϥ��7�L:�$B+�B)�@ ��AbFc�R����� �������!# g\eb4v���lh&�pIP�됲�;�_ �䌃�N+jq�� ��r���X<-A�Fcb�c�c5�NdN�����b�?-�����G�Q�ј��,K���x@�D�"މE����U�-&�!D���_p�C3��'hI H���b|=��| +�e�v`K�8�uX�J^?�rn�F=\ +U���Z���ؐ� �2� E��^��&&@H��z�3��Ίu�(�!�� ���ńJ����qH� +%eD�n��^#Ԛ��w�4�o�/u@uP}4�%ylU&�kJU�p+1Esb��m$�m�2%R�3��� ����6ȡ G�5y����Pt3�� +F'�Aa�d$*OE���7���5�+�c)P�̓Ǧ�B�ZS�+F��Ё|��r�� q�5�,w3nNǁqȫ�XG��#������n<��1������a؈;y�$�Η��+� +��V+ch�0��2���9�� ��FjU���e=V�^��s���:����!�Qg� l�B™ �_]Y�p�0<���8s!<[82~�*dh�Or�N�D`��j����%�+lYoM�mM�e��G#e��B��RV;�K������F��f1 !�:IM�/|��D�����*2o\� �H�t@"��y#�jk�j)��Ti$�|Ea����zBK�_Xe=�&Ԝg@fA;�� +��&�Z�Tlh?Ӫ��hƇP,U~-nB�-.(�=~":�Z8�a! �͜�ɛYsI�YMɬf��6T���>q%FR��bq�mJ̤D՟1�>PY�(�!� r�u��^L� ����K]_W^h��a|� �!<�U`|��>���9zqZ� B ���R����~�&�7^(q�V�9������Ih� +���QNpMa]�c�dZ�\��a"Pd��21����g��v��BS��XE�4�����H/g�쩺BM�'I� f��V�H�wD:ŝB�+�������<,��sU<&���B�@�+�PF\�P䘦��GX�h"Ă:��eD�2�Dr c`����NB�k���,æ�2)������S���<��%�!,��s>��y���ǺF\���@����q��7Qad/������,���Z*���T"�2Bq�B[F)�1Ge ӄ̄evLȤ���c��yR*9gԄ�:�A" Öǁ6I�� ���#�>���txu"�$L�[�@X%��l�cp$6˘r��,Q�Ҧ�%�f(R�I��@���)�);����x�9����9�Hό��M�꥔ [��J�@�_�e�sH_n�t.kv�H9I���FXB�Iœ{�kԥ"��%| D��P��Ê��dh��1��"�U8Fc�q́D�2*�Ǔ�ymƊ�k֊�@1�MG�[�� �.P8��J�Ȼ ���)�JӠ�Hr�}��]�KC 4��4��I�4����E)|Тo�!�?F j��[^mz2�6q�2U��2�Pj\!r׈6�iwN��c�(���I�m$��>>A��jmŠ)�z�g�"xe"ᙇ@�&���z� +�� t��_����e�Bm��H=��޸iJ=&�#5n��*�p�u;�vUJ�F$jm�劸0�y��70N�8��`���ha���l�:�%��Q� �<-��U5�/��i�hy,fL*'��!n� ��T���<��7��𽰣 ���!?k1�9��q_��xS2��j0��X�g���0�:Y�|�Z� mG�jx:���Z�a@-��,.���GTG}}����v�g>�� +���Z�����{�V��C2(�i��b�����Y%><;t"y3?D[�,v4�[��kQ �r�Z�ZςsՠK�EK��U�C�[kOy������fGŲ ��I�=�|�|:5�����~e�u��'�L��0u���夭�dI"P��I�*0��e�F*3�N�k� Z��@݅��8���c�f������ R�x��� �a�y�2 �ܻ:�襒�D.�όXNBmz�T�LS����CP�%Ц^<騥AR],i�Z�J��R^.�u��Q& +T�D��|x��k.�\xP +���L�&����Lg!��J��T.,��"�O#�h�zJ�x����Ti�*�����R�A�ԁ&.Pd����0,f�R��y 6]�ݹ�M��AT��?{�U�O���[l�+��X0��Y��Zg�TiaZ��" +M\���r9>�c�8����"�T*�f�Z-R�����;��8����pw��+�."坲�- 4pqQ�Y�biᏆ��/C�"$U�8M�e6f�����L���e������KE&��yڐ�UQ�GoBK��d����L'�y cG��l#�D��d���H��lÄ���€ s3O`�B��J12�YF�cb+��*���0�Ng�r��c��C�;�O�_��:Z�d����$�x��e6 YK9@�G��\g��k�]@�G�8���^����F�GV�/G��!G��GF�̛�"�BS��o (����:btL��1��IX��F��|p�F�����eۍ�lԍ��Fv�̍�e�F&��Ff@����I�����~���>#��N�L�����Ǿ���:��a��'D�k�E�BD�� (&����t��v��đSx�$��r 0�����r^d���Dl������/�"�g��H�E�;�lSr�Yd��,�Fȱ�<�[d�P[d�������Ȳ���X��[��'z���w���6s=1:*�ʒ:�O������DvB�N:%�R�Jd�)��H��4�"[�E��EV� ��c�\Pd���*!�D����WH%�-%� Jd���Yku!h�ε�ל�-�������y':�p���!�)B�+S\�[��[�+=vR'���(_&k�/�P�/��/�󗑥�e���o��,g?_��/3_�B_�١f�2���k����ES��l�Dxk��S�gZ�����a��H~�l}�X��39ݜJ��V�N^����dN���$�EQx,C�X�u�8>�@�8rECq{G��^܉�T���t�;h5p5����V���N�4T���hi +I��Kէ96��c�X;�jB>� ��21E�;� 3uO� �V/gd[�ȶQ�� g�n�ȠPx�+� XH�3k�kpX�܍%Ֆ� ����,a�W(B�a$ +b�I �T�B�ΰu:"C� , hC�lZ�X ����BRDN�Ax���!�%Ɗ�XUR�����4�4p��H$Ḿ'�B\gH�ߐ +�g�X4���+�02ZxC.R����������!%0�[�6�����x 8��܈�Ԝ�-�8�‰�Ƕ�)w��V�o?(� +��Y�86���k�@�/BI!-��g�Ry~� +�9~�D�sD�s�,xT�nV�� <��s1G~���A2^a_�n�x{G ++�3�由tؒ.t�@Ì�Wc['��D�cGl!�L�} �рx��� "� +~��ER�=##Շ?�%ʩ'�� )���)�DE����p�=�B<b�Q����RB�L���0>�#6�q��{�� ~p;]�W\uX��@]��a8��� Qb@ZFٸ C�� 0�*D�����,+���5J 7�t��<d럼Xgd�"��1������� +g|?��J�KK6/�̞��\����o�2}�,pQ��F մ���+ �E� -�;ч�h����8>�X�n �I.�(q@�tWĉ�\HG�dp �5*෥,+����Z��g� (j!���&I��\� +dۢ8��r�&�E 3T�5�C�0�N>�z~����99�^KZ������*y�W�Y ����Q� T�ID��㋓a�"B�A�;�Nѐ,�2*6���B����".��/�M�@z��p�Fe�hu�N��`8/� ��8SY�ׄ�jJ�0����!e42�:> 5���ֵ=�@^ J��V��@��}�Ov��1�%JQ@���2�Z�lϢu��Rbۑ�f(2�D �ۼ���}��������U�����3S�t��$��I��v�l�z`+�hժ���H��� +�G{�U�(��@As UX���hH �����I)uC�.o�(�x�e���H^Nf je��5��2 ��/J�)��T=@J:�"���4a6U���j9'"9?�M�|�-�p��J ���7���cc{��� £Ĕ�}R�h���Mڌ�Ə�M5�A�V�?��"M��B��ِ��UE"�$��"������v�O ���@j�Q��d�?�k���v0��y#���t"�;�^�t�́h�A|)M���n =��Tq�ŒQ �*����9i<6����H';�3�B� +�"�S�@���:�/���'(X-�!d#���2@������ !1Z��L�����>�4����_8��c��-֗+ע?[���~#Y��-�����' +շ:.��D)�Ք���d(�+�M#,$���v7���6ye[��D�m��՜>�ZjP�Jd�v� ���6��|8�+�1@��d}O|Yt�Zs�),ꍬ!�y'=f#2��J��XK�id�K?;�)�Dͥ�� l�{JT������r4����N��$�\�����}M���_�9q�����SAfbe�c ��� +��d���A8�O(�On;!��d6���J�*�Pw����EX����=�z�:��+�X"��h� �aް�L�h�XR�$�ָ�{���$;���ٔƼ��^�'#� ���LJ��Q��/Z耲�!ME{"�@8i���L�mR�/3h�X���߿s���g�2$D!��k�;���0�b�����Z�B��M(tڐ�s+�zd{"�IF�\B'��T`�H +�i|x�� +��0H*BJ"Y� �}�Xb��]"p�V +� ɤF�3zH����i�H�4b���ap%o h����CP�A^�x�D��bE��ҁ�Ӳ�|�����x ���l�F qR�Ń��pUJcO���'�C}�Vs)<����PH +��F�=P���V�%@x�+�S�$�äʬ����B�"��V`�ծH �$�d��@�ax:�Ӫ&��K[sO9���u�2�����Vf%X8�K��,�)��<�K����<-y5.��'��$_.�Ý�I��E������P`i�E��Ev�pot6y?��Qe�E�tE1c툘5B�����y<���K�!f Xf�f�cs�"�c0�8�HW�s�8&��B3�t� �pC.� +f7 +fh����f��!�P�f�@������H��•j3R*3�}�CK����^ d/xմ�G�P�W����d �6�$_([ �&sVT��3uH�R�,�A2�d'�d/́d�C2�a�d���\�#��#�(�l�)��dq��S|�̉�VɝbA�<�r�=4�C_��03E +�2�Rlu�&�L�M�#qd�Atd�A���"��@"��<��G�:GF�t�l���+5��4���Y�C��Uid� I 6� $�$\6�����n��4��jx��_-�����~B�����=��P��g��>AF0V���0�Lhdd���ȴu��R� #� F�nF���(���E#c��E���"3�\h���p���y��=� !9��$*�Ĺ�"F��eȼ�P���G��r��Vdsu<�l�z���(2�,Rd-;Wd�+��JEJ�%P�"�Z'Ef*O���&EƦ�"+�[����"Sd8����� A�!�x�����"x�3,�C�Һ��h}#�`�Y<��~�-{a�&���T�l$��JT ��R6�S�x�i���DF�S��4�-�m�4� ��@H���k�EKA�G�\��I@�W�ϥT���?��0�����=�ϡj�E�`Q�-[�� ����X��zQ��R���I�VIgT�#�Hg+�2�����kJt��1��(5d�M��-�\���n'A o9��`K�AH��%x��$�ڂEa���NB� +�E3���� �y{ĤX��FH�Q�D���W�j2*�hQC+�U?cѫ& +#:Ny�({F�jJXˇ�T"�G�(����Xۻ����D9��O|�,��@T��� �O5���� �=&0L�I�&�@B�˥E�ẅ́/d���%��i1�4<�����ɮ� +*����I�R�P�JKBUKF��IIȐ �q��k�Tn�դ%ʙ΃W`S�lT�×��h�������r���� Q)]˄��˄#�˄SK�P�@ql���:^ǒ��|���L@�$��:�R��Ũ�F�Teu'T��.u��D;/��!OօPZ���y������c�&PU��T⊴'g�� bs������+���"A :b�%%�L�l��"Qt-[��H&�.4Oh��I5�R<&�F�1�RR��B#�.�B�����r� 2t����)��� ��AS��&<=zaĢtQ +k����Z�.�?�l�s�FP�N�&����'���'�J 2�ms��堠>����(؊�0}�̊K-�Q�] RtY�Cr����F�����aX���X�q�3�� ���th�W�8+/��b�`PK��Yٕ��$`�h��K�.Q�!Q`�(]��:���,*��eQ����'�,͊Zt��]@(Q~�pʒTSo+��i)%���yt��8X� �#g�J��b�*I���d=�E�Α����`OX���o<�!i*�C�b�����7*oO��E��@���5��j%^��*�{�)������m3(]��S�,� ��&/L����Y@� 9����Im4&U�� w:5I~�-C�HMYWP?��_��OؓS�6̹j1\B���5�qny��A@�b#�J"H�Z�(��X��8�f�4�N�0%�x��a� �k�.�tjS�V��:��3��,�CٲL��d�ک�[%�D�5���1���"K����] ��[nDŽCB���� Ru��E��{С�|!F�P�9˕�T��& H�Q�K��ѡcT$t ���zAi�e\�N�Qa�FYSV�^1������g#0 +�0PKkӕ�86 �#.ߋz58�&EJ�[�9�)���`���r z��F+�������e���x�����;m}�,c#�Bd��ξ0�I%j�&�a��w��/ͭ����<����|)���S^���{��X�M��E�d�f�� &U����aM-�'��{�;>ȕH�#$�,U���`�Y������&0��M��W��޴�g6���Խ �9z�Cn��l�� OOӒ%~���@9d ��3�+�A3:_Es4 U{LSC%��:0&�n+����5��:�BYhQBTA�M*Fe���_ �)���?DA�I���sp�,>�/gn�3�,]G}k���3�~E��^AZ�6���\8 +�G�ܸ�qq=�sz݃K�T�ZbD��Έ�T*���2w#Z}�od2;݁gBgŚ ��A�.�Nߣ��6_�#:���w21PzX �A~�3���c7+�?oY���敁H�!'5H��ĝ����POPO˫�}7���x�����=��*��P���=�����}ݖ�B�#�14,P�2��B +W䚩r�DT�͈��� ���WJ#�ib� ��T/0�c�C��N<������� Dq���� �w�+�/t�R:"E����|�=* +U2s�1��$����P+0a +_m� H�)d�Ӄ��, ��6U8� +]#EN�9H*�H��H&͠� �W^.MfQ��Ι�{�[�} ��OT���|}��ݓOh{;���7R+�ɞ +�@H*��"V���W+5l�U�8(��j�!���+{� �����{&�HW�,Ak��Z���:y�K4M\��|�j��1KcR���Q��ss�d�T�ǩ�wJe�)Պd���d������� ��x�{-�^J'{�����Q A��r"b�rеUj�Y������L̶��]q�Hv_@oG�b��m�K$�H��P��'�d��a��b��tU R��Ìc�a���0��5�<6�j�I@�0�L`���f�pf���d����D$[}��> 0�)�lR��#3��#K�E*ؤ$��c��� ���k������5�r��h�t�E"H��`�����e����J�L�R0��^�B���0f�/3NB�d�����@�{�zd�z�2��,%A�a^ +S� ��{��R�D�xɌ$x<7I���*��#%WG&��G��GƮ\��1���+�Gf�,Gf�+G!������h�Ñ��#;K�#ÀG&i���"�Q# 5S�"��2x�f�X6sv�f81� ��K+��VT5| T�n�a$� D�5Y�c���A#�t�Lmp��c +��X塑ѳ����B#cL +�̓�L�02��bd��bd�bd�gd�Tfd fg���r��E��� C&� �*��۶��cuf�ť��Lz��ǜ�z��J@��L�0�i�*�Yd�Ӽ�<[^d*T��dB��.�"K��" ,�E�:���c��@e�B���e�� $��)E�Rk�ڀa�� "� +� +!.~�4�-�`[���TH0�,LIi���>�.!$A�z=��Y�^C� �E��l��~k��!5�x�W<+y+~2Ru��NN�����MfV `��8�-c��6��x���hP ���s�(��B�Ae��dȫF<��T:�HS����&b�$������ş=�� �쎃��F)x,Uk�XT]J.���1 +6� ������8�a�`q��9t:�>A���a�! �xY8 =�� ��a\T���+�H����hԪ�H��J������Ԫ�1�)�-R��Kh���3�̗2�h�46?t9^@���i)8b�2 GAł���&���;� ��k��W␻w_n��!��/59X��m ɆT(t�`� D�Q�� �'�A�vb�B�)zឌ���Q�3hm�yy�� +��[(�8Rҽ��K�>�.]�$]BР��"^h�b�G��1�/ܶMb��$;�*��[�,_�(���V���`h$bx�B`/ �U�8B ��� 1:왰+U�Bga^����9z55}9Z�V�0Gq���L��4<@}JCP���|���ޏJ��p; խ�8� ��zn�ȼ��r� ��?|���)�����BD����>A�!���c��L,�G����\�G�I>S���I2)k�\nB� ̎���Z6G�!�4��i���p܆�C�Z8 ���1֪s=@�ȅ��Oș�X S$D�4!c��N����H2��'���3!Ŵd�' ��|8� k�V({뻐�P��q6m�BM��a=�x�5n�a8BDID[\HfP���q!���p�j��G./��� � + +K�È�ٸH ��6�X���Ą����q�H���}�� +�)�4t��JC4���A˴*EK���z�`�V��R�Wq��I�>#��D���P �o]42h]4�Y(_$o�/B�4�R��T� M��A�p���ڌK�[��j+�]XT�2b Jz嚤�VZ,K2 2�O6]���o,W�k]� �G@�!��n��ŕ4��q�)���e�Hdb@���8h���B��R��#��8��k��}$�C*�.~$�.;��ISz(KO�W0.�4ɘ?6MI�9�QBJ=��æD���։e�X��[{Yy�L�5�H��#���"���"95V�fSu$V�L]���Py<� +��iǢ�ѦbJV���N�ct^<�x��c|9Y` �2;�*Շ'�(�q�h�˸9O�;SF���a�g� ��DM{��z�* ��AC �@d�X!$�cB��f Gu��#�3���/ŵ���wS��,�r^���@��9D�6H���򘅻�`ib��)����Ќ4u��Uu�X+�5)��� +���6���Z<����s8?�l���DN ԑQ�^�Q!�&�RxMF�@�� ++����kKUBђ�p?`���Ys���- +Bd�ї�5Dk�`���]-����]ٞ $��� j� d���2q���]���4х���º����l��?�j1���e:�q��� 4�5n���j,k�8=�2�lX )�Y�tn�5`YV���,] �f��tW����L�"�fz �S�wm��)M%!�� +��@AyJ�q�O�dt�t"�,sɈb�Q�� ����E��t��n@'��N�[`Q|\�y��cJ5�oۺ�{ ����oR��~.��X��<�����]�Q�[�܉Էr����Ȯ%b>�A�p*l�ϧ�m���0R� ���ɝ� @2��c+!OIR�S��*w������-��l�p3��}��� ���'��P8"���,���$������m�֠��H�I�{u�aR��B8T7.N�3�J�L�bH��d�NXe]D�[ ,h��2E6��ś�+z���\�rDf���r��*}=V���#�aZ�8�����EHf&mѸ��:Q�yJ�$��)q"�ҍȱr(Ɇ-��k�� c����bP���jmb�jI k���v�-}=�Rz?*��)p"�s.Ur�_�Ʊ�b���SU����d�Q��€&.;�w�e��}I��[�g��"`�G 5R2�Bq �6��ɢ������X�?U�F�r���>���)�/�A�5�*�s3.���&���i�H�]~'C�� �W(�[`��ɚ# �� ���#�<-î�'C��;�˥�2G���*S�3(��ɾ�4���O�}�ܨ�>n�\�<ܿ^���J�����na 28�c�j��.Eq&��9L���%���H���a��� �;�r'(fz"f/)@pxl��L��yMf.� ��9��O$#�Ўqܟ#9��P���>���a� ��@|C�q���e-OkA�B`A�0�03@~���S���)��O��lO�uVo���J�EVf��'��4���HvBm��c�f� f�ļ�� �]H֞�*�#mfK��Y@Z���ιUIJ'4w�88�~� �!HlIK�hB��@�/�y�%|��;�HFµH��X`�p����G`���� �k0�d&�!0 0{�`�JG�L�x!�ǥY.T���=*������V�p}R�L)ܕ�� +� ��V�#A���hX�Mo3󲬪z�G�\��ai=�Q�zd�#K D��揌F�G�1S5?2H�}dZ|d��⑑�#�/G�)莌=�� � ��@f ��y�*u���w��C��.]�) +���ƉXv>Q������j|]n"�U#S�G�r3G���YW42�����Y��Y#65� ajd����D�O#�Op#se�&��iA� _<�%/�EP� 2�EP#��6���3������)wRÓl��($�3�CZҰ� ��� J$��5�/*;�Z)���� �ɣ� �H�Β�6I�-1�A��@�E8/^��\��}|[}<���B2e[�C9 +��tHY�ӹ⅕��A��%�@J�2!�X%����p1�����k�"xZ�p���>�pS��mӄ^�f˶�[w� UP�ۼ*@��4� +B·E�"��0�m�eo� �RpFb5�+�ɰv<���7 �w: 'I�c�1��l?r�YNT�\�I�,�Bzȍ���u�+�=U^2$��dH &"M�ҧ� d��� �<��M� �}u\F��(JnN���+�N�.c�N�/*�c��%=�fosYx'��H�%��PQ�q� �;UF2^����H��h�OPUJ q�� g>IP{���>��p�E��y��V.��Zg>H�[t4��c�n٫��������W�IUb!�Vš�P +���+�F#�����p�R�03}�H�r����)����)#4���@G�:���a+�օ-�Q.�?�?��~ |?���~�~?�g�~i�z�G�l$6ҴI��B��N +���'-N��0,�Xh���`*ǁ��8����ʬ��H1x=h�#��<�3a+�D�"zse�E�f ��i���v �����1r�H|��H���b��%E� �;��y`R���Y�l�`u2�����l�c�wۑ�W�c|�܀.��d��!l�@�e�Q�,���i7��""ɪ��k6��m� +%�S�M�uAb���red +����T� +��4����[��ֶƢ涆�^��xK��!9̖FwC4ǧ�jG���G�� �uIZ���%�Z#���S�zw���5H>F����2���v +�5i� +�������)�CG�K:�0�{?)Ugq"����I�r8��� +�C�җ�"!��� �?�CRR�!E�cq"=ET���C�+�� �4��q(=D`0����W�(Sr�Wh�jci�� H�ri�Dy�~���g�@=q����d F �!8WG�]A�� �#����B.,\���#�"��ta����S�D�B��S��Rc�� N��tS� R�X�biX�����T ��c�#��� �3!lP�%�^��\Ƥ��A�������|c��Q��2�dN#�F<�Y�4�i���Rk�!<�.�K��G�o�v)����cf����V��ai�H� ggL�@�:ȅJ���`8(-`��N��jf)��0b�i�� ��茟<�+��6@b�d��c#����#�*� X#���"��� ��Mr�P>�g�LP�@2����5T���ӭ�����Z"q�|R��t�i&P����qᱝ��ٴǵ��a +�H��B�sKA%�B��4�1Yx(�wR�ͣ<ָ ��1Jh���H^�#� �#I-�8U�z�ͫ8 +���FF��/Pm��V ���ꈔ.�!"-�,��e�,D՘��qMAԜ�S{� +�wO��Vm�2Ԏ��z �b��5���� +�ƹa�)�C!���cĥ��wj�X:'��1�3��(�0%���Ai�+,\-%y�^>+���ON�p���LZ0eM3��MH^5�G�85�[����Ks�P�aGFn]b��3�eN�+l�.�-'c�r-���� + #k��H���*`�T\�W.xH�4ʋw),4�`�gȔ�&��e0�YFxu�}�BS#`w�2@Y�p��O��rB /���Ka%�y���nܒ.p��["6�iM'��A/*CUSbA�bqW��c�]u�P�ޥq����]G�86H�B"AV�,9��1�V���H�$S��289r�4ɾ���5�Um(�L&eB)��(����걮�l�3L6�U��jgߒ �q>i������D��}"�G�0{;���c����P�h�K�@ �2#4<�f�l��4/��ќI4؈I�Ї�+��bO� +M���aB�TJ���FM]-a-]�g%+M`�0ɑv�G���| ���E��f_䗂� q���p ݡC��+/K�*��9�%9g&��3��G̭ԶL�'\�zIU�ʁcO�*����RB5�Ӥ-67�' R=�k�����46��6ۦ�9S ��h,� �lP/��p�V���MTϨ���l�0�,4�h�d2,�A�/��zzL���9����tJ��"� �x�����bT6���hY�.` �N��l��fys2�`��ֳѭ+8��f�67��LTc{lR=�f/d��6�j'y���E�C�@ +��dJ>��f��� ��Hy�Z餃Ւ�l&���R�P��@����H2��:���./��r(���U_�F�vUX/�G�c+F�X��� ��!��H@��ʣ% OI,%:����&�E��L&#�,$DI*����BW�ܤCUY����\��v�*�}�Xh��}�p��&Z�2j�%��QLᵳ�k��Em����tYx��ET)Y�Կ)��P=�e�N��I���T�,��:�UfER����pV�����J������cn����?쩤�=�rt���=���N��T ��YyБ����,���Y��Ti�N��O\/L�\[[/K4ʾ/�q� �e�ﲫ�?���=k�,�� �A+eHUZ���� *pQR���P1/� +w����wU�]uW���V�V��T��%AP�s�q�3�1�0��5����Q��Y�����T}��}�}Oą�e�˾�R�}Oѕ}e*��Q$8��ĸ��;2�y�U����1�Dl bfY<��@�d:t!f.3W]�*�#�P_+�y��a�E��Å�%Y�l�$�~d�6��X$j��Y�Dޠ��ٜ�b�0y��=Ĭ��� +�,�¬�a�0�0Cd�H&�|"�.�� �]"Yn4��:�*�U���e�@zm��*Ձ:�e)�6���3�HD�&8}��O$�?p$C�H��v$�=u$+A�H�0a"�ꀉd5)F2 ^�dN3�C���]�V" ��401`6�T��ӱ!Ǵn2�1�f��2�h�'�<�t8ѝ�s͛�bP��oW��%�P&ڶ(1��L�']=�T�lUU�̳� �R�,�@A2��C��{C��ı-� A� YF@����g��8���6�$hS���ی�Y�O����.il/ ~y�� �e�D�EKV�ט�̖mf����L9�D ��B�������<�圛� +�*���"�j6 aAT ��?��P�2B��P|\%�ѫ�HkC��� ���u�a^��=�%_)�B-Z���� � I9z�ѹދ�L��+ ������qϙ�te@����9u�� ���mb�L���7�4:�� ���B]b�Ą��q^L�2����2A���.Ln{�D �qf�83��z���O�ب�m���m�"@�Kâ* �WU耶�P���A�Q�K�;�f�0�!�BD���6p^�*9o@�8� �u$t�t��t�D�<6�bq� �1J�T��N��C��ʆj�5���p��R؄������=$�H�lp�cJ9�6��t*מxxD|y1a�?��ؿ�V���4� +�l( +�{��WJq�< | 2-��jxL"�b +N|F��^ +&�8z#����d�Ue���fϢ�f�q�^���[^�#�6O�,�Ot�����GA��H)<�/-` �a��ơ᱒�5$>Ap0L��ð�@�Ay�\� �ߖ� ��HH�&���+ߴ��!�.�} oU� DU(�I�P��I��x�U�zeVŻ��y���CZ<�3t��l�D���w�ԏԮe� (I],�Aq� �#D��I��D�y$S���%(�Oh�Y��+�Q���Ż8�d��C[-x0���B��4���"���Y�2 � �0�'� A ���%�B�q���~�~C>*�[�Fd�r�"��2��z�ԙ�$>��d�ݓ���"U`B���U1 V������f���k��nEq��rhe"��'�V�q �q�,y(K�kT-Z�/��_J�q2Ybѵ�L��I��~Čf�cf +Ă�! ��, �D��e C4����K��u�(6�@�Ic���&�2�-mt�LFI��SH�lUD�TY+u����o��X(7l��2>�O5�Z��p ��X�3�ap�"L�@��Z�� �Q#�7�"2�_E���Ԉ�X�plu��c��*#n�)��2A��` ��k�x��>� +�׺E�O�n�ȇ.�����Ob<�ӄjLt�@T�|=px������%�B�s�"aH�$^Q�(dDM���*u/�A ���ȖgH����}��� +��0�N,�t�� +��l,��V/{=�$��(S�� DŽ�'�hD^����5�P����HeÙ� �Ռ|6R9�[)I�d5���������'����t��G"j4���Q��4Q�q4�nqQ���V\�kA)�z�"rD��*�g2/bbR�4�0��= 5��۩KE*6��-����Y�!q싸��&o�d���5"��'j������y,��?r-�b�t��U�c td-�L/ߑ��p(K�G���ꃙi��yS uE\ @�@AS�r�l�f���fT���};I?F*�����s)O8��^�c2h�T��VN��V��騤��QрNG���8*�U�V� ������{�^��$ ��P +H�i�N-�J1�L���0r4��{� +�f$x)�H�5�}�6Y�j5Z��U����a*�?�� � �d��ZY"�MU��x �� ����r�.�H� �͚���K0dX0%�l +�+��es���nO�B.����;�L�@��c�6 v#�J��~�}�=�q?�=�i���-)q�]�?�[����ѝ�B�,S���B��f� Q4Y�08�`\�d0#���X��E��hN��:�~�vaES ��#��T?�+WYkXX֐��!�[��j�Px�%C�r♽�j��d�L6�3 s3j9�9u�-��X�����d��Ig(� #���)��ώW�j^���S'(�M��ϔ� Ԍ(�-�^Q#���f��x�����E��=�NGS>9 +0P� �'@o$m��;�<.)��:;�Q�����(8������4o�2N�� D�,�s��꽄��I7�b�R%���6P�v(0��Pz�"ё���<\�\�8�L��`�q6�-����!'�Ls$�kk��1o�} �BD��W���r��c�/P�ـB�n +M�TQ�TQ +3L5�A�b~��Y��a��+%nPR�7��� e��.ZU�r�}=��`�S.�*�qH� �o���r'!���ȩ'�v�@��B�O=*+��5����������0"��[�"+�0�1�S����8���l�ϲ$�a��eN��r�XQ�ds��3�1q�_3��X��c� J;�j�<�)y��1�t��t(�Gg_���߈��-����@�Ǧ���Xl +-l�E`m���N��9O�� �0%��^!j�j�qR�A�S$�b�C�ɠB�N�_+=�P'A"� +��tP8,&�i �>���Œt��7&�����w�ߑWٗ�U����>G�d�.���6�sעW��Y��?bB���eJl9S :��LN��S�J����' D�L� _� �θ ��n��Ɲ˿l2��Q[�_g���E)Ԯ�W:&"��8[B%=U[D� ��-� � +,�T������־j��u9H���"�{�#���X�_E(�fU�pW7�i�]$���X%NC�[�v���: +`L:[�N�x��5��͏`DDd��]�A�[;��� ���;eg����@_����C�,�h7\���"�)�|p��A7��m�KQ��o 7eW�H�Xв��H�m���fy3�X���%R֨,"&e�YE�$���#��F�m�����&�9��J`�lq��$�(���8AB}C{��,S���bS�d�HM�$R�:8IMV�7��)aaЭJK��L�����f0�Ǩ�nU��yUi-\:`b������0s|�H`���|� �D���dV����&[*��6~F�+�8 ؖ�����[�ך�#i(Ȉ��,)4����`]E�q� �IJ6¶r�[�:����������B�n��\�t��r�|i�-SkX}j23�̀1ng�e��P\��uRѓ����tg!�0����t�~����ձD �AS+�F1V) 4�gg�/5��I~��y%�+UĄ/D�@㷐�FR��Ntc8& .V�`U]AtV?�p���|��Eר� ,G�� ���e���[�B�5�X�C�f�@ +H� + # +�ㄚJ\�� t�/XR �}�jd�&h��r��[ v�"���J2 � B���5SS��R��'`�����Thj��X7a��R���~��S| ���8�!-��P�$<�B�w��$bA�5��(�Î�S��\�/��9�I~],�c��b�_*� Q���>[�J%;b��_�MS�UEwj�Dna � F��� ����#�4ͽ`jf\�l�������� ���Ak�a[�����:������VEAT� �-�ն��髸�k*W�}YY�1a�~�)x*��K�ZTE�oe@>Q�����}D�g] x=̀Ahj(X�Nhj�ѫ��35���Zñ��O��c�4�L�@���� &�J$x�0zĄ�o�����}�+!}$�=_R�@fK%��7 =������ q�<��qR�k�� +$�Z� L[� l��_��+���ccye� �^�� ��^1�+81Jk61��V��-����+�'��� ��-Oq�ɗ[��:�V=�\���I l 3��,��� ��:~c�o��;T���SU<��BSk�@�q��t������@:©����s-�h,��K��-%�!� y�m�V�]�9-���](`` ���W.Ğ/�/0u4׏��b0.|���ot�&�y +���| 4� @f�A�T ����\��t�܊�e�J�9.�3��"�7_�)x�uژ�R��az^�B��\5�WLe��e L�`��T�W)�y��€ҋ�D�_%h��j*:�}e�O�`������`��DY�c"�WNp����]�v�a`���&� ��~��7�Dzi�?��C�/&�~��* ���8_��m/��{EI�A� �@��q��چ5�>��Z��&K�50���w��uOژ��o�'��Հ@6�,�3������HNV�m $L M�H/�`�A�&���q]6x P%��_ōr~]��8b�]�S$��-�_�� +�5�F��ƨh�j$��ei���+O;�'h@����sa���yh��\�����OhE� �1�рVJ(nүh� �M���p1 �g���� �C?D{K,�sA��~-�2i�4g2-�J�e�|3��AF)B�~rWd�Rj�«���々Kc�\�Ī�HM�*��d2G �45�i=�j�hj�{��"!��cjڂ���W�n]T�2�U��ʨI@��3�xq5H5i�SiB{�r�驭 ��c��J� 2F� |E� ,>k�Le< �V�X�1��(?b�s�r�H��y��j_礶%c���� N���J���%��LH H�H�p������,��U��{C��z:��$]�ٱ9$��e]�'� H�"�(��~���i@��i�kp:��:E�}4�c!�8�O(�}���|4q+�0>��Z���Z��C�;����˺�����b�6� �e_�wqVu�� L� ǿ +s��f�����s� ������[��D�'� �t�Q��l?��8/�����L��`~��@!m��g3�pZ�<���i��c�38�@ya?�} �%bɎg-NjS��S*�|���4�Wәb��9N��8�@��!�j�-�C��{���Yϫ��Ja��ej�Zhj�vmm +��)�PS8X�*4����da�M̂��5N&X$���I�_xN`(�Gȥ�>q�_dD� �P�%>%�b=H+Ζ���UI���f��Eݙ4�h�8��P��-���v Uo�<��'8&/J����Y�R�9��$��O�ۊՂ  �E���:m�H9P�?8����K E��(@�(���4T� � +`��A?O���xO�T�� ��"�8]T#�H�9���ɞ�2m�!�K%��o� +b��z��8e�%���4�˺�:�62/�G�֊p������3.tY�����"� Tw��U� [��x6�;8�ɚ�p"v7fAՇq)1��Kh00��v7��ӭl�F��w��|�mضPTHÅXԒ���&fO w��>@:���~Ոp��!v+�=��ȇ�RW!���$E*� Ϡg�4�>t��"@����(��I�E���U�Rq�ڨU��,����Vfr�#�����_��׀=}E?��Wc3��?*^V����A���}���@R'������~���q�@SY.L{2D�9@S�b������y��a��}n�w�rQU�9<��'�����#V�j LVb%j��)��SE�{e|���Խ׿i�;.��J�U��,���Qs�rZ���ڻ'�T5a�y���J�֭�zB+/f�U����Duk�Tُz��X��.�k]����Q& ��–C�ʴh�K� �A���Ѣ��t�� VE^:$I���C22�l�Ya�lU1�9�ocɭ��Tz���(��ʚ��&� +f�e]��8sS��J-*�f�юE@�� .�á�*����Z�!��E�x��,a���^��:�b�O���4:�w�2D€mo�����9���s)%_��_� +�X��s;*\��OU5*�w�4�j.��5�/ E ?��Z�2�� ��{ �&�$� ��UD�*ne_�3AK۫Hd�F1-��F���0\�5T�l ���C�C�1�SJ#q �{��J{��v�)0�y8V�ah����a>B[߶�U)��a{J���X���1���A��T��P�z�1�:q>�gfY�amz�u��f +�֠�E .*i��Wa�*LJ���Y{��C8'Rꄞԡ���9Z��k����h.�x�iN��9ki��շ;E�[�k���+�N3Pu��r��� +�au|^�u毎 +V��91VXEUU� +'��'��iȚ�r^���.�n��,�Y-L� �䬯��}��N���i�7�h�bF��^U���t%X�8�k<μ`�<8b���v�������Y���$�1L�c���Ȋ����n��Ȣ%na.��� %��n�9 ;�^c f%�F��l� .^H���3-8s�a#�@�~ #@#H�GIHj��zKpt�t�S�N�$��J�?&��K{�����Tเo���MCg,\G�N_�UnF�I����뤜(8YQ�D�� !�.���ʄ��-A�a�Ah��Z��ڽ؊�X埝��L��F����$)J����.ڡ#vP�I:}:�o��͸6�פ��.``���`vYv�>R"fOy f�x�����>KW�{q��y~0�={����w\��[,��SD*q��d��1$�qa�H�0��g��=BE��X�d;�܅&$;�# ;��n� +�(�{MM���Bv�V!����]tm��7d�7�����BJ����=R*��g��E���i��� + �;���SX*p�X����-lj��:�Pg��T�Tbc�����?�B2�� j���Xb��bb_�1����}{�Ӎ}T�Ʈy�b�L@bw��+�X쇻;[�bO�Aα�gÅ�'u1�� >Vn� jc�yyœ!�#��X�����1ag���_bO�;쥷��t��3����p�^i9aw�t�9�� �:�]��a'I./!@O��^F�%;0�@�%3B��PUU��h|(� +-Ah' �V��ǥv���~��S\�� �� �ǀ�T��]S^�.1Y�Θ-`7���,� v������6-��- ��cnő���C �8�2�zJ(��R�gL�DҦ��),�c��6Ũ|�SI �e��������|�g���zi��.�t�Ί8_�P��q���!q�� H�u��z��|�%e�.�d�~fj`�D��^���X-� ��V�#�:�� �l=Ԧ�n�ZH>�vU�}����!�� ���rL��͓�ȕ{B�^'0^^�L.�����R�&�t�i4h�Z�hp<�il��絡�'x�����g� * ������W= +^��\! �4l� (6yLP�������� /᎓b(5��)���9vz��Iy��?Z"h��\��H �:Z�l)��@�X��D�3ǵLD����� �J�֍�ׂ@���"W���J���"�[Rpm�Ch�" Һ��j�|vϧe���M�)>�Z���8��I8���6��( +��QJF/�e�p�$O���B_����G�o����|$#}.��q��`Ip���7�J��\-� � ���Jx.�^>P�u�P�.��3�UD3��G���{�4z��ͥ$��u��{5�g:a��3��Ɵ�S�>�&�A���A�i�[zo���&Dcx+�+F.z8��`I�HRs����P�Ϧ +�%U䙉 +)�"k!����\D��>�|A� ��"���] ���iS�n�Z9:�|����U�R|�}?�A�)ʫ����j˜&�� �A�.�3���x �j�TF� mJ�-J�9Dg���ibDe����By��k�AD����]�J�绋|>� �}�S#�ZH�Z���=����%�!٠hB �"+���%�'�6�P-*�5JB��l�� �P}β��R�Pe`�j�"cϰ��P�U��@�S�LQ�+��.ƌQޑC%��,HR/+�\N!�@���p�;`>Y�i™�ba\DӃQG� �Ft��U��@��,5��@�9T&C�"�@�- :�Rޡ��ACт(IHF�Ж��嬁��b�f�FN��y?�I#�(� 3f;Z&>K=@.1%�qsBY�p9Y�1D�qb +�� KH�wRd�)@�?��L ̆9M����⼜�Sb�t��aT�xl����|F ]a���iY�A(��JJ5��ƺ�\<�0YCF>@%��/b��x�E���)Rjͤ��HϠ ]� �46�$��,}V]��0F3u=� v���'-t�� ��b���^��N�@�o]I\�LR���\���S�҃�Cղ��U�`�W2�o��X�-4*ǝ!���ٸ$��qVF?�@���4V6U�Mݍ�{�Ess��iz��Ӣ@�3��8���mt�c�����+�j({�|6ڌ�=uzq[<���t1��@�Q�e}���.B����yb1VA��lm����6�� +���#���S�X -���WXX�U��� P�m�PEH�����(A�2%�&�Pĭ���\PnTB�ͬVS̓�J���G�P�A�S/ L�A�<��s�5�v<�g�)�����s3m��:-;܃A�~�E�&�3�ñ��\�r& �����z���E`B.�<����%`��Jj��V곹N�H�TSŠRE�& ���f��J'ZM �cC;�nD��^�ɡ��R��q�71�`�{�\t� +*�*�ߡb@\0�W.h���S�W�����(��Ԋ&?�S-u��5 �x�T<�'� L +[�&`�Ъ^T[: �C=[�˗��Iw}�B�\��93���Y ��f)� +z`��#ڰ��� ��0N�t:��N��vx�O��� O)�j��V3�UT����D��,��k�g�FPfG�b������xۉ$�i*麬'��Y������m���8І�YR�;��s� //�b:`�@Fа����V'���`p�B,��&}��b��+���䫒������Z��r-t����r]�6���*�����gtl����_�_�T�h(��e2Bt�o��'.�e;�rG�´*6 +P���f;`�s� �)#2̲�5 :&9:���j�)i���A�4.���j��I%e��V�c��N>(��h9���!-�Jd�\��?%��� �6��-�W�Hj�ݹ��s��$6��K6=�8R(Mq;�Z�����1s�#JJ����h��Ҕ$��l�DZ�P� �� �S�&�F/Wd��l��ws��:36Fb�u��Ό�?�5@�Y����q��g0���T'BU���H�Ѣ��#�S�40�X�x�g�Y�D7� *"Ytu�:�*FK��'I"] ��3�u�8���?H6���@&9�'^nP�*��S��*G0�A��@t����r�V��R�ڮ���jT!���`�L+JU�^��`^��ZlqswB�����ۼ���n?�����I龴��|!�2m�� �~*mw�_�E���?���f��^ؾQ lW���h����� L0N<�u�$\e�g��Ԩ1� tє �f-�r ]3������Hu�>���{�������j_ЂC�v�X��K� �焁Ok����i\O�6e˴o(5���M{6tI"N��E�7$���� +�H���i/PnA��-�Eu?��Ě�H��'�b��'��� !mDDn.2�}U��NcZh��#6�����(���ڔ����@o,�@w_[����?тv�L0�]�ϝ��42@�7���}*�"�T���9OaХ�z:��������Ъ̮!|�����Ÿ���N�Ƴ���M<{�h����F ����A���͎9�|5� m�$��xz̬: &5W3~H���-Wv�K�}���%I��3�HPvZ(;�q�.�n�c���+���"�������r2��P I X��w� 'C8�ҙ F�]��i��K�0��A� &� a�o�{j:����c�%������U%��-f� �2���2v.�;����(��;���}V�c�/�� n� +4�!G��}��n�)`�mD��˖��h5�Jc@���,�~bAT�'�;BE��!�nBb�į� $��I�A�]T{�P����q�>�� �k���n"���p�'� _Q^_���Ԓ�,D@�n��p8��H�Y��o 1�#� �!vMF�.�ٰG�v����PD�g a?�԰wj�+���j�=����a/` ����6X�-j���0i%� ��M�*%X&��Fh�"X�`Y�S�P� +!�Q�{�ݛ`�`�O���{�{�z`X`'�b���/(�ҡ|4��(�M���W���-�U���Y����j��'(aO����.��p(\F+U�����>((�e���)��X�,M��Gh$8kЀ����:�� '98@'tp���zL�9��q��7��e�NR�n���l.���I�M���u���H$�r ßp�t]q��F;�3�^�������>[}��E�"6� ���1�1FQSr�L�JE�8E�J6&;L�����2N�":[��CO�@��@���"`��@Ľ ��`�ĦW�Jݷ"P}veN¢���Z���zM������(��Q�[�� ��e>9�%f~����t�Z+F���0-(�d2��馳�� �Q 45|@s���TLA@��#a������_�cvՁ"�YC\J��գ�.� �[ ٬�qN�I�}�w"h��=�$�c�e��Ŧ���E+���U$s%�����ysBը!�P��� ��� ?IF�q�Ma"�%eU:�Ԅh "��5�MT����]1 �Ip" 씼F��=pt�.*�ͅ��B����1H�y��S �x-��r0�c x��v��A=Ճ���-�%Do@��.�P��`h�V�:%\�A�0у�eT�(�UW�ߪJU?���D�D�q�(4��Na�@O\�(e�-�*�E����3�g +���e��H�����v�8m@H@Ӳ�&Y5>�\%�  F�ܹ� �5�Ho���X:�Xz@K\� �[m_���@)a"���z�`���Ƕȑ��C׎`D�A 4���7��b��x� +C�`�+`m�C�~#��|� 4o���,ys;2�Z���-��PT�Z T�T T% � +�0U4s���4� �k�R0�F�웠|����͝�S}�:h�������Tc~|boհ!-C�&o��d@M"�D4�B�#B� +�f[�ܜ�%�F�]fԉa��h�ԃh�)�h]��}� +��t:�f����7�5[h9%K!�,TC�Q ���ZK^؈�^�@(V�t��b��A�Bu IƳ)��+��A᳉�� {-D^�j�\�pJ�4���d���z�J�E�w񡿋����@\��)�m`&5l~�z_��8�����eid�H����a�r�/x�+����*>�'�Ѐ�<�t�^P� +͐<$,��s�d�EA:J�y�$u2(���!���F>���@���b�~! �yPKӡks�R�2BTa}�% ����\�k� �M�� � +��h͹1Yw��{օd���`��f� 8*��[ �����c�P�� ņ| +p�S�W'�֐*'+reb�x��+�"p�[�v¾Q�b���g��Q|���/V�8ۺ�o��b)�V�*ˤ�>� %:���q����@ċ6*l"��o��)�%���>;ű��*5�eksBF�Q��`S%�RJ�8� @'�ʚ;�ri���N R������?F&���`���hK�� +f�̘3;0/�$�)�䀙W�.g: �JJ�.L�N��z����0���F�g�|V1�0���8�%aHK�6�U{o���&"�رHB5`�����U㒯���2YM>D��8r�*����$#�B�(F���5��,>�H0څ�TbGC����!�&DZ�r<%G��vW��P���)m���% KOD.J)7m�J��9���a���4� +�}5�%@u#�` |0��ń��mH���W�#vT���K-��T�ujA@������e�.��ո�c6�θ+�g��Ikb� ݬ`�ތ߃�?b�F����Y�c8O�lO�[��Ib�w|�6��C؃�uk"��� ���^�U�T�Z��������{#� ��ڞ �}d���/BE(B(��R�v�W"X�� ��� �U>�뽚�ؒ1'��2�� +�eƜ6ar!����q$`�BS��V͝R���� {�P���!_<����hժؠ+��W&��`�����QkC� +<�(!\�a��T��I -�\����>��^=��eʬ������M>\�9A8g>!\Y�^��ۼ�b����y��n +�ҐI�I�_L�}v�/mW)���(p�5B��l{9���`�O���B�""���Yh�����jL��B �F8$�g����g�,�������U��v��[�� =aC6�s���S��l3������b%�k�� �K7�@#DG�[�luS������*Cr�C+��8��t?z���AW�y�K�+���vwJ�D���5� ����}j��c�6 p���f�b�|�[� Úq��$,���E��o̓����e�g�� t ��n�9m:�~�:�.S8��z�@G/c���-�=wB{ީK��K�1�P��cq4?�1�6�  DD�BP3/��� +�4r�^��c���& rv�r����.tΞÜ��H��O��.���, N���g���2<�j�2{ C��~���*�� ��'� ���ET&����1� ���l}���� k 9X�NV��ê�*���U�� �/�:��>�w��O�[���5R�Po��!�e�H���l���>�*�CB��%��G�Yd�S� �����(у�H�E&Q�C�IaT`?�����E��Q����WdG8B��v�왷%���K�N�ݤB��R"��� �ٻ�K�|}Ɏb�dQD�kX����]�*���)�}!J�9|߭Qh1bM��e��0-�BrT)�y>���Z��>�^�)��\�XA��6J���;���}E��±������a��nJ��k�7v��8��G�;��^��b�8n�7 ��� �)T���J6��3�?���� ���s9M"f��2��'��� � ��>�Q�sY��L�]��a���{L���&vV��]���c��U������s`�.U>�Y��ڣ#�h � �|�4*��R�b1�>F*�Ճg�eUV)�!Q- m���Fgɾ>W�Zt���/Ny���Y^�ThB=Ȅz@���>�{��$r{��o�hΠ�y:��n����d����Mb�:�\0���bP8 ��$H���.~� x����8+� |�)���{�'�'l_�V����VAC��%�ǵ���G�� �a6LH��XQ +�q�c��J��-t��8����Y�9:���ܝ:��>$��4��ëP��,��Ht�œL;�݆� ��2#�B�R:�B�Y�(*�Q+J�$��SY^��4��"?��I|6֝H'>h'���f>�B�����h�sh�.���N��K��j9�B-?tM1>p||`��Q�- ���� "Ԁ�RX�&ά�F��L*�#��[d<�"��i�(D4��Rb�A�K���Ğ���� <�hIu��Y���h��o4��7�B��ђ�7�]��h\J��0>��TZ�٥SJ'�܈ � ��g��j��Y`"K\F�=y��H%3�W!�5�"#����Č��dl�x�vO)���f(d���eC-�Pf �1��dz�D<=$����"� ��=�$7�0��>N�y`Yr_��H�� a��-���h2�����"�xp���Ԑ����bnZ��4`�>C5�R��1���D +��iQa�A�>�D`\H����Tq��+C���'���p;,`1Ɗ�R,�fN������U�X��⦜n�3P�ǘp[����G �2-ˊ�\�l(ѷLЬʆ@15� +);��{t�������X�� �R� &��+�5��T1}]�@�F�g��#�,����X��1L����� S�f�̊1��,N�[na��iN��k��K �8���#sp������؆ -��Md�\��j� JD�%�R+��:z��P:�y�tE#>(sǓ+rg���d�Y��E��,Pa��S��3��)9���)�d*L���7�i\���Z���t�)� �e��<�7}���3�a��P���W{.�7J�����zd�K��c��N1R}�O=ҚL��I�)9�G�;�]�<��Ԃ�p�0�8�* Xַ��I�M�{SʪU�Cu׍S �I[`�v�����0� �b0��q�f<�K8o�P�\�ϧ؞ �}rW#�X1�+��cM$Ј�O�V�P����J��ƋR��g�М7B�䬦���J�j�� 6�M�jA����(�X�$1Q*zpt$����hsF)!2��%j��CH��M��Y�zEV�Dl���jMu�S֓t��:T��T$�+����#5�=H'E#�|6z\ +�ǡ���A�S DnP/��Y�8�S7O�LZ%����KM� �p�GB���zsN�������$lP-)C����K 9��VEB�bx�^����*�T��b1Z����V����|֡ګ����E�09JB�'�gZ`Ė�,���~����(�5�%�e��� �����������狗u�a�*g����:�o_��Pʹ=1��ޅ���v�#�J�WL��]jk�˵��g��� Ӣ��j��Gc� ���z� +l*�!D ���Y���y�3�vN���WP�������a� x�v�"���k7�B�HB���������� �X� �΁�W@$>#L:(gcD��j4�Y/�� ��3�3�.)]Y]5��ª �V�g�1��;�q0�O;#`��M9ҮB%�M�ƽ8�-��G�y,�L���ɶf�v�ƒ��f!q!��'�,� +:� +:Bz�tt�*fH�zm +���@�6�^^�@�هpU)��t\Il.��r��B{u0 +�����P����B�5[Y�7�%#>*B�v��4��'��?�{Z�+b�����9F�ǥ@�\hюP�hO�E vvn�:{̑9;�J�~�ⳗLnh�>#�{+!<-�BE&�j�Z��1�!{�L��f��R#IW��P-���H�xөf�l�ìlv�%1�%6��`��%.fGq,f�Ƴ�]��fo���%�av?@�=�U��0��O�7{(�*;���~ yʮ1�O��%�����7*���t�:��+�����./�g���h�.�y(��+!ρ�� Ud_)��eNv��˾JƲ>b�G��EX�� +,� �n`�cu��,7F�R_��g������ [�P̣���-���e@Z�㠨/��rM���( �'�*����\K�:Ǝh+c�:���To��Ȉ�h������=�{�j쯋;�:��[����Nc?q���5���`N�w�I(����g�4��J�*E�ъM���V���A5E"�T��E��}��u��btqp;)`{L�b' ��T�\ ��8��D�aM��6n�a�H�f{є؆Pb[�c�~�B1���8I��v�ޕ�$�xa�Ӆ�(ղH��P� N��8�U��rC�y}���#�x�V��Z<jֳ) ��R�����AH��FP7��k`�?y��/���"�r���¡���}����ݜt-B՝���� "�&P@y3��$�� %������Eb* ��60 +Qb�i�hB�m�m/5� �A��/�Y9ut(�de��U! +tÄ�� @/(eS8���{%]�Iu �"��K�o�h�g�T ����)<]��D��^O�'���U�h�=�(}.��vn�R�d�go��X1A=mT��e��[� 6ؑy��4�@VD���}mI�?K��b ���R�O\� ��$j�]X!Av�3�7��p6���}$ˀ;ry3�J�|l]ȕ4!5 j���|����۴�DN�!#�����N���$?��z9�R��:��3H_xsH �j�t��+5�% �膜z"䤣&d�&��ۈ0����aF ����ï��p��VUIK�'\��d��"1agw�>[��YU���h&����� ,-X!Ͱ���ә ��x.��(��1�L/v�՘]�#!e<�����{����"� ��eQ�e����� ��5 +\�Bn,/-o81);݆�t�1e��<��qBH�<_�?�4/�7`�@Jp~��t؀�֪�9���> �5嫭�*-,/@�B`r��7 l�M?�f�BO���* ��,O\R�^,I�(�Rݠ &7�(s5N��Q��Y�>��Hp�D���<���z*�{@�Uo!mY�Lz���t���S���C�"h<������=��kh�:�a�R�t� ÀR��v���V��\,�4������qR��4��$�yB&���z�~�9����Dv��<��@2�9��遥f��C�i��Za� 62v |�;���H*KeH3�C�<֋�!�V�~�[8닇[ +�����I�|_�HE�J���CG�jxAB�1��2�.೹�n�y��� +>��S�q��M�)�p����b�����|��B��IJ7�Bsm��z�V��J_�!e8w3� (�|vR胫��ʼn!��K�Ԇ\��bxi�� ��� �����@�-�b��2������X������@��;�R}6�֙�x������I�ޮ�sG�4�GS�����:��e����Sp�e�7�|����\4�oё�g�� � +a��@u;�Ak�! (�Xe�PYRu V���(A��nȐ(� ���I� ��[%b����hS��i��E��Fw\�u�i(�l�`�����!'��(A!n���C�NܑT9�� H"T����ep��@�;u �JE�2*^�T*��P��P��s�|��r|Z��P!����%}F^�q����^� _��Q�� +��i +�����e1l������zQ8*u����,B؋��#>�Y����QG���9�<��9��� +!X�,Bs��o+�-nYm�,X �C�B�Z5lyZ�z�Uq�S�(�%S�t��g��l14 �A�"(���^UH�(N>�� b��� 0aj�N�IE��$Jp�T���(=ԏ �0b:�p$/ �.��`Cds������v��rbF/4\]��6�_=�6�8�!�H�oH���gχJ �:DJ���I�� ,í��B'HT�)|�c��p��M�*��B�k ����#Ѐ=<�#ܴ���Y�l�6���H��T=J��[��6 > �����ꅸ#��3�O܇�a)�``B�}ŀKo{(Esp}��P@�UG������hb5h�f�Z��O�`4Tr�uQ TQr� ��-��.v�g��'�"$���X��Q +�� "jJ�r�2`�!�iT$��I�`~P�) + �ͬB�rcXL +p���C�>�l� +�r +��H"3,�JFH:���A� "�y@��"���̫�����Jo�5!(G�e� ���{tJ���BE�3ٳ�('���'��� �e��<��nV +��񀼙����Cf#uç���G��NI �� ="��,�� 9|�YY�;��$m��ˬ�I�3ݻ��c0H�C��3� ��1�6�3�R� ��C��xC��X3��S��B8��Z�����Kd��AƏ�=��C� yU�Q1��I��9Ժ��ns�D�VpIMГM��,�\bT |�2�/�%d�9�+h���'������YZI(,U?m۫f4lѰ!�{�E|Wl"���h�3�$A[,��] �@@�&$�δ�ܴ���l��O��R��>��:D갥s� ����I�axL����M�s�N�؞C�աG�K��(U�6u�}&r�P�"̴A�*)\ 1QX%Q��&��������"� �a�hw�n.���6 �ܬ�F�L�!iM�I�&׀JK�;>+]2�mOj�s�� 5"��D�Yf�*Y��� ܥHؖ���\61X�1��3ZpBFk�R��X�IkL� �|\�{� �JNœ0qf�&w��gǔ�†9/����h64�>)ɑ�LV(�_�G�A�E���B� ��H�S���r� ��3pΒ��)-�܁��QG�n��i8�`m�Ip>_I�>ŀ^�!�z�x��h�}Z�{�i�)����LA&��P3��܍'U!8t�Z*%봤-1%B�����OP��g�������G!�S�j�F,=0����d��i�oJ0��!�=`<��T�t�R��*��X�J��?��L�ۼ$�N��m!���{�!$��������L��b��*׊X��>���b��� �`b9�'�"�R�.k�pkB�*C{��'*��K\0���p�4s����mC�.��dx�-�y�RP�{DC�B/�C���!� ��t8`�vX��]d�n�+> pn�C��3-��b��'Li�F�� +x|vx��@K���Ề��h�I��x��8 K�ϻI�l��l/o��'��vHJd{Y�=�b����l�.J&%�D�>��^q���E�P +]\]�� +���1����B8�XY��H��bg"�<|����M �#��K�v���vDDU;W�jթ�'��S�]Ct��D�Aߔ��K6�7`m�aO{{�Y� ��� `J�l��3L��H$�c�؃�B��I����0�[н�%蚊K� 1.���t�m2=�p)&�$���B%�UJ�+kF��S,�o��UttQ� +�1�- 0|�/�ߑڥ C/��)<�KO74�T1��u6�B��g��w�%����\dB{�bB�o����@_Ybh�|`h/ĺ@��.�W.�;[��Y�B;���3�ƂvaA{XB��W+�a��,���Uۡ�?��D�����狼�g��\c��L�@���z�S�P��A�Ҙ����> ���!��]��No��E�y�Ri=����N ήAg7�޳c +��(�� ���-=;� �xg}-��r��M��E�[��D����܍B�(8��g�1F�\%�Nƀ(��@zP�0(p���3�/��[��P e�P e�3���Kٿ�.��+�����eU�R�=t��NѤ��������$|�}렲��O�o�R���r��f�4�)��'�ZN�������Y.�Z�u^��A�>�JG�����5k���&���� �w; �m �ݣ=^л��ٶ���I�q�&�a|D�~3,+G(]5W�x�u�����A�*Etg�k��Wlt�M4xB��-�&b:�AT| ��|�Q |��m,��7.�X J�?)�"a��)`o�,Սyv>�8a��t�(�=Q^0�O�")������K�v�1OV�L�RcDN�~�P`NV�A�X5�xߚ|�rM:��J"�w%5����0T� �"U�C�>�6n��S�l�b�yj0��I��u���&F�mY�/ �q`�P@aA>ƶ@�sC:b�ځ�KUT�l@ה��������,C�3"l�0"!o�T����8� �1u5�5��5= m6�Ly���8��"��E0BO�� xD��N0�%�@� Z�3D�1���kR���$9���x,����FoYMv���)�����T.���Ґ��g&54�E�Ȃ((d� +Q�E�.�񦋨x�D4J0�H����A( 0/��V�@���(2Ѥ�VK)��+�2�MA5` uOZ*i��'T�k�ueOH�g%۳hO���M!ʂ!��Z���i$3 +`J��1y��I�cY\v̴!���r��=���}���ʑ� �:�L����RT3jR�yÈ��e@YT�3qQԋ�$�JBh������ʂ<��$ �t������չ��h+���5�.HɄ �3`�#!>��N�6�hp�dO�`Ȥ���I#�XHgDZH����p���\L&��Tv��@�BUջ�X�K%THJ>��\5��i�T^#�P� �g1�Bb "�h�"Ԓ�����rC�R�c@)����gD/���yl��&  �/"��H��k�j4����@�'�k �$\�= �@`?\T]��n�Rc +(@P�!|u��)�iU-r����x�����P+ŝ+_rۅ�����M����0C9귥)���D��:Gb�]�.c��f��=s���J�Ѫ7��B��&̟WR�gBDD��[�Un�+�}6Jh�-�kX�2��PIށみ#A���� r�q�*�%\RΔa!��ZV ��{��A���Lf���HM����d�`%^�`Y�:bq����J�>V�R&�kRZ��M���X�f��ȓ�NFUy- %l"=��q�T,EkI�B�K �##;��UA��/R�Yh�� �0u"*Ed�ÚΠ2�%�&[�LZ# N�K' +�g����j(�\CS��#X�(.�����y+o�XnDu0����c�ImH��5��%& �"aP�b@|,�>�xC����] �}Sl�[�r:�MBX�k�Ȯ%R�x'MW�>@i�&��,J��D}cd��\륿���'B}gBK���I$ص�a�~��I�;�=(�L��œ��Å�D��,� ��@!)Z��zn����.����R�$��%A*��| KGrimZR!�3o��n�C(��DT�����Hd''R�pɟ$�R����B ���cnq�>�Vj}���*��"2W� 2�ˬ d�Md�J��sn���P��1�\���9�� s7\��� �%s�@> ��s�v�:���VU%�p��������`+|&�M|S�8�� �g�/�Q��~�o�D�@��+t��b|��dP8��>:(E��p�"�}|���f(��馢N��Oў�O��>n��^]��.�a��ڄf��%o|�Ų�_e\4�€�L95g�����T!���p,�B�pUy��<���H�����!N��u�9�ٙ����+�`D0e"��������$W-�Y� 罤�9��dC��)�y��W� ���g>6u�HD0�`�Il��hy#5+�s�"�̇Eb� BK-1�`0�J z����SؙfI\%ՐM���+>����8�eR�hY��.6EȰ �JC�&��"@{�>� F�� w,���7�ܜs���a�Ub' ���\�"~:񙆩�&(���|���.]+��U +��W0�F;������|?�]6׺��p�Ÿr!�ZA���W��IqojG�Dp�n����3��IE +�(Q�+��ͫ��{��T����)���gqo�O��:��)5�Q� ۗh��C��G"B$G�> k"�r����&�;S�Z0Ӧ5�<ϼ��g�9���#!��8�����\@2��6�k]�÷B$ +R�(��Z�sRj8�D��V�c�3R��3)�������_���}�`V��ҹT�K0�*��!r� jD������HQ�>����Ud�oV$Y~��� r�Aq��x6��AԖ�=zdH���Qq��'wߘ� b��y��3��u]!���C@�� h̟�� > I���,��SfRA�a�Ϸa�*�˟]j �@��]��Z^a~@G�����w}���ċ���*���QT n���W88��^���x�D���!jF +5AS�Aj�ڜ柉D?'�8�� �w���˞/��|�3���g>��|�3��Lk���1�6>k�@g�m�}���2|$��(�LF$�E gp�*����78{��%0?~���P�g^����|�3���g>��|�3���g>��|�3���g��"t�^�֖�����0E؎�(��l y +�Ym��:B[۔�`�|6iWQ�Gn7貤2觪�=gc��Z(�sD*�7�����f�!��(+yj U}vH(�S�����#=����3,�D��"@֠Ν^��T7��C��\Y@�e���+�ٹB�좆���vv����g�Jr�>gΞ�ER�{0̧�6�e�1��QЁ`�[�6���;g|Ǯ�2co��WĒ�$�dw�����윌��o@>cG��#�6��:=f�/��X��*Z�%�d�̆�N⊰�pO��yjb�)��…�-�8S���ut#��y��^�m$X��)����=t@w�eYB0�����/p��g��~C�{쩎�1v�=6�\����X�1֊�_�=NF�FK�:u�}F�<�K3QHT+�f �s���5��[���>y]��^�_�� V�u�~�<_�^���(,����^��}6�l��띲�\����,�F�pN��=B�(dy}���p�a��'��u]��̮�L# ]����I�_�����:�tw���]?Q��w�W�a�W�q�����u���-z]ϬR\�l&.��Y�=b���3�l����n������zp�J z�P�|!K���I�,�5�(�\� � �뭺��̉�u�J�:�3��Bˆ�q�uq�q}�j���\��!�)o��y���`|�C�� ���j��F��h�kr��!w� +�qF�k �����U�����O}i�Tpi}��Z/�[��a+���K� ��� k�u�2�zD�����#��>k���p�&[c[Q�0M(�XŒ�Ȣ��O����7A]n#`���f.ziLQ�85�����L�^* Z?�Z����%�.�Z� ZoA���C��nh�6���k~�ӥ���q��H͓��9�;:8�!�Vr���1,���������E�� 멈"���T^+���\�p5�-�)�ު� � ��o"��^��e��u�.:��{��6� �g�8:���]�RK{�0�����;���Dr�5upwR������� ���6���r�T%�.*���EC�V[�Pj5�ku�5 +��� �k��Z���� y�0�� �׵��b��v�[h#Qm�X���A�g�&9��98��(q��ctr�u���"\��&���:�ȁlT�h� +M:b�9����%5<�{ ��L��z����/������` &�--�q�bR�k'�Wq*��:��``���0�Q^�qa�xE��!���!C<��|<�iu�f4/�>�\���y'�q�-����Ӻ��t(��։��&J���n��bɆ�|R��#O���?G'�<��9 n�zH��H�M�<&-�4�a�Y0�PG�a�'�لy� /�9y<�����?�)�� �J6��>Ḛ�j���RY�<<ں^�#j�Q��>3t!|~Б+++�WuT&R&B#��F�B�dNq�H�U�]���c�P�RȝwJG��>�׉%��2Jl_}o��6�����L�Z���p�0�q0p6�,�d�PE�?I� EA��I!�jł��B+���m}81PK�.%q�Mq7krܡ�Թ���ن�u^�#`��pl�$�����r�e�*��GR�.�i)���rSְ�:��7N�%%b �he �E��HQ٩�N��:��� ��G��b���0��E=.���.��|���>ag������X�+ɬ VX5�x�d���JR��%����9}��ZL���X���0�� �#�ՙdՙ��ә$�?H��6��a,+�J.1�Wl�`fCG�!� �z.㦱���Y|ShQR"���ÈOb@ �\1��DŽZ��� ��ޘG�3�G�dXP;�1B� i��޹ �Áa�R���� �r ��0��V ��tHI�� 9��˜��b����U��'�(�L�����7�] LL�l�BS�� �li��{�r�)�| p���;F�ԇ��B��`��M��6K>�X8Ar{p�dDIk �sғU�kG���Ž�d�8���! KĠ�m��J�F�'q�F�V:�|$� �c�4�c*)��a�LD�\����vx׶0��E�0�{�uF�� ��UJ5^'�5>C(xH�s��P���l����UR +0���{yT i���xm���5_2�*�g�Ik� �����Bè�:Y�J�jA7 ��N.�A�Y��t�dJ�e\)L��,�$��{ܛR�����$ʅ�Sn�N�3�g�� �AՂ:���2�Q�J4��{�P�&���R�DC5�^PxJ��#�C7[>s�� ��%�<���Q u����lB�9���_a�|$j����g �W�ZŻR �� /�kY����cK�bKW+2�R 8��t?��ap.�fR�>C�0B�X൓���O�����] (��3����,�mU�EV�2�1&���=�Jc�Bm�^c�l��I;���>c�֠o���O���!8�v�ը��b�¶,�� 0�N3�,��R�@G��@��@?��^ +��fAo�����&�d��h%��\�0>��LD��Ʉ@6����)wlv�cv��dv�:�]�a�= N>Br����n>�*�ƱF-����W��.|&P"�.𦕱�����]�$;�� dO��Њ��+���e�@Dd�� +�H�`F ;w�? �u��X��Wŏ>��I$�$�+ +�A���WH�_0�� $���S��B�-v8W��g�����aR�^O-mE��gm��i1~Öq��ܔr5b�]rʀ=}��� 7�K��/��c��� �aW;��P vp��;��R�C�$y��"���"���<�5ӡ@{ļ9B�� ��J�?���`�:���'��%��u��*��=9�뒘���6�:!#�zY�� ��Wg�4���:��麝&���ήw��x.�\�B��j�@|�[�B# ��D��)�ּ��G��:�=u]�[]e�����!���Jc��yW�7N������s�:�q��ry�x�.b@�n�l�5��:���e�B��7�J�8r�;"���O�F��1<���<,@�����(���� �s�s�����u�M�~� ]��ܮ���V��1�v}Cۮ�Zl�U���'��uQ���p=Zp��\�`>���Y�"�(��H|�рpM��١�}� �O#�,�2z�C��Ȧ���X%+�T\�X�V0�7��$��u�ѐ�a��u�C����\��\g9\?\�\�M!�3t�����^�C�1Y4�=�l����D���@�L{����!K��>3��9����l�G��1F�6R����`I������>2�k���������^8��{��}O���U�w�٘����{ �~�C@�hӄ�ML���9��(�:vF�2% �@��d\"k%H�_'� +^�}]�u�X��=õ�ʧ�N��\�w����|w[����|���w��|?�8�?�|�5�:�up�E.d���j���QL��OL���L��8Z��@W�z���t��"����� -v�0�غd��z�jl�w��wTz��d�>k����Z�u@@�u�=oݴ���С@�Q� �ti����*���' X�Mn�����Q�sNQ q�U4�\��Y��� L ��W��J�ut�ҺK����s�2~�.Ҷu�7n��������:�����WYc).]5.�5��l>ۀ`z���j�� ��mQ�MF����I ��zR�Fn@�zbBP��E�I����l#���� +C�c�к�T �����Ѻ��2t�l��j����Dо�:ƣ7��]m'Ԃ��x΍G|fE�<'Y�$|��c}<�M��՗��4m�)Xb�ծF��r�,t���( *�0� +�:iD��f0��ty�b�4Z����I(��q-��L6����j����f,�Cvp#Tvp��)q�et��E�Ur��M��›p,�MJ�� +��;���<�@�t uP�%KxѴ,��Sx�5*��>�xHK�,h�h�"(r� +���s��NQIƷ-�'��G +1�E��@� qy�@�$����\t[��N.�y� �5��+�����U� x@�QȀ9�����kx��P�r���+��6L�;;'D2jH�d�x'ɘ)�'��D��UB�4�ę*W�cK���]p �� *�EK�ߏ�t��y��]>��kG��q�f�f���΃��BS�) ����M��1��VB �7˘G��G���IzHȃ�.i��4br����r�A�J�EY�!7�8Mw +�/��>N�S{P-�dcJ�慇�|��x�C���C�-4�:4s���@��"�H�����X8��Q@�LrL(d�~L$��c�GΨĻ������u�#�d�H/��T��S$���xC}�Y�:ڈ���X-Q@0)N��^� \���'���x�=/|Q/�Y)��> �Ex@&���������OMt�ϛ}i��S6h-Z�P�u1"� �)*�i� D.@9p��1��,Ը����� ����M���ԇ X>�לr�ڭ���qu�NWAg���$��[��>��U��@jA`;ႍ"ҕɠ�Q� ��žsC3UGCcR�L$ XV&��eDX�xMI��~ű�Jű�YMs�,,s�Z��H��q 0v�dM�d��S<2^ 1� �3"xt��0D�������`���Z�1�ok���Ɣb��Y`\Ǧ[ �� p� .� j��4+�hZ�|ЦCG}0 lܴ�\ f_��گ�m�X�i[��u9��6(��-�q]@a���A�pV�oq���o +BxL���0jd�� !|�9�1|9���D � @����N����pK�F�<�(%��q���7�����\D�B]b����b԰lmʠ�B�� .ԋ���#8*�U�XuN�c�BL�154�ItTr���˥��E��9Ǥc����PK�-@OĮ�i�j�4lӸi�&��Ԇ�+�֪�b"�g�P����P�d��"-�9ٱ#A��t�;���SΙnIN%��&J �������Tw8�mѐ���._�c(�H�o�Ƞ�޼�ĽqY��38�� 緩0� 5.�0�Q%��q�3���f�{�����*!���x�q�4m%�7��{p�� ��Z+�G�J (6X�!��)I1ƍ8���;�L(�I$.b(�uP��z=< �s��y7��H�44�g0���\��ub@*�X�H%�y먔Y�'��d@UB��O�]a�r�Ő�Q+�!\�߼Қ��`�^=��\�����z��L�*}F%XM.iq���~���ȓ�� �P�Y �Z��V�~��\�B{�L�2:П�cr�b/荽���ع�ˇ׾��0��-bg{�E��qX�� ���1˼x�Lj� �"�!�,�ʰ��A��Ġ�k=�Fk��R@�,�U��Q;ElU��^Z$$Z����='G$!�@_]n���uR�� ���K��(:�K��`]���!6����-.�A��l�Lu�����|�R���fk�=�Ҙ�H�=1sg�(��G$��rs��D�3J��%�.�Yf����h-V��Ru�2�v�Jh糔�*@��x����8%C!5s��7Bv����Ś�~q�Ȏ0�e7���P[�ԫ(;�u���=`��o�t�A�y#Fʼnvh�HF\ p�L�$X�b�>+�9���J-I�x%��&vOzcWe̱{Ns쵊0v�"{�È�ݴb�e�}��_�]-�[�-6�n�$��МPhr�h��S_��m�;>,�s��?�vEf ;�"�=ga�a��������Î�尯�1삏�}��`�Xx%q�V*��p�5s���n$"��f.M�� ͇��� +dT���$���1�A�|���kX��`��{(��J��.����}=��β:�����P��:���E��_���Z� p�-�ܪۈ��>p`��[��!r��3-h�a�۴��nB �z}T��.�&^���}vY���2>^���M��똇����!��my]���;�� ��ԃ�U�Q49u��B��6Q �k����R"�|v��.յ��EwCK������(ED즄t~뮯R��ӯQ�Un��X�꺈Nu����K��u��%T�;��1J%�t�a�.2�]���{&�V�|>��:�>."��5]�3�{��e��ik�L.H)^�3���F9��Q��M��.��:���z$��`�u=�] ®O8`�����㺈�q}�b\�`\OET\7D\���Z��هA��]�T6�s�xO �p/��B<�<�Q&%�6�K�K���V/i���M9#K endstream endobj 32 0 obj [31 0 R] endobj 42 0 obj <> endobj xref +0 43 +0000000004 65535 f +0000000016 00000 n +0000000147 00000 n +0000055738 00000 n +0000000000 00000 f +0000055789 00000 n +0000000000 00000 f +0000453810 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000453877 00000 n +0000454275 00000 n +0000455586 00000 n +0000521174 00000 n +0000586762 00000 n +0000652350 00000 n +0000695469 00000 n +0000761057 00000 n +0000826645 00000 n +0000892233 00000 n +0000957821 00000 n +0001023409 00000 n +0001088997 00000 n +0001154585 00000 n +0000000000 00000 f +0000063642 00000 n +0001220173 00000 n +0000056186 00000 n +0000063942 00000 n +0000063829 00000 n +0000062590 00000 n +0000063081 00000 n +0000063129 00000 n +0000063713 00000 n +0000063744 00000 n +0000063977 00000 n +0001220198 00000 n +trailer <<6253608F8F594A299CBD88869FB38840>]>> startxref 1220370 %%EOF \ No newline at end of file diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000000..c4be1c5bc2 --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rich_ + \ No newline at end of file diff --git a/assets/logo.txt b/assets/logo.txt new file mode 100644 index 0000000000..985e43326b --- /dev/null +++ b/assets/logo.txt @@ -0,0 +1,10 @@ + .-----------. +/___/__|__\___\ +\ oo / + \_o8o888___ / + /888888(. .)8. +|"""""[H]\ /""| +|-- `. - |^| -| +|__ _)\__|_| _| + _(________)_ + (____________) \ No newline at end of file diff --git a/asv.conf.json b/asv.conf.json new file mode 100644 index 0000000000..0768205128 --- /dev/null +++ b/asv.conf.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "project": "rich", + "project_url": "https://github.com/Textualize/rich", + "repo": ".", + "repo_subdir": "", + "install_command": [ + "in-dir={env_dir} python -mpip install {wheel_file}" + ], + "uninstall_command": [ + "return-code=any python -mpip uninstall -y {project}" + ], + "build_command": [ + "pip install poetry", + "python setup.py build", + "PIP_NO_BUILD_ISOLATION=false python -mpip wheel --no-deps --no-index -w {build_cache_dir} {build_dir}" + ], + "branches": [ + "master" + ], + "html_dir": "./benchmarks/html", + "results_dir": "./benchmarks/results", + "env_dir": "./benchmarks/env", + "dvcs": "git", + "environment_type": "virtualenv", + "install_timeout": 180, + "show_commit_url": "http://github.com/Textualize/rich/commit/", + "pythons": [ + "3.10" + ], + "matrix": { + "req": {} + } +} diff --git a/benchmarks/README.md b/benchmarks/README.md new file mode 100644 index 0000000000..d024fa1889 --- /dev/null +++ b/benchmarks/README.md @@ -0,0 +1,17 @@ +# Benchmarking Rich + +This directory contains benchmarks, for monitoring the performance of Rich over time. + +The benchmarks use a tool called [Airspeed Velocity](https://asv.readthedocs.io/en/stable) (`asv`), +and we've configured it in [asv.conf.json](../asv.conf.json). + +## Running Benchmarks + +We strongly recommend running `asv run --help` for a full list of options, but +here are some common actions: + +* You can run the benchmarks against the `master` branch with `asv run`. +* To test the most recent commit on your branch `asv run HEAD^!`. +* To generate a static website for browsing the results, run `asv publish`. The resulting HTML can be found in `benchmarks/html`. + +The asv docs have some more examples [here](https://asv.readthedocs.io/en/stable/using.html#benchmarking). diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/benchmarks/benchmarks.py b/benchmarks/benchmarks.py new file mode 100644 index 0000000000..bfcd7b6358 --- /dev/null +++ b/benchmarks/benchmarks.py @@ -0,0 +1,193 @@ +from io import StringIO + +from benchmarks import snippets +from rich.color import Color, ColorSystem +from rich.console import Console +from rich.pretty import Pretty +from rich.style import Style +from rich.syntax import Syntax +from rich.table import Table +from rich.text import Text + + +class TextSuite: + def setup(self): + self.console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False + ) + self.len_lorem_ipsum = len(snippets.LOREM_IPSUM) + + def time_wrapping(self): + Text(snippets.LOREM_IPSUM).wrap(self.console, 12, overflow="fold") + + def time_indent_guides(self): + Text(snippets.PYTHON_SNIPPET).with_indent_guides() + + def time_fit(self): + Text(snippets.LOREM_IPSUM).fit(12) + + def time_split(self): + Text(snippets.LOREM_IPSUM).split() + + def time_divide(self): + Text(snippets.LOREM_IPSUM).divide(range(20, 100, 4)) + + def time_align_center(self): + Text(snippets.LOREM_IPSUM).align("center", width=self.len_lorem_ipsum * 3) + + def time_render(self): + Text(snippets.LOREM_IPSUM).render(self.console) + + def time_wrapping_unicode_heavy(self): + Text(snippets.UNICODE_HEAVY_TEXT).wrap(self.console, 12, overflow="fold") + + def time_fit_unicode_heavy(self): + Text(snippets.UNICODE_HEAVY_TEXT).fit(12) + + def time_split_unicode_heavy(self): + Text(snippets.UNICODE_HEAVY_TEXT).split() + + def time_divide_unicode_heavy(self): + Text(snippets.UNICODE_HEAVY_TEXT).divide(range(20, 100, 4)) + + def time_align_center_unicode_heavy(self): + Text(snippets.UNICODE_HEAVY_TEXT).align( + "center", width=self.len_lorem_ipsum * 3 + ) + + def time_render_unicode_heavy(self): + Text(snippets.UNICODE_HEAVY_TEXT).render(self.console) + + +class SyntaxWrappingSuite: + def setup(self): + self.console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False + ) + self.syntax = Syntax( + code=snippets.PYTHON_SNIPPET, lexer="python", word_wrap=True + ) + + def time_text_thin_terminal_heavy_wrapping(self): + self._print_with_width(20) + + def time_text_thin_terminal_medium_wrapping(self): + self._print_with_width(60) + + def time_text_wide_terminal_no_wrapping(self): + self._print_with_width(100) + + def _print_with_width(self, width): + self.console.print(self.syntax, width) + + +class TableSuite: + def time_table_no_wrapping(self): + self._print_table(width=100) + + def time_table_heavy_wrapping(self): + self._print_table(width=30) + + def _print_table(self, width): + table = Table(title="Star Wars Movies") + console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False, width=width + ) + table.add_column("Released", justify="right", style="cyan", no_wrap=True) + table.add_column("Title", style="magenta") + table.add_column("Box Office", justify="right", style="green") + table.add_row( + "Dec 20, 2019", "[b]Star Wars[/]: The Rise of Skywalker", "$952,110,690" + ) + table.add_row( + "May 25, 2018", "Solo: A [red][b]Star Wars[/] Story[/]", "$393,151,347" + ) + table.add_row( + "Dec 15, 2017", + "[b red]Star Wars[/] Ep. V111: The Last Jedi", + "$1,332,539,889", + ) + table.add_row( + "Dec 16, 2016", "Rogue One: A [blue]Star Wars[/] Story", "$1,332,439,889" + ) + console.print(table) + + +class PrettySuite: + def setup(self): + self.console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False, width=100 + ) + + def time_pretty(self): + pretty = Pretty(snippets.PYTHON_DICT) + self.console.print(pretty) + + def time_pretty_indent_guides(self): + pretty = Pretty(snippets.PYTHON_DICT, indent_guides=True) + self.console.print(pretty) + + def time_pretty_justify_center(self): + pretty = Pretty(snippets.PYTHON_DICT, justify="center") + self.console.print(pretty) + + +class StyleSuite: + def setup(self): + self.console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False, width=100 + ) + + def time_parse_ansi(self): + Style.parse("red on blue") + + def time_parse_hex(self): + Style.parse("#f0f0f0 on #e2e28a") + + def time_parse_mixed_complex_style(self): + Style.parse("dim bold reverse #00ee00 on rgb(123,12,50)") + + +class ColorSuite: + def setup(self): + self.console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False, width=100 + ) + self.color = Color.parse("#0d1da0") + + def time_downgrade_to_eight_bit(self): + self.color.downgrade(ColorSystem.EIGHT_BIT) + + def time_downgrade_to_standard(self): + self.color.downgrade(ColorSystem.STANDARD) + + def time_downgrade_to_windows(self): + self.color.downgrade(ColorSystem.WINDOWS) + + +class ColorSuiteCached: + def setup(self): + self.console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False, width=100 + ) + self.color = Color.parse("#0d1da0") + # Warm cache + self.color.downgrade(ColorSystem.EIGHT_BIT) + self.color.downgrade(ColorSystem.STANDARD) + self.color.downgrade(ColorSystem.WINDOWS) + + def time_downgrade_to_eight_bit(self): + self.color.downgrade(ColorSystem.EIGHT_BIT) + + def time_downgrade_to_standard(self): + self.color.downgrade(ColorSystem.STANDARD) + + def time_downgrade_to_windows(self): + self.color.downgrade(ColorSystem.WINDOWS) + + +class SegmentSuite: + def setup(self): + self.console = Console( + file=StringIO(), color_system="truecolor", legacy_windows=False, width=100 + ) diff --git a/benchmarks/results/benchmarks.json b/benchmarks/results/benchmarks.json new file mode 100644 index 0000000000..1df1be7ddb --- /dev/null +++ b/benchmarks/results/benchmarks.json @@ -0,0 +1,483 @@ +{ + "benchmarks.ColorSuite.time_downgrade_to_eight_bit": { + "code": "class ColorSuite:\n def time_downgrade_to_eight_bit(self):\n self.color.downgrade(ColorSystem.EIGHT_BIT)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)\n self.color = Color.parse(\"#0d1da0\")", + "min_run_count": 2, + "name": "benchmarks.ColorSuite.time_downgrade_to_eight_bit", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", + "warmup_time": -1 + }, + "benchmarks.ColorSuite.time_downgrade_to_standard": { + "code": "class ColorSuite:\n def time_downgrade_to_standard(self):\n self.color.downgrade(ColorSystem.STANDARD)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)\n self.color = Color.parse(\"#0d1da0\")", + "min_run_count": 2, + "name": "benchmarks.ColorSuite.time_downgrade_to_standard", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", + "warmup_time": -1 + }, + "benchmarks.ColorSuite.time_downgrade_to_windows": { + "code": "class ColorSuite:\n def time_downgrade_to_windows(self):\n self.color.downgrade(ColorSystem.WINDOWS)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)\n self.color = Color.parse(\"#0d1da0\")", + "min_run_count": 2, + "name": "benchmarks.ColorSuite.time_downgrade_to_windows", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", + "warmup_time": -1 + }, + "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": { + "code": "class ColorSuiteCached:\n def time_downgrade_to_eight_bit(self):\n self.color.downgrade(ColorSystem.EIGHT_BIT)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)\n self.color = Color.parse(\"#0d1da0\")\n # Warm cache\n self.color.downgrade(ColorSystem.EIGHT_BIT)\n self.color.downgrade(ColorSystem.STANDARD)\n self.color.downgrade(ColorSystem.WINDOWS)", + "min_run_count": 2, + "name": "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", + "warmup_time": -1 + }, + "benchmarks.ColorSuiteCached.time_downgrade_to_standard": { + "code": "class ColorSuiteCached:\n def time_downgrade_to_standard(self):\n self.color.downgrade(ColorSystem.STANDARD)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)\n self.color = Color.parse(\"#0d1da0\")\n # Warm cache\n self.color.downgrade(ColorSystem.EIGHT_BIT)\n self.color.downgrade(ColorSystem.STANDARD)\n self.color.downgrade(ColorSystem.WINDOWS)", + "min_run_count": 2, + "name": "benchmarks.ColorSuiteCached.time_downgrade_to_standard", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", + "warmup_time": -1 + }, + "benchmarks.ColorSuiteCached.time_downgrade_to_windows": { + "code": "class ColorSuiteCached:\n def time_downgrade_to_windows(self):\n self.color.downgrade(ColorSystem.WINDOWS)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)\n self.color = Color.parse(\"#0d1da0\")\n # Warm cache\n self.color.downgrade(ColorSystem.EIGHT_BIT)\n self.color.downgrade(ColorSystem.STANDARD)\n self.color.downgrade(ColorSystem.WINDOWS)", + "min_run_count": 2, + "name": "benchmarks.ColorSuiteCached.time_downgrade_to_windows", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", + "warmup_time": -1 + }, + "benchmarks.PrettySuite.time_pretty": { + "code": "class PrettySuite:\n def time_pretty(self):\n pretty = Pretty(snippets.PYTHON_DICT)\n self.console.print(pretty)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)", + "min_run_count": 2, + "name": "benchmarks.PrettySuite.time_pretty", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", + "warmup_time": -1 + }, + "benchmarks.PrettySuite.time_pretty_indent_guides": { + "code": "class PrettySuite:\n def time_pretty_indent_guides(self):\n pretty = Pretty(snippets.PYTHON_DICT, indent_guides=True)\n self.console.print(pretty)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)", + "min_run_count": 2, + "name": "benchmarks.PrettySuite.time_pretty_indent_guides", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", + "warmup_time": -1 + }, + "benchmarks.PrettySuite.time_pretty_justify_center": { + "code": "class PrettySuite:\n def time_pretty_justify_center(self):\n pretty = Pretty(snippets.PYTHON_DICT, justify=\"center\")\n self.console.print(pretty)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)", + "min_run_count": 2, + "name": "benchmarks.PrettySuite.time_pretty_justify_center", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", + "warmup_time": -1 + }, + "benchmarks.StyleSuite.time_parse_ansi": { + "code": "class StyleSuite:\n def time_parse_ansi(self):\n Style.parse(\"red on blue\")\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)", + "min_run_count": 2, + "name": "benchmarks.StyleSuite.time_parse_ansi", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", + "warmup_time": -1 + }, + "benchmarks.StyleSuite.time_parse_hex": { + "code": "class StyleSuite:\n def time_parse_hex(self):\n Style.parse(\"#f0f0f0 on #e2e28a\")\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)", + "min_run_count": 2, + "name": "benchmarks.StyleSuite.time_parse_hex", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", + "warmup_time": -1 + }, + "benchmarks.StyleSuite.time_parse_mixed_complex_style": { + "code": "class StyleSuite:\n def time_parse_mixed_complex_style(self):\n Style.parse(\"dim bold reverse #00ee00 on rgb(123,12,50)\")\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False, width=100)", + "min_run_count": 2, + "name": "benchmarks.StyleSuite.time_parse_mixed_complex_style", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", + "warmup_time": -1 + }, + "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": { + "code": "class SyntaxWrappingSuite:\n def time_text_thin_terminal_heavy_wrapping(self):\n self._print_with_width(20)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.syntax = Syntax(code=snippets.PYTHON_SNIPPET, lexer=\"python\", word_wrap=True)", + "min_run_count": 2, + "name": "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", + "warmup_time": -1 + }, + "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": { + "code": "class SyntaxWrappingSuite:\n def time_text_thin_terminal_medium_wrapping(self):\n self._print_with_width(60)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.syntax = Syntax(code=snippets.PYTHON_SNIPPET, lexer=\"python\", word_wrap=True)", + "min_run_count": 2, + "name": "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", + "warmup_time": -1 + }, + "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": { + "code": "class SyntaxWrappingSuite:\n def time_text_wide_terminal_no_wrapping(self):\n self._print_with_width(100)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.syntax = Syntax(code=snippets.PYTHON_SNIPPET, lexer=\"python\", word_wrap=True)", + "min_run_count": 2, + "name": "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", + "warmup_time": -1 + }, + "benchmarks.TableSuite.time_table_heavy_wrapping": { + "code": "class TableSuite:\n def time_table_heavy_wrapping(self):\n self._print_table(width=30)", + "min_run_count": 2, + "name": "benchmarks.TableSuite.time_table_heavy_wrapping", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", + "warmup_time": -1 + }, + "benchmarks.TableSuite.time_table_no_wrapping": { + "code": "class TableSuite:\n def time_table_no_wrapping(self):\n self._print_table(width=100)", + "min_run_count": 2, + "name": "benchmarks.TableSuite.time_table_no_wrapping", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_align_center": { + "code": "class TextSuite:\n def time_align_center(self):\n Text(snippets.LOREM_IPSUM).align(\"center\", width=self.len_lorem_ipsum * 3)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_align_center", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_align_center_unicode_heavy": { + "code": "class TextSuite:\n def time_align_center_unicode_heavy(self):\n Text(snippets.UNICODE_HEAVY_TEXT).align(\"center\", width=self.len_lorem_ipsum * 3)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_align_center_unicode_heavy", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_divide": { + "code": "class TextSuite:\n def time_divide(self):\n Text(snippets.LOREM_IPSUM).divide(range(20, 100, 4))\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_divide", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_divide_unicode_heavy": { + "code": "class TextSuite:\n def time_divide_unicode_heavy(self):\n Text(snippets.UNICODE_HEAVY_TEXT).divide(range(20, 100, 4))\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_divide_unicode_heavy", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_fit": { + "code": "class TextSuite:\n def time_fit(self):\n Text(snippets.LOREM_IPSUM).fit(12)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_fit", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_fit_unicode_heavy": { + "code": "class TextSuite:\n def time_fit_unicode_heavy(self):\n Text(snippets.UNICODE_HEAVY_TEXT).fit(12)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_fit_unicode_heavy", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_indent_guides": { + "code": "class TextSuite:\n def time_indent_guides(self):\n Text(snippets.PYTHON_SNIPPET).with_indent_guides()\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_indent_guides", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_render": { + "code": "class TextSuite:\n def time_render(self):\n Text(snippets.LOREM_IPSUM).render(self.console)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_render", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_render_unicode_heavy": { + "code": "class TextSuite:\n def time_render_unicode_heavy(self):\n Text(snippets.UNICODE_HEAVY_TEXT).render(self.console)\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_render_unicode_heavy", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_split": { + "code": "class TextSuite:\n def time_split(self):\n Text(snippets.LOREM_IPSUM).split()\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_split", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_split_unicode_heavy": { + "code": "class TextSuite:\n def time_split_unicode_heavy(self):\n Text(snippets.UNICODE_HEAVY_TEXT).split()\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_split_unicode_heavy", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_wrapping": { + "code": "class TextSuite:\n def time_wrapping(self):\n Text(snippets.LOREM_IPSUM).wrap(self.console, 12, overflow=\"fold\")\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_wrapping", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", + "warmup_time": -1 + }, + "benchmarks.TextSuite.time_wrapping_unicode_heavy": { + "code": "class TextSuite:\n def time_wrapping_unicode_heavy(self):\n Text(snippets.UNICODE_HEAVY_TEXT).wrap(self.console, 12, overflow=\"fold\")\n\n def setup(self):\n self.console = Console(file=StringIO(), color_system=\"truecolor\", legacy_windows=False)\n self.len_lorem_ipsum = len(snippets.LOREM_IPSUM)", + "min_run_count": 2, + "name": "benchmarks.TextSuite.time_wrapping_unicode_heavy", + "number": 0, + "param_names": [], + "params": [], + "repeat": 0, + "rounds": 2, + "sample_time": 0.01, + "timeout": 60.0, + "type": "time", + "unit": "seconds", + "version": "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", + "warmup_time": -1 + }, + "version": 2 +} diff --git a/benchmarks/results/darrenburns-2022-mbp/008854c4-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/008854c4-virtualenv-py3.10.json new file mode 100644 index 0000000000..bd61ec28d2 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/008854c4-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "008854c40772f647dfcb873bc3489e8a1c02d598", "env_name": "virtualenv-py3.10", "date": 1637075489000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7035716302047938e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928217146, 0.46624, [1.6888e-07], [1.7084e-07], [1.6954e-07], [1.7059e-07], [64507], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6999220365271978e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928217378, 0.46342, [1.6946e-07], [1.7071e-07], [1.6971e-07], [1.7025e-07], [64388], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.705959185914513e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928217609, 0.46502, [1.7011e-07], [1.7493e-07], [1.7037e-07], [1.7071e-07], [64341], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.711256779402836e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928217842, 0.45987, [1.7047e-07], [1.7261e-07], [1.7068e-07], [1.7214e-07], [62696], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7014178724238976e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928218069, 0.46676, [1.6902e-07], [1.7069e-07], [1.6927e-07], [1.7051e-07], [64572], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7013324018204837e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928218303, 0.46615, [1.6918e-07], [1.71e-07], [1.6998e-07], [1.7022e-07], [64455], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010385562491137534], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928218536, 0.44839, [0.0010342], [0.00104], [0.0010376], [0.0010389], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001431178569743809], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928218763, 0.44502, [0.0014269], [0.0014359], [0.0014294], [0.0014329], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013053151888016146], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928218985, 0.4466, [0.0013027], [0.0013118], [0.0013032], [0.0013099], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1445022795827479e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928219212, 0.46433, [1.1412e-07], [1.1496e-07], [1.142e-07], [1.1451e-07], [95867], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1444926984658398e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928219445, 0.46101, [1.1417e-07], [1.1495e-07], [1.1439e-07], [1.1459e-07], [94717], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.143986341348774e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928219676, 0.46373, [1.1417e-07], [1.1477e-07], [1.1422e-07], [1.1456e-07], [95762], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928213573, 0.066215], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928213639, 0.065625], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928213705, 0.06561], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0022121749992948026], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928219909, 0.45152, [0.0021968], [0.0022231], [0.0022017], [0.0022177], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0013260781233839225], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928220133, 0.4509, [0.0013202], [0.001333], [0.0013225], [0.0013307], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003805550711279336], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928220362, 0.45659, [0.00037934], [0.00038202], [0.00037965], [0.00038125], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003435833335970528], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928220588, 0.44641, [0.00034278], [0.00035311], [0.00034335], [0.0003441], [30], [10]], "benchmarks.TextSuite.time_divide": [[2.5334508214834553e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928220810, 0.45831, [2.522e-05], [2.5397e-05], [2.5275e-05], [2.5375e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018464978473212826], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928221039, 0.45538, [0.00018365], [0.00018535], [0.00018439], [0.00018505], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.365042651461779e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928221266, 0.44809, [4.3544e-05], [4.3812e-05], [4.3606e-05], [4.3712e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.000324408596967377], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928221494, 0.43784, [0.00032342], [0.00032574], [0.00032417], [0.00032474], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003565991375643503], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928221712, 0.44593, [0.00035519], [0.00035747], [0.00035609], [0.00035693], [29], [10]], "benchmarks.TextSuite.time_render": [[4.685463392417188e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928221933, 0.45241, [4.6655e-06], [4.7012e-06], [4.6724e-06], [4.697e-06], [2322], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.538582668856051e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928222164, 0.4562, [8.4747e-05], [8.5469e-05], [8.5327e-05], [8.5445e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.527893463767505e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928222393, 0.44906, [3.5225e-05], [3.5336e-05], [3.5256e-05], [3.5322e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002748963815975003], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928222622, 0.44825, [0.0002742], [0.0002753], [0.00027443], [0.00027514], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001095529149461072], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928222845, 0.45723, [0.0010899], [0.0010965], [0.0010916], [0.0010959], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013660130625794409], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928223077, 0.45712, [0.0013642], [0.0013703], [0.0013647], [0.0013681], [8], [10]]}, "durations": {"": 1.993987798690796}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/038e22eb-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/038e22eb-virtualenv-py3.10.json new file mode 100644 index 0000000000..3bee50c347 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/038e22eb-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "038e22eb98f43091dec8b8d0d61d64bdc81587e1", "env_name": "virtualenv-py3.10", "date": 1594138139000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.729106605775907e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928640177, 0.43136, [1.7119e-07], [1.7374e-07], [1.7273e-07], [1.7318e-07], [64462], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7035370737857387e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928640392, 0.44888, [1.6988e-07], [1.7186e-07], [1.6997e-07], [1.7048e-07], [64477], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7047515896829772e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928640616, 0.42317, [1.6924e-07], [1.7381e-07], [1.7035e-07], [1.7153e-07], [58794], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7047298404720672e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928640825, 0.44556, [1.6861e-07], [1.7187e-07], [1.6999e-07], [1.7085e-07], [63907], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.71390516393423e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928641048, 0.44882, [1.7014e-07], [1.7357e-07], [1.709e-07], [1.7308e-07], [63900], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.744885266285576e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928641273, 0.44227, [1.7217e-07], [1.7538e-07], [1.7435e-07], [1.7464e-07], [63974], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002236624999204651], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928641499, 0.43861, [0.0021997], [0.0022581], [0.0022029], [0.0022493], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928636448, 0.058911], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928636507, 0.057772], "benchmarks.StyleSuite.time_parse_ansi": [[1.1626796234512727e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928641713, 0.44141, [1.1569e-07], [1.1726e-07], [1.1604e-07], [1.1694e-07], [95978], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1625082095912241e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928641940, 0.44191, [1.1595e-07], [1.1657e-07], [1.1618e-07], [1.1635e-07], [95909], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1623847141055007e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928642166, 0.42404, [1.1596e-07], [1.1692e-07], [1.1614e-07], [1.165e-07], [87889], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928637209, 0.058057], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928637267, 0.057965], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928637325, 0.057995], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002097733397386037], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928642378, 0.43318, [0.0020881], [0.002106], [0.0020953], [0.0020996], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014561786436908214], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928642597, 0.42624, [0.0014479], [0.0014879], [0.0014535], [0.0014615], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928637809, 0.058426], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928637867, 0.059389], "benchmarks.TextSuite.time_divide": [[2.82270456867915e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928642813, 0.44399, [2.7734e-05], [2.8296e-05], [2.8159e-05], [2.8267e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018870366379971905], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928643034, 0.44717, [0.00018698], [0.00019097], [0.00018709], [0.00019079], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.2186997972062254e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928643257, 0.42928, [4.1829e-05], [4.3051e-05], [4.2103e-05], [4.226e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033193616142060845], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928643474, 0.42973, [0.00032893], [0.00033488], [0.00032933], [0.00033474], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928638805, 0.059468], "benchmarks.TextSuite.time_render": [[4.676226441955534e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928643686, 0.43895, [4.6596e-06], [4.6958e-06], [4.6666e-06], [4.6899e-06], [2334], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.542105865672056e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928643908, 0.44446, [8.4226e-05], [8.6087e-05], [8.5119e-05], [8.5493e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.3808601625834504e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928644131, 0.43505, [3.3655e-05], [3.4416e-05], [3.3714e-05], [3.3908e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028220945977089877], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928644347, 0.43169, [0.0002795], [0.00028561], [0.00028002], [0.00028487], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001159650499984208], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928644562, 0.43483, [0.0011544], [0.0011648], [0.0011576], [0.0011619], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015485863571354586], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928644777, 0.43928, [0.0015465], [0.0015546], [0.0015474], [0.0015494], [7], [10]]}, "durations": {"": 1.9543161392211914}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/03a52134-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/03a52134-virtualenv-py3.10.json new file mode 100644 index 0000000000..851cf58d0d --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/03a52134-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "03a521346841b02543fee9c24b8410ba18f5cbc2", "env_name": "virtualenv-py3.10", "date": 1592739098000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.732792605353703e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928533719, 0.43955, [1.7138e-07], [1.7406e-07], [1.7286e-07], [1.7346e-07], [64139], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6970906436346935e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928533944, 0.44915, [1.6905e-07], [1.705e-07], [1.6959e-07], [1.6989e-07], [64772], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.6982199066696146e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928534168, 0.45178, [1.6804e-07], [1.7053e-07], [1.6916e-07], [1.7004e-07], [64963], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6982711725640974e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928534392, 0.4412, [1.6924e-07], [1.7046e-07], [1.6942e-07], [1.7034e-07], [62768], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7288929496018685e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928534610, 0.44858, [1.6956e-07], [1.7443e-07], [1.7173e-07], [1.7345e-07], [64315], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.699072281307717e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928534834, 0.4454, [1.6868e-07], [1.7543e-07], [1.6949e-07], [1.7154e-07], [63640], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002187125000637025], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928535053, 0.44306, [0.00218], [0.0021985], [0.0021808], [0.0021907], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928529968, 0.058909], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928530027, 0.059107], "benchmarks.StyleSuite.time_parse_ansi": [[1.1490100967193674e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928535276, 0.43837, [1.1388e-07], [1.1596e-07], [1.1411e-07], [1.1584e-07], [96272], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1559417175171943e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928535490, 0.43868, [1.1381e-07], [1.1605e-07], [1.1413e-07], [1.1598e-07], [96547], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1592269480731486e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928535705, 0.44312, [1.1555e-07], [1.164e-07], [1.158e-07], [1.1599e-07], [96727], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928530764, 0.059019], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928530823, 0.058681], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928530881, 0.059408], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.001988930584047921], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928535920, 0.44773, [0.0019831], [0.0019934], [0.0019869], [0.0019901], [6], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014236250010851237], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928536147, 0.41848, [0.0014186], [0.001429], [0.0014217], [0.0014241], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928531371, 0.060538], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928531431, 0.060402], "benchmarks.TextSuite.time_divide": [[2.775736257808127e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928536357, 0.43079, [2.7611e-05], [2.8057e-05], [2.7665e-05], [2.7871e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001868461317427685], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928536574, 0.43723, [0.00018607], [0.00018762], [0.00018672], [0.00018697], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.197180313927806e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928536792, 0.43314, [4.1868e-05], [4.202e-05], [4.1943e-05], [4.1989e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003302661287072565], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928537007, 0.42544, [0.0003299], [0.00033073], [0.00032999], [0.00033041], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928532359, 0.057377], "benchmarks.TextSuite.time_render": [[4.669984376312342e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928537218, 0.43598, [4.6429e-06], [4.6792e-06], [4.6504e-06], [4.6743e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.605167328831043e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928537440, 0.4401, [8.4488e-05], [8.6817e-05], [8.5137e-05], [8.6702e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.381108864203035e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928537661, 0.43419, [3.3735e-05], [3.4393e-05], [3.3805e-05], [3.3857e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028198704043264826], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928537877, 0.42977, [0.00027838], [0.00028552], [0.00027877], [0.00028487], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011455208894201657], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928538090, 0.43299, [0.0011423], [0.0011705], [0.0011438], [0.0011485], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015198899283339934], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928538303, 0.4321, [0.0015137], [0.0015273], [0.0015154], [0.0015216], [7], [10]]}, "durations": {"": 1.9656128883361816}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/06922006-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/06922006-virtualenv-py3.10.json new file mode 100644 index 0000000000..fe7984ec3b --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/06922006-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "06922006f2eb141255336a22e8918771d14d5760", "env_name": "virtualenv-py3.10", "date": 1596915390000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7116855250635132e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928817115, 0.45149, [1.6996e-07], [1.7372e-07], [1.7037e-07], [1.728e-07], [64422], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7205937146409013e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928817342, 0.4284, [1.7001e-07], [1.7378e-07], [1.7089e-07], [1.7296e-07], [64408], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.718094621607509e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928817557, 0.42505, [1.6959e-07], [1.7619e-07], [1.6998e-07], [1.738e-07], [58962], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.734700151950903e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928817765, 0.42576, [1.7169e-07], [1.7401e-07], [1.7311e-07], [1.7367e-07], [58813], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7283145947130278e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928817977, 0.42386, [1.7134e-07], [1.732e-07], [1.7237e-07], [1.7304e-07], [58876], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7188267216783956e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928818188, 0.44138, [1.696e-07], [1.7479e-07], [1.6988e-07], [1.7443e-07], [64405], [10]], "benchmarks.PrettySuite.time_pretty": [[0.00176616666673605], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928818413, 0.43985, [0.0017587], [0.0017705], [0.0017615], [0.001769], [6], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928813055, 0.057998], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928813113, 0.058127], "benchmarks.StyleSuite.time_parse_ansi": [[1.1574203558648017e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928818635, 0.42493, [1.1415e-07], [1.181e-07], [1.1431e-07], [1.1774e-07], [87607], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1535711243895231e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928818845, 0.4467, [1.1389e-07], [1.1713e-07], [1.1419e-07], [1.167e-07], [94221], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1586251464308279e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928819067, 0.42387, [1.1517e-07], [1.1694e-07], [1.152e-07], [1.1659e-07], [87613], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928813824, 0.058092], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928813882, 0.057965], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928813940, 0.057861], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002284054202027619], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928819278, 0.43931, [0.0022566], [0.0023089], [0.0022619], [0.0023023], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014851547873279613], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928819500, 0.43252, [0.0014655], [0.0015028], [0.0014695], [0.0015002], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006723583326674997], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928819717, 0.42797, [0.00067161], [0.00067476], [0.00067182], [0.00067301], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000555773025936153], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928819928, 0.43679, [0.00054603], [0.00056113], [0.00055471], [0.00055918], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8365185540966004e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928820143, 0.44351, [2.8288e-05], [2.8557e-05], [2.8321e-05], [2.8437e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019076937710531383], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928820364, 0.44435, [0.00019003], [0.00019103], [0.00019072], [0.00019084], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.285541601711884e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928820586, 0.43266, [4.2737e-05], [4.3026e-05], [4.2791e-05], [4.29e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033007056411025267], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928820806, 0.42771, [0.0003297], [0.00033134], [0.00032993], [0.00033064], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928815745, 0.05813], "benchmarks.TextSuite.time_render": [[4.671494408579894e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928821019, 0.43625, [4.6631e-06], [4.6778e-06], [4.6651e-06], [4.6749e-06], [2326], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.538090562040911e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928821241, 0.43988, [8.4912e-05], [8.5618e-05], [8.5161e-05], [8.5396e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.424668306437363e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928821463, 0.44361, [3.4096e-05], [3.4381e-05], [3.423e-05], [3.4347e-05], [314], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002832049594380314], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928821683, 0.43273, [0.00028055], [0.00028555], [0.00028097], [0.00028471], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011634791654715729], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928821900, 0.44061, [0.0011491], [0.0011764], [0.0011613], [0.0011699], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015536130709473842], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928822120, 0.43993, [0.0015497], [0.0015567], [0.0015522], [0.0015542], [7], [10]]}, "durations": {"": 1.9717209339141846}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/07d51ffc-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/07d51ffc-virtualenv-py3.10.json new file mode 100644 index 0000000000..687e93f6fe --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/07d51ffc-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "07d51ffc1aee6f16bd2e5a25b4e82850fb9ed778", "env_name": "virtualenv-py3.10", "date": 1638042089000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7045601798784003e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929425854, 0.43978, [1.6946e-07], [1.7115e-07], [1.7022e-07], [1.7069e-07], [59058], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7007710882553625e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929426074, 0.46565, [1.6853e-07], [1.705e-07], [1.6958e-07], [1.702e-07], [64636], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.699667194811625e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929426307, 0.4621, [1.6879e-07], [1.778e-07], [1.6982e-07], [1.7032e-07], [64557], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6998402696141218e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929426541, 0.46553, [1.685e-07], [1.7093e-07], [1.6928e-07], [1.7021e-07], [64484], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6968556558179902e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929426774, 0.46274, [1.6922e-07], [1.7062e-07], [1.6943e-07], [1.6986e-07], [63972], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6945227762756885e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929427005, 0.46476, [1.6851e-07], [1.7005e-07], [1.69e-07], [1.6993e-07], [64498], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001105658350570593], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929427238, 0.45655, [0.0011016], [0.001111], [0.0011041], [0.0011073], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001518580355748002], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929427464, 0.45154, [0.0015111], [0.0015253], [0.0015168], [0.0015196], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013998801241541514], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929427692, 0.45335, [0.001397], [0.0014065], [0.0013997], [0.0014036], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1418527013357237e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929427918, 0.45765, [1.1367e-07], [1.148e-07], [1.1394e-07], [1.1437e-07], [96300], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1508352104765355e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929428150, 0.45967, [1.1378e-07], [1.1636e-07], [1.1381e-07], [1.1606e-07], [94443], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1420043098721425e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929428378, 0.46593, [1.1382e-07], [1.1514e-07], [1.1403e-07], [1.1426e-07], [96522], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929422271, 0.066153], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929422337, 0.065652], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929422403, 0.066], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023493167012929917], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929428612, 0.45915, [0.0023373], [0.0023583], [0.0023399], [0.0023545], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014035182484803954], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929428845, 0.44948, [0.0013943], [0.0014116], [0.0014012], [0.0014074], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037731919655925594], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929429072, 0.4531, [0.00037699], [0.00037793], [0.00037721], [0.00037747], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003419818550032834], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929429298, 0.45536, [0.00034042], [0.00035045], [0.00034131], [0.00034275], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5385004668529115e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929429524, 0.46305, [2.532e-05], [2.5476e-05], [2.5353e-05], [2.5393e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018469576752977446], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929429756, 0.45561, [0.00018439], [0.00018529], [0.00018451], [0.00018509], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.345706306261623e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929429983, 0.44723, [4.3349e-05], [4.3497e-05], [4.3425e-05], [4.347e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003234134994934059], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929430211, 0.45553, [0.00032318], [0.00032389], [0.00032337], [0.00032347], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003560984312508512], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929430437, 0.44623, [0.00035527], [0.00035724], [0.00035577], [0.0003564], [29], [10]], "benchmarks.TextSuite.time_render": [[4.676214165901498e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929430659, 0.45324, [4.6511e-06], [4.703e-06], [4.6692e-06], [4.6777e-06], [2337], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.516666533491449e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929430890, 0.45686, [8.4703e-05], [8.5451e-05], [8.5134e-05], [8.5355e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.509875646808983e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929431120, 0.44945, [3.5058e-05], [3.5178e-05], [3.5076e-05], [3.5163e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027409923648902853], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929431348, 0.44684, [0.00027297], [0.00027462], [0.00027361], [0.00027432], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013568151262006722], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929431571, 0.45476, [0.0013548], [0.001363], [0.0013551], [0.0013601], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001455651787442288], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929431803, 0.44607, [0.0014522], [0.0014585], [0.0014538], [0.0014567], [7], [10]]}, "durations": {"": 1.9834160804748535}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/0db0cbd0-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/0db0cbd0-virtualenv-py3.10.json new file mode 100644 index 0000000000..6cee1c89ea --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/0db0cbd0-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "0db0cbd00598ad3cfc625eda301307f69c89d3f9", "env_name": "virtualenv-py3.10", "date": 1595434640000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7362879180977224e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928726948, 0.44285, [1.7317e-07], [1.7401e-07], [1.733e-07], [1.7379e-07], [64022], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.734515236767467e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928727174, 0.42776, [1.7232e-07], [1.7393e-07], [1.7327e-07], [1.7366e-07], [59400], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7043707485739963e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928727386, 0.44866, [1.7e-07], [1.7099e-07], [1.701e-07], [1.7073e-07], [64394], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.719459354762018e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928727610, 0.44323, [1.6908e-07], [1.7406e-07], [1.7e-07], [1.7319e-07], [64904], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7312164058360416e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928727827, 0.443, [1.6978e-07], [1.7764e-07], [1.701e-07], [1.7323e-07], [65192], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.726727310866345e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928728044, 0.43261, [1.6918e-07], [1.7389e-07], [1.6962e-07], [1.7367e-07], [58649], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022632042033364995], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928728263, 0.44683, [0.0022263], [0.0022977], [0.0022312], [0.0022891], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928722905, 0.0583], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928722964, 0.058042], "benchmarks.StyleSuite.time_parse_ansi": [[1.1642906299976313e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928728488, 0.42206, [1.1573e-07], [1.1719e-07], [1.1615e-07], [1.1671e-07], [87070], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1636819952552777e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928728699, 0.43262, [1.1582e-07], [1.1681e-07], [1.1627e-07], [1.1666e-07], [96646], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1560313316913222e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928728916, 0.45013, [1.1452e-07], [1.1668e-07], [1.1492e-07], [1.1614e-07], [95648], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928723673, 0.058083], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928723731, 0.057826], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928723789, 0.057979], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002123166699311696], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928729142, 0.43623, [0.0020971], [0.0021399], [0.0021067], [0.0021358], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014861785727719378], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928729364, 0.43197, [0.0014753], [0.0015121], [0.0014779], [0.0014992], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006712447811878519], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928729584, 0.43655, [0.00066867], [0.00067368], [0.00066968], [0.00067302], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005566228156615245], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928729805, 0.43007, [0.00055385], [0.0005591], [0.00055608], [0.00055735], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.816003134356223e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928730022, 0.44409, [2.7814e-05], [2.8399e-05], [2.7839e-05], [2.8381e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018715350852927947], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928730243, 0.44446, [0.00018568], [0.00018992], [0.00018678], [0.00018798], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.26104741353742e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928730467, 0.44198, [4.202e-05], [4.314e-05], [4.2145e-05], [4.3041e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033586962907124435], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928730689, 0.43289, [0.00033536], [0.00033642], [0.00033566], [0.00033628], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928725585, 0.058448], "benchmarks.TextSuite.time_render": [[4.678828615718841e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928730905, 0.43858, [4.6682e-06], [4.7782e-06], [4.672e-06], [4.7475e-06], [2328], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.66399726646705e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928731129, 0.44532, [8.6226e-05], [8.7004e-05], [8.6491e-05], [8.6881e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.442041802562929e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928731355, 0.44347, [3.3952e-05], [3.5991e-05], [3.4377e-05], [3.4581e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028177590512141993], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928731577, 0.43448, [0.00027849], [0.00028625], [0.00027876], [0.00028524], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011528171663586465], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928731796, 0.43614, [0.0011305], [0.0011759], [0.0011328], [0.0011729], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015352022850752942], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928732015, 0.43922, [0.0015175], [0.001555], [0.0015207], [0.0015485], [7], [10]]}, "durations": {"": 1.9555010795593262}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/11c00224-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/11c00224-virtualenv-py3.10.json new file mode 100644 index 0000000000..96c9ee633c --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/11c00224-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "11c00224398aae3ef5fcf363641c249c1752af7d", "env_name": "virtualenv-py3.10", "date": 1593549611000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7284974776044082e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928616040, 0.44173, [1.7153e-07], [1.7402e-07], [1.7255e-07], [1.7298e-07], [64568], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7351940855857562e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928616267, 0.4269, [1.7291e-07], [1.7432e-07], [1.7326e-07], [1.7368e-07], [58763], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7025654007106745e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928616478, 0.44956, [1.6996e-07], [1.7098e-07], [1.702e-07], [1.7083e-07], [64487], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.706075797615736e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928616702, 0.44942, [1.6902e-07], [1.7125e-07], [1.7035e-07], [1.7071e-07], [64394], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7302739804627536e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928616925, 0.43385, [1.7236e-07], [1.7358e-07], [1.7264e-07], [1.7327e-07], [65041], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7105373843932488e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928617141, 0.44901, [1.6974e-07], [1.7289e-07], [1.7026e-07], [1.7251e-07], [64237], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022084375028498474], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928617366, 0.43535, [0.0021925], [0.0022162], [0.0022023], [0.0022119], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928612308, 0.058177], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928612366, 0.058029], "benchmarks.StyleSuite.time_parse_ansi": [[1.1611713504418965e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928617581, 0.44885, [1.1563e-07], [1.1724e-07], [1.1592e-07], [1.1654e-07], [95202], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1629571403233272e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928617806, 0.43068, [1.1597e-07], [1.1678e-07], [1.1611e-07], [1.1649e-07], [96497], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1554933307194386e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928618022, 0.44858, [1.1416e-07], [1.1636e-07], [1.1451e-07], [1.1631e-07], [95443], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928613089, 0.057768], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928613147, 0.057693], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928613205, 0.057767], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002041262501734309], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928618246, 0.42348, [0.0020331], [0.0020749], [0.0020382], [0.0020422], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001439104143563392], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928618460, 0.42148, [0.001432], [0.0014473], [0.0014368], [0.001443], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928613682, 0.058205], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928613740, 0.058625], "benchmarks.TextSuite.time_divide": [[2.7814408371417603e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928618672, 0.43816, [2.7728e-05], [2.7947e-05], [2.7771e-05], [2.7877e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001878881578848354], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928618891, 0.43937, [0.00018646], [0.00018863], [0.0001873], [0.0001884], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2432207685065336e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928619110, 0.43813, [4.2149e-05], [4.287e-05], [4.218e-05], [4.2672e-05], [248], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003323165320550963], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928619328, 0.4298, [0.0003309], [0.00033885], [0.00033172], [0.00033744], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928614675, 0.058317], "benchmarks.TextSuite.time_render": [[4.693972607015483e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928619543, 0.43136, [4.6757e-06], [4.7207e-06], [4.6872e-06], [4.6989e-06], [2282], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.568864438984747e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928619762, 0.44176, [8.4236e-05], [8.7142e-05], [8.447e-05], [8.6796e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.368297283844159e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928619983, 0.43646, [3.3481e-05], [3.3825e-05], [3.3502e-05], [3.3776e-05], [313], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028147971622545173], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928620200, 0.42968, [0.00027839], [0.000286], [0.00027906], [0.00028342], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011670578322890732], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928620414, 0.43745, [0.0011661], [0.0011724], [0.0011666], [0.0011687], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015473719998096514], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928620631, 0.43689, [0.0015434], [0.0015554], [0.0015454], [0.0015505], [7], [10]]}, "durations": {"": 1.95790696144104}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/11c305e1-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/11c305e1-virtualenv-py3.10.json new file mode 100644 index 0000000000..59edef9624 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/11c305e1-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "11c305e1722a81c553a41fb9358f1058231757c5", "env_name": "virtualenv-py3.10", "date": 1617124192000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7040699938447585e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928130588, 0.45796, [1.6952e-07], [1.709e-07], [1.7005e-07], [1.7061e-07], [64650], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6964852386183715e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928130815, 0.45592, [1.6857e-07], [1.7045e-07], [1.6935e-07], [1.6973e-07], [64599], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.702935102568297e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928131043, 0.4485, [1.698e-07], [1.7319e-07], [1.7008e-07], [1.7126e-07], [64427], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.697923450791509e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928131272, 0.46092, [1.6925e-07], [1.7072e-07], [1.6969e-07], [1.7011e-07], [64246], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.698945704612123e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928131501, 0.45893, [1.6897e-07], [1.7113e-07], [1.6945e-07], [1.7066e-07], [64593], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6976089933961742e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928131730, 0.44973, [1.6911e-07], [1.7176e-07], [1.6948e-07], [1.7013e-07], [65027], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010057624487672002], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928131962, 0.4368, [0.0010035], [0.0010095], [0.0010052], [0.0010074], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014041302511031972], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928132179, 0.44692, [0.0013982], [0.0014137], [0.0014015], [0.001409], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014043098763067974], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928132402, 0.44683, [0.001401], [0.0014103], [0.0014025], [0.0014058], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.140019237469983e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928132625, 0.45471, [1.1362e-07], [1.1424e-07], [1.1393e-07], [1.1404e-07], [95905], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1478145308663167e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928132852, 0.45476, [1.1368e-07], [1.1602e-07], [1.141e-07], [1.154e-07], [95849], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.141980623645123e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928133080, 0.45583, [1.1378e-07], [1.1497e-07], [1.1402e-07], [1.1452e-07], [95793], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928127090, 0.061864], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928127152, 0.06233], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928127215, 0.061847], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0020629041013307866], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928133309, 0.44416, [0.0020464], [0.0020839], [0.0020508], [0.0020708], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012537265010905685], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928133530, 0.43507, [0.0012406], [0.0012608], [0.0012466], [0.0012574], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006594336255147937], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928133746, 0.4381, [0.000657], [0.00066519], [0.00065815], [0.00066171], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005484693155219582], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928133967, 0.44419, [0.00054561], [0.00055549], [0.00054714], [0.0005526], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5705258770675706e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928134188, 0.45615, [2.5324e-05], [2.6081e-05], [2.5411e-05], [2.6e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001846641467197734], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928134417, 0.44897, [0.00018407], [0.00018533], [0.00018425], [0.00018515], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.361301223386307e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928134641, 0.43957, [4.3442e-05], [4.3824e-05], [4.3482e-05], [4.379e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003249576613832746], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928134864, 0.42981, [0.00032416], [0.00032648], [0.00032463], [0.00032545], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035477660351497086], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928135078, 0.43718, [0.00035447], [0.0003559], [0.00035458], [0.00035523], [29], [10]], "benchmarks.TextSuite.time_render": [[4.692818238968194e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928135295, 0.44495, [4.6753e-06], [4.7115e-06], [4.6831e-06], [4.7019e-06], [2319], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.551689750775255e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928135521, 0.44984, [8.5359e-05], [8.5939e-05], [8.5394e-05], [8.5681e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.5231459565976076e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928135747, 0.44418, [3.5105e-05], [3.5493e-05], [3.5142e-05], [3.5382e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027465598712949897], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928135974, 0.44849, [0.00027312], [0.00027628], [0.00027334], [0.00027584], [39], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001102583299507387], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928136199, 0.43834, [0.0010966], [0.0011175], [0.0010985], [0.0011066], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014873571427805083], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928136416, 0.43532, [0.0014852], [0.0014935], [0.0014866], [0.001488], [7], [10]]}, "durations": {"": 2.0018699169158936}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/1442dd77-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/1442dd77-virtualenv-py3.10.json new file mode 100644 index 0000000000..0cf41d2e7b --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/1442dd77-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "1442dd7759b4bc92ed4d79a6bb5fbf29b9df4f76", "env_name": "virtualenv-py3.10", "date": 1639560700000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7012068692044375e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928289810, 0.46694, [1.6882e-07], [1.7102e-07], [1.6943e-07], [1.704e-07], [64659], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7018720169784255e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928290042, 0.46369, [1.6952e-07], [1.7064e-07], [1.6998e-07], [1.7053e-07], [64532], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7047895456152823e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928290274, 0.46468, [1.6957e-07], [1.7098e-07], [1.7036e-07], [1.7077e-07], [64337], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7099208604379628e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928290505, 0.46058, [1.6949e-07], [1.7299e-07], [1.702e-07], [1.7223e-07], [63621], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7060387806580736e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928290733, 0.46622, [1.6981e-07], [1.7312e-07], [1.7011e-07], [1.7109e-07], [64465], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6985979406589e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928290964, 0.46389, [1.6888e-07], [1.7155e-07], [1.6934e-07], [1.7073e-07], [64070], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011093499502749181], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928291194, 0.45719, [0.0011042], [0.0011163], [0.0011072], [0.0011103], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015499642842249678], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928291421, 0.44629, [0.0015439], [0.0015571], [0.0015482], [0.0015526], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013974713128845906], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928291642, 0.45178, [0.0013927], [0.0014066], [0.0013949], [0.0014027], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1407390702467521e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928291868, 0.46339, [1.1372e-07], [1.1466e-07], [1.1402e-07], [1.1432e-07], [96371], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1481372948254572e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928292101, 0.45909, [1.1381e-07], [1.1592e-07], [1.1418e-07], [1.1524e-07], [94854], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1422449103232493e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928292329, 0.46237, [1.1344e-07], [1.1474e-07], [1.1406e-07], [1.1431e-07], [96055], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928286243, 0.065126], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928286308, 0.064956], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928286373, 0.064969], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002332408301299438], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928292560, 0.45581, [0.0023223], [0.0023418], [0.0023291], [0.0023332], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001395356748616905], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928292793, 0.45096, [0.0013879], [0.0014041], [0.001393], [0.0014014], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037334339717274597], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928293019, 0.46011, [0.00036916], [0.00037875], [0.00036929], [0.00037733], [29], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003428870967904767], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928293250, 0.45501, [0.00034065], [0.00035293], [0.00034105], [0.00034885], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5384536367172085e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928293476, 0.45814, [2.5186e-05], [2.5561e-05], [2.5268e-05], [2.5493e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018477334479343724], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928293705, 0.45602, [0.00018358], [0.00018527], [0.00018469], [0.0001849], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.369230763722769e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928293934, 0.4482, [4.3174e-05], [4.4067e-05], [4.3212e-05], [4.3954e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003243024196220381], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928294163, 0.43568, [0.00032299], [0.00032623], [0.00032391], [0.00032444], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035655387960261954], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928294380, 0.44502, [0.00035515], [0.00035812], [0.00035577], [0.00035678], [29], [10]], "benchmarks.TextSuite.time_render": [[4.67811063834383e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928294601, 0.45176, [4.6551e-06], [4.699e-06], [4.6662e-06], [4.6872e-06], [2332], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.541865076588851e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928294830, 0.45497, [8.4623e-05], [8.6397e-05], [8.5213e-05], [8.5595e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.503245966238601e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928295057, 0.4499, [3.4982e-05], [3.5079e-05], [3.5008e-05], [3.505e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027448794686566353], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928295286, 0.44659, [0.00027325], [0.00027609], [0.00027406], [0.00027466], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013566120014729677], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928295509, 0.45296, [0.0013557], [0.001361], [0.001356], [0.0013573], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014524136432945462], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928295738, 0.44389, [0.0014489], [0.0014573], [0.0014499], [0.0014536], [7], [10]]}, "durations": {"": 2.0702707767486572}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/15623c5a-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/15623c5a-virtualenv-py3.10.json new file mode 100644 index 0000000000..d442178aa5 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/15623c5a-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "15623c5a57bf758b18542d5293ee319bbd59e829", "env_name": "virtualenv-py3.10", "date": 1614631595000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7020787005396147e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929089823, 0.45996, [1.6941e-07], [1.7215e-07], [1.6989e-07], [1.7079e-07], [64485], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7092673771154095e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929090054, 0.45482, [1.6949e-07], [1.7234e-07], [1.7e-07], [1.7151e-07], [63614], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7118832265832778e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929090280, 0.46223, [1.7013e-07], [1.7411e-07], [1.707e-07], [1.7141e-07], [64578], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6962613380158e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929090510, 0.44887, [1.6868e-07], [1.7118e-07], [1.6912e-07], [1.7012e-07], [62624], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7009122965568404e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929090733, 0.45688, [1.6908e-07], [1.7287e-07], [1.6945e-07], [1.7046e-07], [64546], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7011294502290056e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929090961, 0.45667, [1.6904e-07], [1.7093e-07], [1.6954e-07], [1.7062e-07], [64381], [10]], "benchmarks.PrettySuite.time_pretty": [[0.000972337135780518], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929091189, 0.44401, [0.00096904], [0.00097486], [0.00097048], [0.00097325], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0013077630628686165], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929091415, 0.43937, [0.0013022], [0.001312], [0.0013064], [0.0013097], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013684609366464429], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929091639, 0.44136, [0.001358], [0.0013773], [0.0013608], [0.0013732], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1430164070272298e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929091859, 0.45508, [1.1396e-07], [1.1494e-07], [1.1412e-07], [1.1444e-07], [95443], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1491249709035666e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929092087, 0.45343, [1.1386e-07], [1.1562e-07], [1.1421e-07], [1.155e-07], [94494], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1431698443041508e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929092313, 0.45685, [1.1413e-07], [1.1913e-07], [1.1426e-07], [1.1702e-07], [95582], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929086315, 0.06262], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929086378, 0.062341], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929086440, 0.062366], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.00207476660143584], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929092540, 0.4364, [0.0020652], [0.0020805], [0.0020677], [0.0020774], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001251054749445757], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929092762, 0.43627, [0.0012469], [0.001262], [0.0012485], [0.0012552], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.000661882812892145], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929092978, 0.44035, [0.00066045], [0.00066339], [0.00066146], [0.00066277], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005466436575117864], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929093201, 0.44265, [0.00054342], [0.0005538], [0.0005444], [0.00054695], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5366444275455157e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929093420, 0.45683, [2.5271e-05], [2.5535e-05], [2.5299e-05], [2.5462e-05], [431], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018469684487329153], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929093647, 0.44995, [0.00018411], [0.00018502], [0.00018453], [0.00018493], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3361421063191706e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929093872, 0.4422, [4.3335e-05], [4.3506e-05], [4.3349e-05], [4.3425e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032445834817322475], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929094096, 0.4506, [0.00032343], [0.0003253], [0.00032419], [0.00032453], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035498203390583007], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929094320, 0.44019, [0.00035425], [0.00035599], [0.00035485], [0.00035568], [29], [10]], "benchmarks.TextSuite.time_render": [[4.687589526901436e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929094538, 0.44858, [4.6745e-06], [4.6954e-06], [4.6828e-06], [4.6901e-06], [2329], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.555615625027713e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929094766, 0.45088, [8.4769e-05], [8.5884e-05], [8.5105e-05], [8.5856e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.505739197510505e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929094992, 0.44399, [3.5007e-05], [3.5136e-05], [3.5037e-05], [3.5116e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027359703955497886], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929095218, 0.44023, [0.00027306], [0.00027515], [0.00027345], [0.000274], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010967875001369975], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929095438, 0.43781, [0.001095], [0.0011008], [0.0010958], [0.001098], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014890833595667835], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929095656, 0.4383, [0.001485], [0.0014968], [0.0014866], [0.0014923], [7], [10]]}, "durations": {"": 2.004281997680664}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/1cdcd1ae-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/1cdcd1ae-virtualenv-py3.10.json new file mode 100644 index 0000000000..39f54bf94f --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/1cdcd1ae-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "1cdcd1ae6921ada4c9d53ca476b2155f19f9399d", "env_name": "virtualenv-py3.10", "date": 1599498296000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.705568368247799e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928882805, 0.45364, [1.6962e-07], [1.7342e-07], [1.7015e-07], [1.7115e-07], [64527], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7353461403789348e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928883034, 0.42549, [1.7268e-07], [1.7396e-07], [1.7299e-07], [1.737e-07], [58560], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7316303125600367e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928883246, 0.4294, [1.7168e-07], [1.7478e-07], [1.7298e-07], [1.7352e-07], [63497], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7447719773084267e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928883461, 0.44356, [1.7288e-07], [1.7668e-07], [1.7323e-07], [1.7545e-07], [64643], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7148101237034193e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928883681, 0.42463, [1.701e-07], [1.7453e-07], [1.7052e-07], [1.7326e-07], [59012], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7355933307819902e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928883892, 0.43809, [1.7275e-07], [1.7616e-07], [1.7321e-07], [1.7415e-07], [58610], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011024979015928694], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928884116, 0.43685, [0.0010944], [0.0011099], [0.0010967], [0.0011031], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928878599, 0.057919], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014977678552635812], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928884338, 0.42821, [0.0014925], [0.0015054], [0.0014937], [0.0015007], [7], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.166435123150466e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928884555, 0.45026, [1.1584e-07], [1.1744e-07], [1.1616e-07], [1.1723e-07], [94647], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1640746952978313e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928884782, 0.43907, [1.1609e-07], [1.1776e-07], [1.1617e-07], [1.1644e-07], [96741], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1622925278202787e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928884996, 0.42174, [1.1371e-07], [1.1684e-07], [1.1418e-07], [1.1632e-07], [87578], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928879529, 0.057596], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928879586, 0.057483], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928879644, 0.057169], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.003037343623873312], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928885207, 0.45489, [0.00298], [0.003058], [0.0030059], [0.0030443], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0019962360844753375], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928885437, 0.44739, [0.0019745], [0.0020171], [0.0019819], [0.0020121], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006737250000393639], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928885666, 0.43149, [0.00067005], [0.00067538], [0.00067066], [0.00067494], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005601316056287799], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928885881, 0.43921, [0.00055301], [0.00056437], [0.00055602], [0.00056384], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.818369192184331e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928886100, 0.44158, [2.7905e-05], [2.8463e-05], [2.7962e-05], [2.842e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001909163070274844], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928886322, 0.44359, [0.00018748], [0.00019467], [0.00018879], [0.00019221], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2670565776515796e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928886546, 0.44656, [4.2139e-05], [4.4498e-05], [4.2213e-05], [4.3079e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033311961282555375], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928886772, 0.42921, [0.00032975], [0.00033847], [0.00032986], [0.00033756], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928881456, 0.057662], "benchmarks.TextSuite.time_render": [[4.760116070671883e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928886988, 0.42257, [4.742e-06], [4.7767e-06], [4.7449e-06], [4.7646e-06], [2115], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.695512392128317e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928887197, 0.41961, [8.6476e-05], [8.7212e-05], [8.6858e-05], [8.7033e-05], [117], [10]], "benchmarks.TextSuite.time_split": [[3.436987540095497e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928887408, 0.43994, [3.4216e-05], [3.4482e-05], [3.4271e-05], [3.4474e-05], [313], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028506587802218527], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928887627, 0.43164, [0.00028086], [0.00028588], [0.00028401], [0.0002853], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001164951387585865], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928887843, 0.42585, [0.0011635], [0.0011668], [0.0011642], [0.0011661], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001557139931329792], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928888059, 0.44239, [0.0015535], [0.0016329], [0.0015546], [0.0015674], [7], [10]]}, "durations": {"": 1.9608781337738037}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/1f3f7f1e-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/1f3f7f1e-virtualenv-py3.10.json new file mode 100644 index 0000000000..52ad68e547 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/1f3f7f1e-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "1f3f7f1e33f77838a2cc31bd9d241a93c871047f", "env_name": "virtualenv-py3.10", "date": 1608307479000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.703931932788809e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929161288, 0.45859, [1.6923e-07], [1.7082e-07], [1.701e-07], [1.7065e-07], [64392], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7020538441303092e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929161517, 0.45514, [1.6879e-07], [1.7066e-07], [1.6977e-07], [1.7031e-07], [64854], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7056068405892232e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929161746, 0.45807, [1.693e-07], [1.733e-07], [1.7035e-07], [1.7088e-07], [64399], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.705333182701678e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929161975, 0.45658, [1.6917e-07], [1.7199e-07], [1.7018e-07], [1.7079e-07], [64289], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7041273254645358e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929162205, 0.44858, [1.6973e-07], [1.7252e-07], [1.7013e-07], [1.7082e-07], [64818], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7027633476621383e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929162434, 0.45952, [1.6857e-07], [1.7058e-07], [1.7003e-07], [1.7033e-07], [64572], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010267562494846061], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929162664, 0.44331, [0.0010235], [0.0010305], [0.0010255], [0.0010279], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014362797852040135], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929162884, 0.43646, [0.0014286], [0.0014465], [0.0014338], [0.0014394], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014140286239125999], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929163101, 0.44445, [0.0014062], [0.0014202], [0.0014084], [0.0014154], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.142687560373927e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929163325, 0.45463, [1.137e-07], [1.1446e-07], [1.1421e-07], [1.1434e-07], [95929], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1458354459388465e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929163552, 0.4544, [1.1417e-07], [1.1476e-07], [1.1445e-07], [1.1468e-07], [95416], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1472335320262367e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929163780, 0.4554, [1.1442e-07], [1.1512e-07], [1.1458e-07], [1.15e-07], [95443], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929157775, 0.062463], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929157837, 0.061992], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929157899, 0.062211], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0032340572506655008], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929164009, 0.46805, [0.0032236], [0.0032444], [0.0032287], [0.0032357], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0021162582997931167], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929164243, 0.44337, [0.0021092], [0.0021347], [0.0021129], [0.0021201], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006617669696424855], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929164468, 0.43891, [0.00065738], [0.00066599], [0.00066033], [0.00066231], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005468464997217158], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929164690, 0.44217, [0.00054411], [0.00054843], [0.00054538], [0.00054767], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.7952577626197842e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929164908, 0.44657, [2.7909e-05], [2.7989e-05], [2.7919e-05], [2.7967e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018724159663338868], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929165131, 0.44684, [0.00018651], [0.00018754], [0.00018714], [0.00018733], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.227643285228285e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929165354, 0.43917, [4.2036e-05], [4.258e-05], [4.2188e-05], [4.2403e-05], [253], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003293743066024035], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929165578, 0.43507, [0.00032889], [0.00033153], [0.00032921], [0.00032998], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003918501729808318], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929165795, 0.43461, [0.00039051], [0.00039799], [0.00039136], [0.00039218], [26], [10]], "benchmarks.TextSuite.time_render": [[4.68115087639879e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929166011, 0.44561, [4.6684e-06], [4.6924e-06], [4.6784e-06], [4.686e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.53504219548995e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929166237, 0.44988, [8.5094e-05], [8.6095e-05], [8.5284e-05], [8.547e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.385456750383511e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929166464, 0.44438, [3.3742e-05], [3.3929e-05], [3.3823e-05], [3.3879e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027912950011070917], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929166685, 0.43738, [0.00027865], [0.00027997], [0.00027899], [0.00027929], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011472963330258303], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929166903, 0.44227, [0.0011447], [0.00115], [0.0011466], [0.001148], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001529297641744571], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929167122, 0.4453, [0.0015237], [0.0015325], [0.0015285], [0.00153], [7], [10]]}, "durations": {"": 1.9861979484558105}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/1ffbd443-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/1ffbd443-virtualenv-py3.10.json new file mode 100644 index 0000000000..e71ade3748 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/1ffbd443-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "1ffbd443774cbc4bf9ddd968aef7c03322f33cf0", "env_name": "virtualenv-py3.10", "date": 1596366683000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7070232469184862e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928804297, 0.45023, [1.6927e-07], [1.7389e-07], [1.7042e-07], [1.7213e-07], [64436], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7300031985374115e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928804522, 0.43027, [1.714e-07], [1.7366e-07], [1.7285e-07], [1.7337e-07], [59395], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7071083096988122e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928804735, 0.43349, [1.6954e-07], [1.7407e-07], [1.7012e-07], [1.727e-07], [58675], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7364779467078806e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928804955, 0.44766, [1.7322e-07], [1.7426e-07], [1.7342e-07], [1.7405e-07], [62093], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.733705418271591e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928805177, 0.4257, [1.7183e-07], [1.7385e-07], [1.7273e-07], [1.7346e-07], [58598], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.719841129250439e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928805388, 0.43326, [1.6999e-07], [1.7562e-07], [1.7034e-07], [1.7397e-07], [58475], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002223750000121072], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928805607, 0.43956, [0.0021902], [0.0022511], [0.002196], [0.0022475], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928800258, 0.058885], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928800317, 0.058889], "benchmarks.StyleSuite.time_parse_ansi": [[1.1622428057566312e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928805822, 0.4264, [1.1594e-07], [1.1743e-07], [1.1599e-07], [1.163e-07], [87716], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1646962131907206e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928806036, 0.42635, [1.1609e-07], [1.1701e-07], [1.1633e-07], [1.1665e-07], [87479], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1598065675378016e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928806250, 0.42715, [1.1553e-07], [1.1744e-07], [1.1578e-07], [1.1633e-07], [87809], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928801016, 0.058796], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928801075, 0.058582], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928801133, 0.058738], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002116570805083029], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928806463, 0.43813, [0.0020973], [0.0021369], [0.0021035], [0.0021333], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014812797848467846], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928806686, 0.43095, [0.001464], [0.0014953], [0.0014672], [0.0014931], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006757395931344945], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928806904, 0.4392, [0.00067077], [0.00068027], [0.00067389], [0.00067737], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005583234742516652], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928807126, 0.44214, [0.00055388], [0.00056027], [0.00055668], [0.00055916], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8112012962508316e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928807347, 0.44493, [2.7807e-05], [2.8319e-05], [2.7876e-05], [2.8245e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001871710438424264], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928807570, 0.43907, [0.0001869], [0.0001875], [0.00018704], [0.00018733], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.249875195091591e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928807789, 0.43056, [4.2075e-05], [4.2896e-05], [4.2099e-05], [4.2845e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003327284667951365], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928808007, 0.43129, [0.00032855], [0.00033677], [0.00032907], [0.00033652], [30], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928802930, 0.059357], "benchmarks.TextSuite.time_render": [[4.6815491127566895e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928808224, 0.44173, [4.6507e-06], [4.7003e-06], [4.6611e-06], [4.6843e-06], [2321], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.508267729473483e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928808451, 0.44288, [8.4418e-05], [8.6252e-05], [8.4738e-05], [8.5299e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.420339262214465e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928808675, 0.44164, [3.3854e-05], [3.4396e-05], [3.3906e-05], [3.439e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028196733753272404], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928808893, 0.43339, [0.00027793], [0.00028545], [0.00027845], [0.00028485], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011584282231827578], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928809107, 0.42614, [0.0011415], [0.001166], [0.0011451], [0.0011654], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015368482854682952], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928809322, 0.43864, [0.0015204], [0.0015597], [0.001523], [0.0015532], [7], [10]]}, "durations": {"": 1.9934520721435547}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/20024635-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/20024635-virtualenv-py3.10.json new file mode 100644 index 0000000000..02281c3845 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/20024635-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "20024635c06c22879fd2fd1e380ec4cccd9935dd", "env_name": "virtualenv-py3.10", "date": 1623261093000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6983895555897055e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928361639, 0.4602, [1.6891e-07], [1.7034e-07], [1.6976e-07], [1.7013e-07], [64504], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.704207071253254e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928361868, 0.46025, [1.6849e-07], [1.7102e-07], [1.7016e-07], [1.7067e-07], [64697], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7004455784028058e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928362099, 0.44868, [1.6891e-07], [1.7033e-07], [1.6992e-07], [1.7016e-07], [64747], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7039779182067198e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928362329, 0.45904, [1.6909e-07], [1.7133e-07], [1.6983e-07], [1.7088e-07], [64212], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.704956315614673e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928362559, 0.45894, [1.6841e-07], [1.7769e-07], [1.7033e-07], [1.7064e-07], [64209], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7057127042677694e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928362788, 0.45534, [1.6969e-07], [1.7121e-07], [1.7033e-07], [1.7086e-07], [64171], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001026414601074066], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928363015, 0.4439, [0.0010212], [0.0010344], [0.0010224], [0.0010313], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014226536241039867], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928363236, 0.45289, [0.001416], [0.0014322], [0.0014201], [0.0014266], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0012958463121321984], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928363461, 0.44525, [0.0012861], [0.0013043], [0.0012892], [0.0012972], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1416102132025705e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928363682, 0.45572, [1.1396e-07], [1.1461e-07], [1.1407e-07], [1.1428e-07], [95950], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1438691305359791e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928363911, 0.45515, [1.1394e-07], [1.1478e-07], [1.1431e-07], [1.1448e-07], [95409], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1421868408540876e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928364138, 0.45615, [1.1368e-07], [1.1473e-07], [1.1415e-07], [1.1444e-07], [95926], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928358128, 0.0632], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928358191, 0.06204], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928358253, 0.062618], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021179875038797036], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928364367, 0.44252, [0.0021073], [0.0021326], [0.0021126], [0.0021242], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012675312500505242], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928364592, 0.4402, [0.0012598], [0.0012735], [0.0012634], [0.00127], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00038149383369643513], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928364811, 0.43836, [0.00037481], [0.00038766], [0.00037498], [0.0003866], [27], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003425159666221589], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928365026, 0.43853, [0.00033946], [0.00035509], [0.00034024], [0.00034495], [30], [10]], "benchmarks.TextSuite.time_divide": [[2.5188469742208198e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928365243, 0.45383, [2.5161e-05], [2.5492e-05], [2.5179e-05], [2.5216e-05], [430], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018495043959460575], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928365469, 0.4499, [0.0001844], [0.00018531], [0.00018473], [0.00018512], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.35189776540157e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928365694, 0.44177, [4.3385e-05], [4.359e-05], [4.3404e-05], [4.3577e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032581788705541724], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928365918, 0.43243, [0.00032477], [0.00032738], [0.00032515], [0.00032629], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035922413848436856], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928366133, 0.44181, [0.00035637], [0.00036654], [0.00035686], [0.00036481], [29], [10]], "benchmarks.TextSuite.time_render": [[4.677533350949419e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928366353, 0.44778, [4.6705e-06], [4.6884e-06], [4.6737e-06], [4.6824e-06], [2339], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.51222304163457e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928366580, 0.45115, [8.4491e-05], [8.5746e-05], [8.5059e-05], [8.5231e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.502959869447855e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928366808, 0.44294, [3.4942e-05], [3.5255e-05], [3.5001e-05], [3.5052e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002733470391831361], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928367034, 0.43979, [0.00027254], [0.00027459], [0.00027286], [0.00027349], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001097435450355988], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928367253, 0.44983, [0.0010958], [0.0010994], [0.0010966], [0.0010985], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013606223747046897], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928367482, 0.45025, [0.0013589], [0.0013655], [0.0013605], [0.0013627], [8], [10]]}, "durations": {"": 1.986271858215332}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/2356d7c0-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/2356d7c0-virtualenv-py3.10.json new file mode 100644 index 0000000000..9a3ad96312 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/2356d7c0-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "2356d7c0955dd6914367e0f88bfb87be040e35fa", "env_name": "virtualenv-py3.10", "date": 1592909192000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7172214412771086e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928545725, 0.43274, [1.6935e-07], [1.7379e-07], [1.704e-07], [1.7334e-07], [58946], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7024145879964128e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928545943, 0.42825, [1.6918e-07], [1.7135e-07], [1.6974e-07], [1.7074e-07], [58803], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.738391308822791e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928546161, 0.43086, [1.7044e-07], [1.7602e-07], [1.7326e-07], [1.7435e-07], [64596], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.726379042416303e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928546376, 0.44901, [1.6989e-07], [1.7437e-07], [1.716e-07], [1.7386e-07], [63914], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.737988252257405e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928546598, 0.42968, [1.7313e-07], [1.7495e-07], [1.7361e-07], [1.7407e-07], [64777], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7115044150572637e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928546813, 0.42082, [1.6817e-07], [1.7384e-07], [1.7022e-07], [1.728e-07], [59116], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002197445899946615], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928547021, 0.44392, [0.0021812], [0.0022285], [0.0021855], [0.0022212], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928541994, 0.057646], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928542052, 0.057424], "benchmarks.StyleSuite.time_parse_ansi": [[1.1589347573900871e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928547244, 0.44922, [1.1451e-07], [1.1722e-07], [1.148e-07], [1.1672e-07], [95950], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1386454792402313e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928547468, 0.44547, [1.1358e-07], [1.1452e-07], [1.1385e-07], [1.1392e-07], [96082], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1621056620828583e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928547691, 0.43928, [1.1607e-07], [1.1662e-07], [1.1616e-07], [1.164e-07], [96041], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928542772, 0.057653], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928542829, 0.057312], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928542887, 0.057049], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0019805486663244665], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928547917, 0.44474, [0.001968], [0.0019936], [0.0019755], [0.0019863], [6], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001404687500325963], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928548143, 0.43541, [0.0013993], [0.0014117], [0.0014029], [0.001408], [8], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928543380, 0.057372], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928543438, 0.057477], "benchmarks.TextSuite.time_divide": [[2.780205584524272e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928548361, 0.43971, [2.7652e-05], [2.8388e-05], [2.7697e-05], [2.8229e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.000186847956093404], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928548582, 0.43701, [0.00018646], [0.00018755], [0.00018678], [0.00018702], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.216500794963978e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928548800, 0.43693, [4.1971e-05], [4.2243e-05], [4.2062e-05], [4.2187e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003306572583706809], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928549017, 0.42558, [0.00032946], [0.00033177], [0.00033044], [0.0003311], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928544369, 0.057703], "benchmarks.TextSuite.time_render": [[4.688928231420179e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928549228, 0.43696, [4.6756e-06], [4.7089e-06], [4.6816e-06], [4.6987e-06], [2334], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.531250004605281e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928549451, 0.43848, [8.5169e-05], [8.6011e-05], [8.5279e-05], [8.5664e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.3767818296597695e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928549671, 0.43425, [3.3675e-05], [3.3832e-05], [3.3718e-05], [3.382e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027953097329323957], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928549888, 0.42811, [0.00027918], [0.00028037], [0.00027948], [0.00027966], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011421134469047603], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928550100, 0.42984, [0.0011367], [0.0011504], [0.0011396], [0.0011437], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015162232157308608], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928550313, 0.43229, [0.0015144], [0.0015341], [0.0015157], [0.001517], [7], [10]]}, "durations": {"": 1.9319932460784912}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/23aa7177-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/23aa7177-virtualenv-py3.10.json new file mode 100644 index 0000000000..c11d51d9b9 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/23aa7177-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "23aa71774457c34fe6d1fb527c1c2972447bb18d", "env_name": "virtualenv-py3.10", "date": 1631958005000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.701985654024702e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928159302, 0.4671, [1.6842e-07], [1.712e-07], [1.6995e-07], [1.7066e-07], [64407], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.700927061877873e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928159535, 0.44988, [1.6876e-07], [1.714e-07], [1.6976e-07], [1.7053e-07], [59915], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7008786937183728e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928159755, 0.46266, [1.6916e-07], [1.7047e-07], [1.6997e-07], [1.7036e-07], [64926], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6984966367614413e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928159990, 0.46452, [1.6852e-07], [1.7102e-07], [1.6891e-07], [1.708e-07], [63737], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7007556384466194e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928160220, 0.46569, [1.694e-07], [1.7047e-07], [1.697e-07], [1.7016e-07], [64482], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6967653616837615e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928160453, 0.46526, [1.6845e-07], [1.7051e-07], [1.6903e-07], [1.7012e-07], [64593], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010313042002962902], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928160685, 0.45231, [0.0010284], [0.0010343], [0.0010302], [0.0010332], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014234218742785743], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928160910, 0.46302, [0.0014168], [0.001428], [0.0014204], [0.0014267], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013043802518950542], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928161139, 0.44408, [0.0012976], [0.001312], [0.0013037], [0.0013068], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1419466898642949e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928161364, 0.46284, [1.1379e-07], [1.1439e-07], [1.1398e-07], [1.1426e-07], [96135], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1570047643736177e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928161596, 0.45974, [1.1386e-07], [1.1813e-07], [1.1414e-07], [1.1797e-07], [94046], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1511616484557213e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928161824, 0.45137, [1.1395e-07], [1.1677e-07], [1.1433e-07], [1.1577e-07], [95343], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928155690, 0.065973], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928155756, 0.065964], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928155822, 0.065478], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002142874998389743], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928162054, 0.45246, [0.0021291], [0.0021522], [0.0021359], [0.0021474], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001284763000512612], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928162284, 0.45148, [0.0012776], [0.0012882], [0.0012823], [0.0012867], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.000388515425988266], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928162509, 0.45179, [0.00038132], [0.00039835], [0.00038174], [0.00039444], [27], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034324798381872357], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928162730, 0.46002, [0.00034208], [0.00035228], [0.00034295], [0.00034498], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.551548943087897e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928162957, 0.45927, [2.5412e-05], [2.5748e-05], [2.5439e-05], [2.5582e-05], [425], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001842945345962452], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928163185, 0.45559, [0.00018309], [0.00018565], [0.00018421], [0.00018438], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3634989763587166e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928163413, 0.45976, [4.3491e-05], [4.4748e-05], [4.3511e-05], [4.3965e-05], [244], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032473043944319767], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928163639, 0.4596, [0.00032412], [0.00032582], [0.00032458], [0.00032513], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035670975821317527], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928163867, 0.44716, [0.00035629], [0.00035897], [0.00035639], [0.0003575], [29], [10]], "benchmarks.TextSuite.time_render": [[4.672523315758419e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928164089, 0.45405, [4.64e-06], [4.71e-06], [4.6474e-06], [4.6882e-06], [2337], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.51968503612145e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928164320, 0.45703, [8.4962e-05], [8.6485e-05], [8.5027e-05], [8.5571e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.520806314737135e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928164551, 0.45159, [3.5128e-05], [3.5338e-05], [3.5138e-05], [3.5257e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002744111713438638], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928164781, 0.44788, [0.00027397], [0.00027512], [0.00027427], [0.00027452], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010960895990137943], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928165004, 0.45624, [0.0010955], [0.0010971], [0.0010957], [0.0010967], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013692552511201939], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928165236, 0.44815, [0.001366], [0.0013744], [0.0013667], [0.0013711], [8], [10]]}, "durations": {"": 2.0172619819641113}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/24743154-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/24743154-virtualenv-py3.10.json new file mode 100644 index 0000000000..f29a22272e --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/24743154-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "247431544d407d2496e200124e7b5ed2d9e657c9", "env_name": "virtualenv-py3.10", "date": 1611780945000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7008703561831484e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929003904, 0.45382, [1.6986e-07], [1.7063e-07], [1.6992e-07], [1.7057e-07], [64491], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7049544227687766e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929004132, 0.45966, [1.6965e-07], [1.7075e-07], [1.703e-07], [1.7062e-07], [64506], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7012695347008837e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929004361, 0.45427, [1.6873e-07], [1.7129e-07], [1.6996e-07], [1.7046e-07], [64819], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.708717196791671e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929004589, 0.44605, [1.6974e-07], [1.7257e-07], [1.7016e-07], [1.7127e-07], [64476], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6966659951187515e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929004816, 0.45992, [1.6847e-07], [1.72e-07], [1.6909e-07], [1.7098e-07], [64550], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.700043844028154e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929005045, 0.45473, [1.6857e-07], [1.7114e-07], [1.6965e-07], [1.7032e-07], [64203], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001021081249928102], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929005271, 0.43977, [0.0010183], [0.0010248], [0.0010199], [0.0010222], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014228880008886335], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929005489, 0.45551, [0.001415], [0.0014303], [0.00142], [0.0014256], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014151146224321565], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929005713, 0.4464, [0.0014133], [0.0014272], [0.0014145], [0.0014198], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1455905289378434e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929005936, 0.44699, [1.1336e-07], [1.1617e-07], [1.1366e-07], [1.1558e-07], [96515], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1491036369022255e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929006155, 0.45532, [1.1369e-07], [1.1656e-07], [1.1388e-07], [1.1645e-07], [95748], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.141347646635857e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929006382, 0.45248, [1.1369e-07], [1.1558e-07], [1.1398e-07], [1.1503e-07], [94769], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929000400, 0.061733], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929000462, 0.061401], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929000523, 0.061811], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0032452187479066197], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929006608, 0.46886, [0.0032324], [0.0032601], [0.0032372], [0.0032513], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.002134970802580938], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929006843, 0.44562, [0.0021204], [0.0021425], [0.0021308], [0.0021366], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006581823117812746], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929007069, 0.4368, [0.00065555], [0.00066051], [0.00065691], [0.00065886], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005536798156467022], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929007289, 0.44581, [0.00054653], [0.00055847], [0.00054789], [0.00055641], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.534571677008926e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929007510, 0.45217, [2.5296e-05], [2.5496e-05], [2.5333e-05], [2.5365e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018455746562565388], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929007736, 0.44544, [0.00018318], [0.00018497], [0.00018386], [0.00018477], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.350025409348006e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929007958, 0.43794, [4.3415e-05], [4.3549e-05], [4.3455e-05], [4.3512e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032408198392424247], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929008181, 0.42887, [0.00032362], [0.00032488], [0.0003238], [0.00032443], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00038927161141246976], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929008394, 0.44484, [0.00038809], [0.00039124], [0.00038819], [0.00038973], [27], [10]], "benchmarks.TextSuite.time_render": [[4.6586813701803316e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929008614, 0.44512, [4.6428e-06], [4.6894e-06], [4.6487e-06], [4.6795e-06], [2335], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.538541783309483e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929008840, 0.45026, [8.5034e-05], [8.6396e-05], [8.5351e-05], [8.5516e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.531782784819847e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929009066, 0.43937, [3.5158e-05], [3.5463e-05], [3.5186e-05], [3.5354e-05], [305], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027466118435289617], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929009290, 0.43885, [0.00027379], [0.00027655], [0.00027429], [0.00027582], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010957208505715244], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929009508, 0.44719, [0.0010937], [0.0011008], [0.0010943], [0.001096], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014872380706947297], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929009736, 0.43456, [0.0014853], [0.0014999], [0.0014865], [0.0014881], [7], [10]]}, "durations": {"": 2.0492501258850098}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/25a1bf06-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/25a1bf06-virtualenv-py3.10.json new file mode 100644 index 0000000000..3b893f3f9c --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/25a1bf06-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "25a1bf06b4854bd8d9239f8ba05678d2c60a62ad", "env_name": "virtualenv-py3.10", "date": 1600443006000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.713373427108319e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928922409, 0.45057, [1.6964e-07], [1.7398e-07], [1.6995e-07], [1.7349e-07], [64516], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.731565974745811e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928922632, 0.42239, [1.713e-07], [1.7423e-07], [1.7254e-07], [1.7393e-07], [58976], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7319214308453452e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928922841, 0.42272, [1.7002e-07], [1.7419e-07], [1.7178e-07], [1.7414e-07], [58891], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7324510468834383e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928923050, 0.42368, [1.7066e-07], [1.7417e-07], [1.7293e-07], [1.7346e-07], [58781], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7460887599500727e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928923261, 0.43196, [1.7426e-07], [1.7665e-07], [1.7448e-07], [1.751e-07], [64004], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7487969483566893e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928923477, 0.42955, [1.7192e-07], [1.7903e-07], [1.7338e-07], [1.772e-07], [58705], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0009256363634697416], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928923692, 0.43041, [0.00091569], [0.00093458], [0.00091827], [0.00093142], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928918202, 0.058446], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013186432497604983], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928923906, 0.43252, [0.0013099], [0.0013369], [0.001311], [0.0013263], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1536565645431084e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928924127, 0.4396, [1.1405e-07], [1.1746e-07], [1.1436e-07], [1.1675e-07], [96108], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1549200145366552e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928924344, 0.45093, [1.1384e-07], [1.1751e-07], [1.1436e-07], [1.1687e-07], [96329], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.167907086471211e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928924571, 0.44149, [1.1626e-07], [1.1865e-07], [1.1648e-07], [1.178e-07], [95735], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928919133, 0.057779], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928919191, 0.057361], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928919249, 0.05739], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0028535103738249745], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928924798, 0.43737, [0.0028459], [0.002874], [0.0028495], [0.0028594], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0019382950849831104], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928925022, 0.44618, [0.0019205], [0.0019506], [0.0019249], [0.0019468], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006695468737234478], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928925246, 0.43509, [0.00065798], [0.00068291], [0.00065947], [0.00067481], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005540252107158793], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928925469, 0.43607, [0.00054347], [0.0005588], [0.00055331], [0.00055579], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.7922080077164932e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928925686, 0.43674, [2.785e-05], [2.8031e-05], [2.7888e-05], [2.7961e-05], [381], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018699245691973846], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928925903, 0.44197, [0.00018631], [0.00018771], [0.0001869], [0.00018725], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.218484458710212e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928926124, 0.43724, [4.1894e-05], [4.2331e-05], [4.2032e-05], [4.2276e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032975337085043707], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928926341, 0.42487, [0.00032823], [0.00033068], [0.00032916], [0.00033016], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928921051, 0.057825], "benchmarks.TextSuite.time_render": [[4.6940412815479986e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928926552, 0.43581, [4.6873e-06], [4.7056e-06], [4.6931e-06], [4.7027e-06], [2325], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.528303908406087e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928926773, 0.44216, [8.4729e-05], [8.5632e-05], [8.523e-05], [8.5473e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.376495834135522e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928926995, 0.43503, [3.3666e-05], [3.3931e-05], [3.3686e-05], [3.3844e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027902985134829034], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928927212, 0.42695, [0.00027802], [0.00028028], [0.00027873], [0.00027947], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011423819459095183], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928927424, 0.43006, [0.0011399], [0.0011436], [0.001141], [0.0011432], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001528839285518708], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928927638, 0.43441, [0.0015231], [0.0015328], [0.0015254], [0.001532], [7], [10]]}, "durations": {"": 1.9668350219726562}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/2ba277ac-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/2ba277ac-virtualenv-py3.10.json new file mode 100644 index 0000000000..79e8bd3c80 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/2ba277ac-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "2ba277ac54a153d3030b496698133ec2e4f67e1d", "env_name": "virtualenv-py3.10", "date": 1641143137000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7095384073963524e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928304445, 0.45942, [1.6973e-07], [1.716e-07], [1.6998e-07], [1.7151e-07], [64451], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7035758232162449e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928304671, 0.4679, [1.6949e-07], [1.7154e-07], [1.6994e-07], [1.7062e-07], [64539], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7102073580626215e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928304904, 0.46608, [1.7036e-07], [1.7739e-07], [1.707e-07], [1.7123e-07], [64212], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.701027185648243e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928305137, 0.46472, [1.6899e-07], [1.7052e-07], [1.6964e-07], [1.7037e-07], [64706], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6981393392397904e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928305369, 0.4597, [1.6839e-07], [1.7066e-07], [1.696e-07], [1.703e-07], [64805], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7074461525374004e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928305603, 0.46676, [1.6992e-07], [1.7421e-07], [1.7034e-07], [1.7181e-07], [64769], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011084645986557007], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928305836, 0.46381, [0.0011041], [0.0011125], [0.0011068], [0.0011107], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015478839299508504], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928306060, 0.44666, [0.0015436], [0.0015532], [0.0015465], [0.0015501], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014028490004420746], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928306282, 0.45405, [0.0013971], [0.0014514], [0.0013996], [0.0014073], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1452256623089701e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928306507, 0.4362, [1.1404e-07], [1.1512e-07], [1.1434e-07], [1.1484e-07], [87764], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1442488653038437e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928306725, 0.46277, [1.1416e-07], [1.1488e-07], [1.1434e-07], [1.1463e-07], [96181], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1429263201953186e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928306957, 0.4655, [1.1401e-07], [1.1442e-07], [1.142e-07], [1.1437e-07], [96283], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928300849, 0.066968], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928300916, 0.066977], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928300983, 0.066742], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023390999995172024], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928307191, 0.45974, [0.0023284], [0.0023587], [0.0023345], [0.0023427], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014037630626262398], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928307423, 0.45539, [0.0013942], [0.0014119], [0.0014019], [0.0014091], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00038056559289408916], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928307650, 0.45847, [0.00036921], [0.00039423], [0.00036934], [0.0003918], [27], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003410354164467814], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928307877, 0.4501, [0.00033945], [0.0003525], [0.00034076], [0.00034817], [30], [10]], "benchmarks.TextSuite.time_divide": [[2.5224709290426314e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928308099, 0.46106, [2.5162e-05], [2.5358e-05], [2.5187e-05], [2.5256e-05], [430], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001850456204104783], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928308328, 0.45626, [0.00018381], [0.00018582], [0.00018491], [0.0001853], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3433180885253156e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928308556, 0.44726, [4.3321e-05], [4.3623e-05], [4.3339e-05], [4.3488e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032567069302463244], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928308783, 0.43785, [0.00032291], [0.00032701], [0.00032431], [0.00032633], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003585962584675772], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928309000, 0.44776, [0.00035775], [0.00035906], [0.00035811], [0.00035883], [29], [10]], "benchmarks.TextSuite.time_render": [[4.683463913286537e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928309223, 0.45369, [4.6663e-06], [4.7312e-06], [4.6794e-06], [4.6908e-06], [2328], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.532407937020744e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928309453, 0.45564, [8.4567e-05], [8.5448e-05], [8.5256e-05], [8.5411e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.522766833543607e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928309682, 0.44867, [3.5003e-05], [3.5378e-05], [3.5066e-05], [3.5363e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002741403556061222], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928309910, 0.44752, [0.0002734], [0.00027501], [0.00027404], [0.00027469], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001365880249068141], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928310133, 0.45725, [0.0013571], [0.0013699], [0.0013608], [0.0013676], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014567262156301047], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928310365, 0.4485, [0.0014469], [0.0015402], [0.0014546], [0.0014577], [7], [10]]}, "durations": {"": 2.0873799324035645}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/2d3ec69f-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/2d3ec69f-virtualenv-py3.10.json new file mode 100644 index 0000000000..9105066695 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/2d3ec69f-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "2d3ec69f6815da1d42da0f61d520c5ad630a5e26", "env_name": "virtualenv-py3.10", "date": 1610401267000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7020154316555255e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929246840, 0.45806, [1.686e-07], [1.7116e-07], [1.6939e-07], [1.7045e-07], [64341], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7010698368490514e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929247068, 0.45703, [1.6937e-07], [1.7054e-07], [1.6965e-07], [1.702e-07], [64650], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7018397440941086e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929247297, 0.45007, [1.6973e-07], [1.7083e-07], [1.6996e-07], [1.7075e-07], [65077], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6952412545509723e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929247528, 0.45953, [1.6861e-07], [1.7039e-07], [1.6925e-07], [1.6998e-07], [64641], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7000315751200035e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929247756, 0.45595, [1.6886e-07], [1.705e-07], [1.6941e-07], [1.7024e-07], [64133], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7001020117685218e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929247984, 0.45666, [1.6924e-07], [1.7053e-07], [1.6934e-07], [1.7036e-07], [64403], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010225667007034644], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929248213, 0.44249, [0.0010197], [0.0010249], [0.0010216], [0.0010243], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014374107143209714], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929248433, 0.43714, [0.0014279], [0.0014471], [0.001432], [0.001441], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014142213130980963], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929248650, 0.44698, [0.0014102], [0.0014189], [0.0014129], [0.0014165], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1420955611779321e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929248875, 0.45308, [1.1374e-07], [1.1457e-07], [1.1407e-07], [1.1433e-07], [95478], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1422061073712316e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929249102, 0.45453, [1.1389e-07], [1.145e-07], [1.1416e-07], [1.1426e-07], [95630], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.142089005886854e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929249329, 0.45161, [1.139e-07], [1.1449e-07], [1.1409e-07], [1.1431e-07], [94837], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929243316, 0.062548], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929243378, 0.062248], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929243441, 0.062201], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0032432865009468514], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929249555, 0.46953, [0.0032245], [0.003261], [0.0032269], [0.0032553], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.002120987500529736], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929249791, 0.44438, [0.0021122], [0.002129], [0.0021167], [0.0021242], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006613528748857789], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929250017, 0.4392, [0.00065834], [0.00066442], [0.0006593], [0.00066291], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005475986843904186], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929250239, 0.4425, [0.00054456], [0.00054976], [0.00054561], [0.00054816], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8080769637185125e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929250458, 0.44929, [2.7767e-05], [2.8495e-05], [2.7784e-05], [2.8423e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001876626402168257], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929250683, 0.44812, [0.00018594], [0.00018832], [0.0001873], [0.00018805], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2187584314895535e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929250907, 0.44582, [4.1989e-05], [4.2417e-05], [4.2047e-05], [4.23e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033042943593294873], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929251128, 0.4364, [0.00032916], [0.0003317], [0.0003298], [0.00033075], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003925833270141783], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929251345, 0.43535, [0.00039183], [0.00039369], [0.00039218], [0.00039299], [26], [10]], "benchmarks.TextSuite.time_render": [[4.705824050982473e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929251561, 0.44794, [4.6792e-06], [4.7374e-06], [4.6849e-06], [4.7321e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.53061523002907e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929251790, 0.45067, [8.4659e-05], [8.6293e-05], [8.4934e-05], [8.5773e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.392226213414499e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929252016, 0.44364, [3.3851e-05], [3.4116e-05], [3.3892e-05], [3.3969e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002802877299128906], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929252237, 0.43867, [0.00027878], [0.00028245], [0.0002793], [0.00028114], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011491758891174363], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929252456, 0.44246, [0.0011417], [0.0011581], [0.0011438], [0.0011544], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015291071426223166], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929252676, 0.44488, [0.0015262], [0.0015395], [0.0015274], [0.0015302], [7], [10]]}, "durations": {"": 1.975649118423462}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/2ea7e586-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/2ea7e586-virtualenv-py3.10.json new file mode 100644 index 0000000000..0977c78410 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/2ea7e586-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "2ea7e586792a95e33cddc74f9e89e62bcd8d7f2b", "env_name": "virtualenv-py3.10", "date": 1626114020000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6992604301908157e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928404724, 0.46338, [1.6876e-07], [1.7045e-07], [1.6968e-07], [1.7023e-07], [64666], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7087160984114965e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928404956, 0.46229, [1.6992e-07], [1.7164e-07], [1.7049e-07], [1.7142e-07], [64012], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7058781411970064e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928405187, 0.46302, [1.6989e-07], [1.7259e-07], [1.702e-07], [1.7091e-07], [64352], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7051793879919311e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928405418, 0.4585, [1.6946e-07], [1.7234e-07], [1.7009e-07], [1.7145e-07], [63967], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7046113228587482e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928405648, 0.45762, [1.6938e-07], [1.7079e-07], [1.7004e-07], [1.7059e-07], [64694], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.698433621679389e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928405879, 0.43528, [1.6925e-07], [1.7095e-07], [1.6977e-07], [1.7024e-07], [59063], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010297646003891714], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928406097, 0.44974, [0.0010247], [0.0010369], [0.001028], [0.0010308], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014206379983079387], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928406321, 0.45964, [0.001417], [0.0014292], [0.0014183], [0.0014251], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.001297976499699871], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928406549, 0.44173, [0.0012917], [0.0013113], [0.0012955], [0.0013002], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1393691468643312e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928406774, 0.46327, [1.1339e-07], [1.1443e-07], [1.1368e-07], [1.1434e-07], [96639], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1676212033822138e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928407007, 0.44502, [1.1631e-07], [1.1874e-07], [1.1645e-07], [1.1738e-07], [96202], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.144058273758263e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928407231, 0.46264, [1.1393e-07], [1.1482e-07], [1.1411e-07], [1.1469e-07], [96185], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928401167, 0.064996], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928401233, 0.064551], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928401297, 0.064766], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021443749981699513], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928407463, 0.44019, [0.0021257], [0.0021643], [0.0021374], [0.0021594], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012842708129028324], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928407682, 0.44883, [0.0012784], [0.0012934], [0.0012821], [0.0012886], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003746949467832954], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928407905, 0.44912, [0.00037092], [0.00037832], [0.00037127], [0.00037777], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003414603997953236], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928408130, 0.44134, [0.00033918], [0.00035221], [0.0003399], [0.00034375], [30], [10]], "benchmarks.TextSuite.time_divide": [[2.5290634440816062e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928408349, 0.45374, [2.525e-05], [2.5412e-05], [2.526e-05], [2.5297e-05], [424], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001846790253046616], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928408575, 0.45826, [0.00018393], [0.00018523], [0.00018454], [0.00018474], [59], [10]], "benchmarks.TextSuite.time_fit": [[4.405238912596706e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928408804, 0.44005, [4.3606e-05], [4.4535e-05], [4.3676e-05], [4.4411e-05], [239], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032573862082437813], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928409026, 0.45582, [0.00032479], [0.00032729], [0.00032515], [0.0003268], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003578182588861292], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928409253, 0.44518, [0.00035696], [0.0003585], [0.00035747], [0.00035794], [29], [10]], "benchmarks.TextSuite.time_render": [[4.691665023142689e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928409474, 0.45398, [4.6564e-06], [4.9104e-06], [4.6601e-06], [4.7267e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.454524993339874e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928409707, 0.45583, [8.4227e-05], [8.5332e-05], [8.4292e-05], [8.4842e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.572889446249147e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928409937, 0.44255, [3.5001e-05], [3.6547e-05], [3.5043e-05], [3.6402e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027405482902203833], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928410161, 0.44388, [0.00027204], [0.00027484], [0.00027325], [0.00027431], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010965833513182587], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928410382, 0.44508, [0.0010955], [0.001102], [0.0010957], [0.0010987], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013657838117069332], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928410603, 0.45444, [0.0013598], [0.0013712], [0.0013613], [0.0013689], [8], [10]]}, "durations": {"": 1.9997620582580566}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/3473658d-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/3473658d-virtualenv-py3.10.json new file mode 100644 index 0000000000..0c9ca94013 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/3473658d-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "3473658d13a4e88e1e58a7be116ae6975ca13cf6", "env_name": "virtualenv-py3.10", "date": 1611416490000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7036045765212364e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929289967, 0.45927, [1.6981e-07], [1.7067e-07], [1.6996e-07], [1.7052e-07], [64314], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7132086517078875e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929290195, 0.45475, [1.694e-07], [1.7853e-07], [1.7048e-07], [1.7257e-07], [64270], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.704700660188381e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929290421, 0.45937, [1.6939e-07], [1.7227e-07], [1.6998e-07], [1.7167e-07], [64575], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7441856731663292e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929290654, 0.46206, [1.7006e-07], [1.8044e-07], [1.7057e-07], [1.7638e-07], [64538], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7049117885360997e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929290887, 0.461, [1.6932e-07], [1.7202e-07], [1.6979e-07], [1.7077e-07], [64676], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.705279587625648e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929291119, 0.47769, [1.6914e-07], [1.7182e-07], [1.6977e-07], [1.7125e-07], [64238], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010213937508524395], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929291366, 0.44248, [0.0010185], [0.0010252], [0.0010205], [0.0010227], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014214713119145017], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929291587, 0.45646, [0.0014163], [0.0014333], [0.0014182], [0.0014271], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014177551875036443], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929291812, 0.45349, [0.0014112], [0.0014295], [0.0014152], [0.001424], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1434615778797786e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929292036, 0.45404, [1.1381e-07], [1.1566e-07], [1.1409e-07], [1.1477e-07], [95351], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1487062976460817e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929292263, 0.45359, [1.146e-07], [1.1632e-07], [1.147e-07], [1.1534e-07], [94017], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1449183907183087e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929292488, 0.45677, [1.1407e-07], [1.1555e-07], [1.1433e-07], [1.15e-07], [95519], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929286392, 0.062805], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929286455, 0.06227], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929286517, 0.062011], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0032570260009379126], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929292717, 0.47559, [0.0032274], [0.0032784], [0.0032405], [0.0032633], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0021434916998259723], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929292954, 0.45432, [0.0021262], [0.0023682], [0.0021294], [0.0022289], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006590039056391106], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929293181, 0.44004, [0.00065646], [0.00066109], [0.00065732], [0.00065982], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005492642361021257], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929293403, 0.44628, [0.0005456], [0.00056301], [0.00054725], [0.00055315], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.539885831250868e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929293622, 0.45436, [2.5248e-05], [2.5553e-05], [2.5329e-05], [2.5453e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001851214138100502], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929293848, 0.4509, [0.00018372], [0.00018848], [0.00018458], [0.00018637], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.233050002949312e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929294072, 0.44953, [4.2134e-05], [4.2492e-05], [4.2184e-05], [4.2471e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003210353483375388], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929294295, 0.45183, [0.00031769], [0.00032317], [0.00031959], [0.00032192], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00038107714768826826], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929294519, 0.44226, [0.00038033], [0.00038412], [0.00038075], [0.00038138], [27], [10]], "benchmarks.TextSuite.time_render": [[4.6828025228597816e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929294739, 0.43567, [4.6481e-06], [4.8526e-06], [4.6588e-06], [4.7005e-06], [2142], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.517294849124959e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929294953, 0.45018, [8.4532e-05], [8.5655e-05], [8.4952e-05], [8.5303e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.403544921191439e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929295178, 0.45229, [3.4017e-05], [3.4885e-05], [3.402e-05], [3.4267e-05], [315], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002694156021625998], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929295402, 0.44696, [0.00026812], [0.00027325], [0.00026887], [0.00027074], [39], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011032729016733356], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929295624, 0.44329, [0.0010982], [0.0011724], [0.0010991], [0.0011151], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014802440003092799], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929295843, 0.4359, [0.0014784], [0.0015016], [0.0014799], [0.0014855], [7], [10]]}, "durations": {"": 1.9989511966705322}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/36efcb5a-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/36efcb5a-virtualenv-py3.10.json new file mode 100644 index 0000000000..9953421d93 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/36efcb5a-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "36efcb5abe9ea8b6a7707243bec89a81e063c01a", "env_name": "virtualenv-py3.10", "date": 1603472109000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6962975981415165e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928989577, 0.45595, [1.683e-07], [1.7053e-07], [1.6932e-07], [1.7006e-07], [64762], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7044543418703197e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928989806, 0.45502, [1.6871e-07], [1.7073e-07], [1.702e-07], [1.7063e-07], [64610], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.6992367789789537e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928990034, 0.4542, [1.6896e-07], [1.7084e-07], [1.6967e-07], [1.7046e-07], [64457], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.703134810532796e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928990261, 0.44494, [1.6965e-07], [1.7082e-07], [1.701e-07], [1.7048e-07], [64594], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7000458742323704e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928990489, 0.45213, [1.6894e-07], [1.7274e-07], [1.6975e-07], [1.7105e-07], [63544], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6998829406495502e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928990715, 0.456, [1.6921e-07], [1.7311e-07], [1.6971e-07], [1.7034e-07], [64583], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010213146000751295], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928990943, 0.44082, [0.0010194], [0.0010242], [0.0010199], [0.0010232], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014337708562379703], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928991163, 0.43396, [0.0014306], [0.0014365], [0.0014318], [0.0014356], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014147630008665146], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928991379, 0.4523, [0.0014092], [0.0014204], [0.0014107], [0.0014179], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1416031242196305e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928991604, 0.42823, [1.1366e-07], [1.1517e-07], [1.1406e-07], [1.1446e-07], [88131], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1408945358695679e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928991820, 0.45585, [1.1346e-07], [1.1433e-07], [1.1384e-07], [1.1413e-07], [96430], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1410896113544889e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928992049, 0.45439, [1.1381e-07], [1.1433e-07], [1.1398e-07], [1.1416e-07], [96048], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928986076, 0.060543], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928986137, 0.060764], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928986198, 0.060546], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0027355208767403383], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928992278, 0.43969, [0.0027281], [0.0027409], [0.002734], [0.002737], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0018644479156743423], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928992496, 0.44894, [0.0018539], [0.0018746], [0.0018638], [0.0018648], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006582486876141047], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928992717, 0.43597, [0.00065765], [0.00066143], [0.00065795], [0.00065902], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000555089946781089], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928992939, 0.43491, [0.00054518], [0.00055824], [0.00055459], [0.00055611], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8029603938768176e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928993160, 0.44717, [2.7984e-05], [2.8185e-05], [2.8022e-05], [2.8094e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001871487071059227], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928993384, 0.4504, [0.00018654], [0.00018824], [0.0001868], [0.00018756], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.228466597851366e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928993610, 0.4448, [4.2137e-05], [4.2368e-05], [4.2257e-05], [4.233e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003317379192712026], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928993832, 0.43861, [0.00032956], [0.00033329], [0.00033079], [0.00033273], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003924358847703283], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928994053, 0.43513, [0.00039219], [0.00039296], [0.00039235], [0.00039269], [26], [10]], "benchmarks.TextSuite.time_render": [[4.697171516259794e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928994270, 0.45696, [4.6841e-06], [4.707e-06], [4.689e-06], [4.7021e-06], [2335], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.521435552211187e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928994497, 0.45142, [8.4929e-05], [8.5635e-05], [8.5156e-05], [8.554e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.380010609546455e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928994725, 0.4421, [3.3779e-05], [3.3895e-05], [3.3798e-05], [3.3835e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002792432433862642], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928994946, 0.43592, [0.00027793], [0.00028037], [0.00027895], [0.0002798], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011467361683672708], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928995164, 0.43365, [0.0011448], [0.0011551], [0.0011457], [0.0011481], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015301428585579352], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928995383, 0.44726, [0.0015262], [0.001542], [0.0015292], [0.0015307], [7], [10]]}, "durations": {"": 2.06260085105896}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/3827b4ae-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/3827b4ae-virtualenv-py3.10.json new file mode 100644 index 0000000000..8b50b62320 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/3827b4ae-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "3827b4ae01aca1b4cb308f4c838da1b91384ad7d", "env_name": "virtualenv-py3.10", "date": 1638453157000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7009055537469912e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928260721, 0.46627, [1.6931e-07], [1.7097e-07], [1.6999e-07], [1.7032e-07], [64364], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7015987727142876e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928260953, 0.46456, [1.6921e-07], [1.7077e-07], [1.6993e-07], [1.7041e-07], [64512], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7029074018500487e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928261185, 0.44741, [1.6919e-07], [1.709e-07], [1.6997e-07], [1.7044e-07], [60573], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6975108501065804e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928261407, 0.44759, [1.6884e-07], [1.6998e-07], [1.6914e-07], [1.6981e-07], [60830], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7048188633534393e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928261630, 0.46122, [1.6999e-07], [1.7111e-07], [1.7012e-07], [1.7057e-07], [63654], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.697135537800892e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928261861, 0.46437, [1.6886e-07], [1.7133e-07], [1.6954e-07], [1.7008e-07], [64410], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011078062510932797], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928262094, 0.454, [0.0011054], [0.0011101], [0.0011069], [0.0011084], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001514940499743846], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928262320, 0.45246, [0.0015085], [0.0015254], [0.0015129], [0.0015177], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013975702513562283], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928262549, 0.45354, [0.0013929], [0.0014026], [0.0013946], [0.0013995], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1443176231251601e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928262776, 0.46351, [1.1425e-07], [1.1519e-07], [1.1431e-07], [1.1465e-07], [96076], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.148095777968294e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928263010, 0.46574, [1.1405e-07], [1.1561e-07], [1.1431e-07], [1.1533e-07], [96181], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1418964091759141e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928263244, 0.46235, [1.1385e-07], [1.1454e-07], [1.1416e-07], [1.1422e-07], [96100], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928257134, 0.066227], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928257200, 0.065569], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928257266, 0.066056], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023518957983469594], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928263476, 0.45906, [0.0023316], [0.0023603], [0.002344], [0.0023558], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001403494748956291], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928263709, 0.45174, [0.0013933], [0.0014152], [0.0014012], [0.0014103], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037406101806222323], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928263937, 0.45149, [0.00037315], [0.00037555], [0.00037337], [0.00037455], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00033967203231558446], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928264161, 0.45332, [0.00033776], [0.00034824], [0.00033877], [0.00034596], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5327518605356386e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928264386, 0.46078, [2.5218e-05], [2.5414e-05], [2.529e-05], [2.5363e-05], [430], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018412104315036136], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928264616, 0.45467, [0.00018337], [0.00018458], [0.00018398], [0.00018418], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.344766258453284e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928264843, 0.44746, [4.3389e-05], [4.3622e-05], [4.3412e-05], [4.3485e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032461806073446166], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928265070, 0.45723, [0.00032394], [0.00032514], [0.00032438], [0.00032509], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035664798282407996], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928265298, 0.44681, [0.00035609], [0.00035745], [0.00035645], [0.0003572], [29], [10]], "benchmarks.TextSuite.time_render": [[4.674904899767451e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928265520, 0.45193, [4.6485e-06], [4.6907e-06], [4.665e-06], [4.6841e-06], [2324], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.502903148737244e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928265750, 0.45667, [8.4472e-05], [8.6022e-05], [8.483e-05], [8.5245e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.508509089678901e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928265979, 0.44927, [3.4971e-05], [3.5129e-05], [3.5047e-05], [3.5094e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002740542764322048], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928266208, 0.44763, [0.00027339], [0.00027509], [0.00027395], [0.00027425], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013660859367519151], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928266431, 0.45753, [0.001359], [0.0013704], [0.0013611], [0.0013692], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014471309301110785], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928266664, 0.4465, [0.0014435], [0.0014547], [0.0014448], [0.0014502], [7], [10]]}, "durations": {"": 1.9763908386230469}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/3db6396a-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/3db6396a-virtualenv-py3.10.json new file mode 100644 index 0000000000..d4dfbab503 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/3db6396a-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "3db6396a0c6838fd8fa642ccab3a095838d88329", "env_name": "virtualenv-py3.10", "date": 1638208615000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7042319254797695e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928246228, 0.4658, [1.697e-07], [1.7155e-07], [1.702e-07], [1.7069e-07], [64460], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7014701335412993e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928246460, 0.43742, [1.69e-07], [1.7085e-07], [1.6994e-07], [1.7066e-07], [58998], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7074798454802254e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928246677, 0.46135, [1.7041e-07], [1.7223e-07], [1.7049e-07], [1.7165e-07], [63266], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.702288241755897e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928246907, 0.46182, [1.6915e-07], [1.7116e-07], [1.7e-07], [1.7034e-07], [63433], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7044823244778374e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928247136, 0.46566, [1.7004e-07], [1.7093e-07], [1.7026e-07], [1.7062e-07], [64529], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6976035790289064e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928247368, 0.46336, [1.6818e-07], [1.7054e-07], [1.6949e-07], [1.7021e-07], [64540], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011084083511377686], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928247600, 0.45566, [0.0011028], [0.0011123], [0.0011053], [0.0011107], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015121815023511381], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928247825, 0.45172, [0.0015065], [0.0015199], [0.0015114], [0.0015162], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013970182499178918], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928248053, 0.45388, [0.0013931], [0.0014037], [0.0013948], [0.0013999], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1427530083689559e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928248279, 0.46422, [1.1388e-07], [1.1469e-07], [1.1424e-07], [1.144e-07], [96380], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1394543975825273e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928248512, 0.46404, [1.133e-07], [1.1469e-07], [1.1342e-07], [1.143e-07], [96444], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.143002247191072e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928248744, 0.46432, [1.1395e-07], [1.1467e-07], [1.1421e-07], [1.1445e-07], [96143], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928242637, 0.065911], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928242703, 0.065746], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928242769, 0.065471], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023442875011824072], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928248976, 0.4591, [0.0023329], [0.0023571], [0.0023388], [0.002348], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001400791623382247], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928249210, 0.44971, [0.0013923], [0.0014051], [0.001396], [0.001402], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003787046069711713], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928249436, 0.45477, [0.00037146], [0.00038647], [0.00037177], [0.00038591], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003395120969094757], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928249665, 0.45332, [0.00033818], [0.00034835], [0.00033874], [0.00034143], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.533570700189705e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928249890, 0.46095, [2.5172e-05], [2.5579e-05], [2.5245e-05], [2.5388e-05], [430], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018461889678668552], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928250121, 0.45578, [0.00018394], [0.00018599], [0.0001841], [0.00018546], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.346377551270535e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928250349, 0.44757, [4.3305e-05], [4.3682e-05], [4.3339e-05], [4.3601e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003238428180338815], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928250577, 0.4559, [0.00032287], [0.0003243], [0.00032354], [0.00032395], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003568433799202843], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928250805, 0.44693, [0.0003552], [0.00035977], [0.00035609], [0.0003571], [29], [10]], "benchmarks.TextSuite.time_render": [[4.675465872560535e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928251027, 0.45465, [4.671e-06], [4.6805e-06], [4.6744e-06], [4.6791e-06], [2344], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.522819132394943e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928251258, 0.45786, [8.459e-05], [8.5948e-05], [8.494e-05], [8.5644e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.519280884206429e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928251489, 0.45879, [3.5054e-05], [3.5315e-05], [3.5063e-05], [3.5278e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002742225789054493], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928251717, 0.44819, [0.00027359], [0.00027552], [0.00027395], [0.00027459], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001358674438961316], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928251940, 0.4552, [0.0013548], [0.0013633], [0.0013555], [0.0013603], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014508422152305555], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928252171, 0.44538, [0.0014448], [0.0014547], [0.0014475], [0.0014523], [7], [10]]}, "durations": {"": 1.980443000793457}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/3f7d3e4e-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/3f7d3e4e-virtualenv-py3.10.json new file mode 100644 index 0000000000..8918ef43fa --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/3f7d3e4e-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "3f7d3e4ef372f4ce954c240df723d8cd646b1534", "env_name": "virtualenv-py3.10", "date": 1643381156000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.698740701488326e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928479137, 0.46365, [1.6868e-07], [1.7249e-07], [1.6944e-07], [1.7033e-07], [64798], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7091042297249934e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928479371, 0.44263, [1.6925e-07], [1.7313e-07], [1.6966e-07], [1.7277e-07], [59234], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7032423421299828e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928479591, 0.45682, [1.6978e-07], [1.7143e-07], [1.702e-07], [1.7077e-07], [64108], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.699293186887289e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928479825, 0.46872, [1.6894e-07], [1.729e-07], [1.6974e-07], [1.7026e-07], [64416], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7076552251688393e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928480059, 0.46858, [1.6962e-07], [1.7356e-07], [1.7028e-07], [1.7151e-07], [64454], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7014452735923893e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928480294, 0.46769, [1.6925e-07], [1.7234e-07], [1.6959e-07], [1.7073e-07], [64659], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011121227224874827], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928480528, 0.44418, [0.0011083], [0.0011159], [0.0011109], [0.0011132], [9], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015579582832287997], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928480748, 0.45126, [0.0015536], [0.00157], [0.0015555], [0.0015635], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014060754383535823], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928480971, 0.45525, [0.0014043], [0.0014135], [0.0014051], [0.0014085], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1416384913475412e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928481199, 0.46631, [1.1391e-07], [1.1446e-07], [1.1401e-07], [1.1439e-07], [96473], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1633424116643548e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928481434, 0.46869, [1.1426e-07], [1.1646e-07], [1.1601e-07], [1.1638e-07], [96212], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1687065132848253e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928481668, 0.44813, [1.1652e-07], [1.1841e-07], [1.166e-07], [1.1777e-07], [86464], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [[0.00853916674532229], [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928481897, 0.52025, [0.0084749], [0.0085804], [0.0085069], [0.0085568], [2], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [[0.008576114501920529], [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928482158, 0.52233, [0.0084985], [0.0087274], [0.008535], [0.008637], [2], [10]], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [[0.00853265624755295], [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928482419, 0.52075, [0.0084799], [0.0085638], [0.0085091], [0.0085449], [2], [10]], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002399866800988093], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928482679, 0.47657, [0.0023894], [0.0024136], [0.0023967], [0.0024079], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014271547864024925], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928482918, 0.44586, [0.0014195], [0.0014339], [0.0014252], [0.0014326], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003826964457402937], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928483138, 0.44781, [0.00037813], [0.00038575], [0.00037852], [0.00038533], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034012633841484785], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928483365, 0.4559, [0.00033825], [0.00034851], [0.00033906], [0.00034087], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5252465200837346e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928483591, 0.46353, [2.516e-05], [2.5434e-05], [2.5187e-05], [2.5321e-05], [431], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001846652243141856], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928483823, 0.45764, [0.00018308], [0.00018504], [0.00018417], [0.00018476], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3604420725165344e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928484051, 0.45077, [4.3494e-05], [4.3719e-05], [4.354e-05], [4.3641e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032480492452371186], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928484281, 0.45976, [0.00032296], [0.00032667], [0.00032371], [0.00032532], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003566659484179048], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928484509, 0.44886, [0.00035422], [0.00035973], [0.00035461], [0.00035858], [29], [10]], "benchmarks.TextSuite.time_render": [[4.665873127859556e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928484732, 0.4559, [4.6501e-06], [4.6776e-06], [4.6626e-06], [4.6681e-06], [2337], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.52070313612785e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928484963, 0.46091, [8.4959e-05], [8.5743e-05], [8.517e-05], [8.5261e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5179808798239994e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928485196, 0.46071, [3.5112e-05], [3.5247e-05], [3.5143e-05], [3.5203e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002742344998599341], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928485426, 0.45897, [0.0002737], [0.00028051], [0.00027397], [0.00027841], [39], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013588984365924262], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928485655, 0.45859, [0.0013543], [0.001361], [0.0013577], [0.0013598], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014551279288882923], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928485887, 0.45059, [0.001445], [0.0014609], [0.0014462], [0.0014579], [7], [10]]}, "durations": {"": 1.990717887878418}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/4020d5a9-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/4020d5a9-virtualenv-py3.10.json new file mode 100644 index 0000000000..6a4b0848ce --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/4020d5a9-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "4020d5a9fb77b6a1bbe4a4e763951dd9441860c8", "env_name": "virtualenv-py3.10", "date": 1593168036000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7315091327706894e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928569768, 0.43134, [1.7182e-07], [1.7361e-07], [1.7285e-07], [1.7324e-07], [64557], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7375567830436184e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928569984, 0.43364, [1.7163e-07], [1.8139e-07], [1.7322e-07], [1.7961e-07], [58556], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7200315802320185e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928570194, 0.44725, [1.6924e-07], [1.8107e-07], [1.701e-07], [1.7373e-07], [60636], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.703477310646659e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928570407, 0.44181, [1.691e-07], [1.712e-07], [1.6997e-07], [1.7065e-07], [64593], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7319662314839302e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928570631, 0.44303, [1.7057e-07], [1.7763e-07], [1.7262e-07], [1.7361e-07], [64705], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7132939782775794e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928570846, 0.45132, [1.6952e-07], [1.7411e-07], [1.698e-07], [1.7356e-07], [64331], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022121166985016316], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928571072, 0.43696, [0.0021967], [0.0022501], [0.0021989], [0.0022416], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928566041, 0.059429], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928566100, 0.059402], "benchmarks.StyleSuite.time_parse_ansi": [[1.1585818227850584e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928571289, 0.42389, [1.1575e-07], [1.1649e-07], [1.158e-07], [1.1607e-07], [87690], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1491735043591866e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928571500, 0.43995, [1.1391e-07], [1.1606e-07], [1.1412e-07], [1.1572e-07], [96395], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1498628178269194e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928571715, 0.43961, [1.1369e-07], [1.1672e-07], [1.1402e-07], [1.1632e-07], [96114], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928566823, 0.058992], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928566882, 0.05893], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928566941, 0.05844], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0020499999984167514], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928571930, 0.42322, [0.0020299], [0.0020701], [0.0020329], [0.0020671], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001439190498786047], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928572145, 0.42246, [0.0014314], [0.0014427], [0.0014362], [0.0014407], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928567418, 0.058119], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928567476, 0.058314], "benchmarks.TextSuite.time_divide": [[2.796573740268368e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928572358, 0.4355, [2.7679e-05], [2.8219e-05], [2.7763e-05], [2.8164e-05], [377], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018736439488476896], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928572574, 0.43791, [0.0001853], [0.00018886], [0.00018649], [0.00018798], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.258416796801612e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928572792, 0.43992, [4.2284e-05], [4.2914e-05], [4.2346e-05], [4.2821e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033309745119749416], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928573011, 0.43133, [0.00032927], [0.00035465], [0.00032978], [0.00033828], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928568411, 0.058339], "benchmarks.TextSuite.time_render": [[4.6698475239037345e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928573228, 0.43764, [4.6544e-06], [4.6892e-06], [4.6573e-06], [4.6782e-06], [2325], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.741666664345525e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928573449, 0.42102, [8.7118e-05], [8.7791e-05], [8.7186e-05], [8.7593e-05], [117], [10]], "benchmarks.TextSuite.time_split": [[3.3751488657586586e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928573661, 0.43403, [3.3647e-05], [3.4327e-05], [3.3686e-05], [3.4173e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.000282816999478618], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928573875, 0.43139, [0.00027936], [0.00028587], [0.00027975], [0.00028548], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011494305541014506], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928574089, 0.43276, [0.0011361], [0.0011602], [0.0011373], [0.0011577], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015503720704665674], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928574305, 0.44015, [0.0015493], [0.0015587], [0.00155], [0.0015519], [7], [10]]}, "durations": {"": 1.949765920639038}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/43a26c0a-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/43a26c0a-virtualenv-py3.10.json new file mode 100644 index 0000000000..ac0b93918e --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/43a26c0a-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "43a26c0a5e61668e77fa465d0915e6d4d084af40", "env_name": "virtualenv-py3.10", "date": 1614442778000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.709802561413027e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929061110, 0.45215, [1.6936e-07], [1.718e-07], [1.7028e-07], [1.7153e-07], [62728], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.697065179385762e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929061334, 0.4594, [1.6865e-07], [1.7051e-07], [1.6949e-07], [1.6999e-07], [64607], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.702309346772063e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929061564, 0.44954, [1.6966e-07], [1.7081e-07], [1.7011e-07], [1.7038e-07], [64319], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7067874077426818e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929061793, 0.46115, [1.7004e-07], [1.7085e-07], [1.7028e-07], [1.7078e-07], [64311], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.703075542529536e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929062024, 0.45949, [1.6907e-07], [1.7177e-07], [1.7004e-07], [1.711e-07], [64413], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7083353043886868e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929062254, 0.46019, [1.6932e-07], [1.7153e-07], [1.704e-07], [1.7128e-07], [64297], [10]], "benchmarks.PrettySuite.time_pretty": [[0.000998994317011569], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929062485, 0.4482, [0.00099738], [0.0010063], [0.00099818], [0.0010009], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014014869375387207], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929062706, 0.4458, [0.0013934], [0.0014138], [0.0013962], [0.0014062], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013922656871727668], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929062929, 0.44369, [0.0013889], [0.0013982], [0.0013894], [0.0013944], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.139315095344454e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929063151, 0.45489, [1.1344e-07], [1.1432e-07], [1.139e-07], [1.1398e-07], [95933], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.142606982016748e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929063379, 0.45636, [1.1384e-07], [1.1481e-07], [1.1406e-07], [1.1452e-07], [95762], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1405560028475279e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929063607, 0.45458, [1.138e-07], [1.1442e-07], [1.1387e-07], [1.1413e-07], [95593], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929057597, 0.06296], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929057661, 0.062313], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929057723, 0.062505], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002279166699736379], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929063835, 0.44639, [0.0022735], [0.0022854], [0.0022781], [0.0022812], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0013640311881317757], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929064061, 0.43969, [0.0013601], [0.0013703], [0.0013619], [0.001366], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.000662766937239212], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929064280, 0.44153, [0.00065784], [0.00067897], [0.00065873], [0.00066599], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005482017632426792], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929064502, 0.45038, [0.0005452], [0.00056321], [0.00054722], [0.00055161], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5456381726691572e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929064725, 0.45515, [2.5327e-05], [2.5687e-05], [2.5351e-05], [2.5594e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018485847425020848], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929064953, 0.45134, [0.00018384], [0.00018758], [0.00018453], [0.00018589], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.355716462269789e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929065177, 0.4421, [4.3531e-05], [4.3783e-05], [4.3539e-05], [4.3638e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032558837891415214], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929065402, 0.46807, [0.00032433], [0.00032706], [0.00032484], [0.00032581], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00038982771198229434], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929065643, 0.43473, [0.00038931], [0.00039088], [0.00038956], [0.00038998], [26], [10]], "benchmarks.TextSuite.time_render": [[4.68262812533014e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929065859, 0.44588, [4.6561e-06], [4.6924e-06], [4.6772e-06], [4.6851e-06], [2322], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.53858266885605e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929066086, 0.4483, [8.4264e-05], [8.5553e-05], [8.5224e-05], [8.5464e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.517803593745662e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929066311, 0.44105, [3.5119e-05], [3.5279e-05], [3.5157e-05], [3.5201e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002750926578301005], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929066536, 0.44259, [0.00027424], [0.00027772], [0.00027464], [0.00027631], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010977333498885856], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929066757, 0.43802, [0.0010938], [0.001104], [0.0010944], [0.0011], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014895565732980945], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929066976, 0.43707, [0.0014857], [0.0014964], [0.0014883], [0.0014909], [7], [10]]}, "durations": {"": 1.9819769859313965}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/43d4c4e5-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/43d4c4e5-virtualenv-py3.10.json new file mode 100644 index 0000000000..a999d426be --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/43d4c4e5-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "43d4c4e50c0334f93240aa907183bb24b8e69fe9", "env_name": "virtualenv-py3.10", "date": 1630164198000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.699320866143202e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928433625, 0.46361, [1.6912e-07], [1.7178e-07], [1.6965e-07], [1.7022e-07], [64457], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7043166841962874e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928433856, 0.46257, [1.6993e-07], [1.7082e-07], [1.7028e-07], [1.7056e-07], [64348], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.70487436541234e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928434087, 0.46305, [1.6936e-07], [1.7086e-07], [1.7035e-07], [1.7052e-07], [64314], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6959247751766975e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928434318, 0.46397, [1.6938e-07], [1.7016e-07], [1.6954e-07], [1.6981e-07], [64989], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6991618853215302e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928434551, 0.46342, [1.6927e-07], [1.7599e-07], [1.6954e-07], [1.71e-07], [64317], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7089756116403513e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928434783, 0.45927, [1.695e-07], [1.7311e-07], [1.7079e-07], [1.7234e-07], [63516], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010292916995240375], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928435013, 0.45023, [0.0010261], [0.0010422], [0.0010272], [0.0010321], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001427075561878155], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928435237, 0.46055, [0.0014219], [0.0014291], [0.0014245], [0.0014277], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013088568121020216], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928435465, 0.44209, [0.0012975], [0.0013232], [0.0013], [0.0013176], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1442916006142942e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928435690, 0.4593, [1.1381e-07], [1.1512e-07], [1.1436e-07], [1.1454e-07], [95603], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1491991722675978e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928435920, 0.4613, [1.1346e-07], [1.1605e-07], [1.1438e-07], [1.1534e-07], [96188], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1529701053575947e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928436151, 0.43575, [1.1414e-07], [1.1701e-07], [1.1487e-07], [1.1635e-07], [87677], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928430055, 0.068854], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928430124, 0.065784], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928430190, 0.064843], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021521667047636585], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928436369, 0.45341, [0.002116], [0.0021965], [0.0021307], [0.0021803], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012916823106934316], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928436597, 0.44415, [0.0012699], [0.0014819], [0.0012758], [0.0013383], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003758764485547576], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928436819, 0.45534, [0.00036896], [0.00038377], [0.00036973], [0.00038185], [29], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003417291774249245], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928437040, 0.45371, [0.00034106], [0.00035128], [0.00034148], [0.00034224], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5390368820586846e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928437265, 0.45785, [2.5298e-05], [2.5598e-05], [2.5322e-05], [2.5449e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018506896569682604], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928437494, 0.45502, [0.00018374], [0.00018666], [0.00018451], [0.00018542], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.365969382758651e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928437720, 0.44578, [4.3455e-05], [4.3768e-05], [4.3572e-05], [4.3671e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003259549675051183], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928437946, 0.43898, [0.00032478], [0.00032683], [0.00032514], [0.00032632], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035797023208163276], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928438164, 0.43523, [0.00035653], [0.00035921], [0.0003571], [0.00035847], [28], [10]], "benchmarks.TextSuite.time_render": [[4.6667561275503975e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928438380, 0.45003, [4.6473e-06], [4.6741e-06], [4.6601e-06], [4.6709e-06], [2325], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.534399611970747e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928438608, 0.45426, [8.4725e-05], [8.5728e-05], [8.5187e-05], [8.553e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.5403962304327084e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928438836, 0.44721, [3.5299e-05], [3.557e-05], [3.537e-05], [3.5464e-05], [305], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027445998689233273], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928439065, 0.44578, [0.00027354], [0.00027559], [0.00027402], [0.00027496], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001109252098831348], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928439287, 0.44391, [0.0011054], [0.001114], [0.0011066], [0.0011104], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013650728742504725], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928439508, 0.45602, [0.0013612], [0.0013709], [0.0013642], [0.0013668], [8], [10]]}, "durations": {"": 2.000382900238037}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/44f54dd8-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/44f54dd8-virtualenv-py3.10.json new file mode 100644 index 0000000000..da2840c1da --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/44f54dd8-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "44f54dd8e85c576b5b031ab5afaa89e4af1d2db8", "env_name": "virtualenv-py3.10", "date": 1613423330000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6967413074663557e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929018191, 0.45685, [1.6772e-07], [1.7106e-07], [1.6938e-07], [1.7019e-07], [64506], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7002887802798017e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929018419, 0.45748, [1.6827e-07], [1.7032e-07], [1.6978e-07], [1.702e-07], [64894], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7043497876303627e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929018648, 0.45753, [1.6848e-07], [1.7519e-07], [1.6981e-07], [1.7087e-07], [64579], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7033197715253273e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929018876, 0.4463, [1.6887e-07], [1.7139e-07], [1.7019e-07], [1.7052e-07], [64524], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.702686915728278e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929019104, 0.4552, [1.6942e-07], [1.709e-07], [1.6966e-07], [1.7062e-07], [64200], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7042750275035252e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929019332, 0.45561, [1.6888e-07], [1.7228e-07], [1.7031e-07], [1.7108e-07], [64292], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010246270991046912], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929019559, 0.44049, [0.0010203], [0.0010319], [0.0010219], [0.0010264], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014248359366320074], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929019778, 0.45392, [0.0014195], [0.0014304], [0.0014217], [0.001427], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014159661277517444], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929020003, 0.44659, [0.001413], [0.0014239], [0.0014148], [0.0014192], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1394939761435257e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929020226, 0.45533, [1.136e-07], [1.1461e-07], [1.1384e-07], [1.1405e-07], [96339], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1384583794797324e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929020454, 0.45622, [1.1351e-07], [1.1446e-07], [1.1365e-07], [1.1395e-07], [96470], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1441081350038904e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929020683, 0.45685, [1.1395e-07], [1.1629e-07], [1.1422e-07], [1.1609e-07], [96427], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929014673, 0.06211], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929014735, 0.061388], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929014796, 0.061498], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.003257651122112293], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929020912, 0.47083, [0.0032419], [0.0032744], [0.0032443], [0.003264], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0021358375001000237], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929021148, 0.435, [0.0021303], [0.0021416], [0.0021337], [0.002139], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006608489693462616], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929021364, 0.43737, [0.0006581], [0.00066546], [0.00065874], [0.00066177], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000547438578091954], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929021585, 0.44162, [0.00054527], [0.00055525], [0.00054646], [0.00054983], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5390515191724798e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929021803, 0.4512, [2.5329e-05], [2.5711e-05], [2.5351e-05], [2.5428e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018476006040020427], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929022028, 0.44752, [0.00018339], [0.00018568], [0.00018443], [0.00018515], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3462600380556324e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929022252, 0.4469, [4.3358e-05], [4.3558e-05], [4.3432e-05], [4.3498e-05], [244], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003242386358606657], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929022474, 0.44771, [0.0003232], [0.00032543], [0.00032396], [0.0003247], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003898078699691083], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929022697, 0.44376, [0.00038863], [0.00039121], [0.00038894], [0.00039019], [27], [10]], "benchmarks.TextSuite.time_render": [[4.677676879431917e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929022918, 0.44464, [4.6703e-06], [4.6962e-06], [4.6745e-06], [4.6798e-06], [2335], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.518635934251506e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929023143, 0.44923, [8.4641e-05], [8.5376e-05], [8.5162e-05], [8.5249e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.519230354962834e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929023369, 0.44159, [3.5092e-05], [3.55e-05], [3.5154e-05], [3.5242e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027432401303054864], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929023594, 0.4393, [0.00027248], [0.00027588], [0.00027333], [0.00027499], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010944333000225013], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929023813, 0.44538, [0.0010917], [0.0011006], [0.0010926], [0.0010968], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014909017149225942], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929024041, 0.43465, [0.0014838], [0.0015007], [0.0014858], [0.0014937], [7], [10]]}, "durations": {"": 1.97792387008667}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/48da2791-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/48da2791-virtualenv-py3.10.json new file mode 100644 index 0000000000..abb554ec17 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/48da2791-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "48da2791036f929f706a33c29db809632e6725fc", "env_name": "virtualenv-py3.10", "date": 1638115255000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7029390691971436e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929396857, 0.46509, [1.6974e-07], [1.7081e-07], [1.7011e-07], [1.7046e-07], [64466], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6999469005804912e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929397088, 0.46218, [1.6943e-07], [1.7107e-07], [1.6979e-07], [1.7052e-07], [64121], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.6956481101479907e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929397319, 0.46503, [1.6843e-07], [1.7113e-07], [1.6903e-07], [1.7056e-07], [64179], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7031189285000093e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929397551, 0.46538, [1.693e-07], [1.7185e-07], [1.7006e-07], [1.7051e-07], [64325], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6978814830790017e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929397783, 0.46799, [1.6935e-07], [1.778e-07], [1.6962e-07], [1.7083e-07], [64446], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7001106675938523e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929398016, 0.46569, [1.6898e-07], [1.7093e-07], [1.6961e-07], [1.7046e-07], [64517], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011089291496318766], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929398249, 0.46493, [0.0011058], [0.0011128], [0.0011067], [0.0011111], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015178006433416158], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929398475, 0.45271, [0.0015126], [0.0015273], [0.0015162], [0.0015208], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014067343745409744], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929398705, 0.45552, [0.0013948], [0.0014121], [0.0014011], [0.0014088], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1431908171180309e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929398934, 0.4625, [1.139e-07], [1.1459e-07], [1.1407e-07], [1.1443e-07], [96223], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1427217539401951e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929399165, 0.46318, [1.1382e-07], [1.1508e-07], [1.1408e-07], [1.1449e-07], [96346], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1413770972804278e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929399397, 0.46447, [1.1388e-07], [1.1505e-07], [1.1397e-07], [1.1449e-07], [96097], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929393276, 0.06579], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929393342, 0.065735], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929393408, 0.065495], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023547582008177415], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929399630, 0.46099, [0.0023333], [0.0023836], [0.0023458], [0.002377], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014109401254245313], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929399866, 0.45218, [0.0013978], [0.0014195], [0.0014069], [0.0014142], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003703571247959709], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929400094, 0.44711, [0.00036972], [0.00037122], [0.00037023], [0.0003706], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003394677417330263], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929400316, 0.45363, [0.00033578], [0.00035242], [0.00033596], [0.00034271], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5319982397407204e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929400543, 0.45892, [2.5273e-05], [2.5455e-05], [2.5291e-05], [2.537e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018443425882463184], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929400771, 0.45448, [0.00018336], [0.00018588], [0.00018415], [0.00018452], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.344523672907784e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929400998, 0.44638, [4.3336e-05], [4.3622e-05], [4.3376e-05], [4.3513e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003248200757132674], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929401225, 0.45657, [0.00032341], [0.00032559], [0.00032417], [0.00032505], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035815086247849054], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929401452, 0.44738, [0.00035601], [0.00036052], [0.00035674], [0.00035926], [29], [10]], "benchmarks.TextSuite.time_render": [[4.660459543542047e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929401674, 0.45297, [4.649e-06], [4.7007e-06], [4.6552e-06], [4.6754e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.559441260923262e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929401904, 0.45579, [8.5149e-05], [8.6055e-05], [8.5462e-05], [8.5757e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.518453232369847e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929402133, 0.45111, [3.5107e-05], [3.5279e-05], [3.5171e-05], [3.5213e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002738130527799704], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929402363, 0.44674, [0.00027328], [0.00027555], [0.00027359], [0.00027398], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013559401249949588], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929402586, 0.45482, [0.0013492], [0.0013608], [0.0013529], [0.0013577], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014501339277817999], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929402816, 0.44494, [0.0014477], [0.0014572], [0.0014492], [0.0014504], [7], [10]]}, "durations": {"": 2.0081732273101807}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/4b123ddf-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/4b123ddf-virtualenv-py3.10.json new file mode 100644 index 0000000000..9b46005bd5 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/4b123ddf-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "4b123ddf9881f37d257a385fbbae0821deb6dba6", "env_name": "virtualenv-py3.10", "date": 1592148956000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [null, [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928524667, 0.057714], "benchmarks.ColorSuite.time_downgrade_to_standard": [null, [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928524724, 0.058216], "benchmarks.ColorSuite.time_downgrade_to_windows": [null, [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928524783, 0.058668], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [null, [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928524841, 0.058207], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [null, [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928524900, 0.058317], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [null, [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928524958, 0.057998], "benchmarks.PrettySuite.time_pretty": [null, [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928525016, 0.057999], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928525074, 0.058439], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928525133, 0.058496], "benchmarks.StyleSuite.time_parse_ansi": [null, [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928525191, 0.058278], "benchmarks.StyleSuite.time_parse_hex": [null, [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928525250, 0.05777], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [null, [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928525308, 0.057742], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928525365, 0.058019], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928525423, 0.057995], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928525481, 0.05858], "benchmarks.TableSuite.time_table_heavy_wrapping": [null, [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928525540, 0.058245], "benchmarks.TableSuite.time_table_no_wrapping": [null, [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928525598, 0.057745], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928525656, 0.058234], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928525715, 0.057613], "benchmarks.TextSuite.time_divide": [null, [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928525772, 0.057794], "benchmarks.TextSuite.time_divide_unicode_heavy": [null, [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928525830, 0.057991], "benchmarks.TextSuite.time_fit": [null, [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928525888, 0.058486], "benchmarks.TextSuite.time_fit_unicode_heavy": [null, [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928525947, 0.058217], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928526005, 0.05783], "benchmarks.TextSuite.time_render": [null, [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928526063, 0.05769], "benchmarks.TextSuite.time_render_unicode_heavy": [null, [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928526121, 0.058295], "benchmarks.TextSuite.time_split": [null, [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928526179, 0.058274], "benchmarks.TextSuite.time_split_unicode_heavy": [null, [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928526237, 0.058275], "benchmarks.TextSuite.time_wrapping": [null, [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928526296, 0.057623], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [null, [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928526353, 0.057948]}, "durations": {"": 1.94716215133667}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/4bf3f19c-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/4bf3f19c-virtualenv-py3.10.json new file mode 100644 index 0000000000..4a9b4731d6 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/4bf3f19c-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "4bf3f19c04f47c60c4fe96b81afe708a0ad812dc", "env_name": "virtualenv-py3.10", "date": 1610056536000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7026700201969953e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929218340, 0.4496, [1.6901e-07], [1.7073e-07], [1.6983e-07], [1.7059e-07], [63258], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7024261033691904e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929218564, 0.45474, [1.6906e-07], [1.7206e-07], [1.7001e-07], [1.7056e-07], [64144], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7097329262004033e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929218790, 0.44701, [1.6951e-07], [1.8056e-07], [1.7071e-07], [1.7106e-07], [64271], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.704293439683435e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929219017, 0.45274, [1.6877e-07], [1.7101e-07], [1.6988e-07], [1.7069e-07], [64637], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6998120032705176e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929219246, 0.45383, [1.6869e-07], [1.716e-07], [1.6933e-07], [1.7054e-07], [64363], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.701495873574819e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929219471, 0.45607, [1.686e-07], [1.7108e-07], [1.6982e-07], [1.7058e-07], [64601], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010267166479025036], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929219699, 0.44096, [0.0010256], [0.0010341], [0.0010262], [0.0010296], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014405237847573257], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929219918, 0.43557, [0.0014334], [0.0014522], [0.0014353], [0.0014467], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014132864380371757], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929220133, 0.44405, [0.0014084], [0.0014207], [0.0014108], [0.0014145], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1413694500299339e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929220356, 0.45439, [1.1382e-07], [1.1487e-07], [1.1391e-07], [1.1425e-07], [96002], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1450187969337221e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929220583, 0.45646, [1.1404e-07], [1.1666e-07], [1.1436e-07], [1.1468e-07], [96297], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1450004689955e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929220812, 0.45426, [1.1411e-07], [1.1624e-07], [1.1442e-07], [1.1483e-07], [95933], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929214835, 0.061496], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929214897, 0.061405], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929214958, 0.061369], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.003232036375266034], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929221039, 0.46378, [0.00322], [0.0032609], [0.0032222], [0.0032356], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0021225292002782226], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929221273, 0.44284, [0.002113], [0.0021436], [0.0021205], [0.0021334], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006580416884389706], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929221498, 0.43619, [0.00065654], [0.00066255], [0.00065709], [0.00065976], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005459375258253299], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929221718, 0.44058, [0.00054361], [0.00055332], [0.0005442], [0.00054791], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8382165332216397e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929221936, 0.44914, [2.8069e-05], [2.8795e-05], [2.8082e-05], [2.8704e-05], [378], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018698976323082062], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929222161, 0.44507, [0.00018619], [0.00018781], [0.00018646], [0.0001872], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2181391569123746e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929222383, 0.44412, [4.2141e-05], [4.2519e-05], [4.2176e-05], [4.2324e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003300329352045552], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929222604, 0.43323, [0.00032818], [0.00033216], [0.00032865], [0.00033058], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003932059228715773], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929222820, 0.43423, [0.00039146], [0.00039549], [0.00039154], [0.00039483], [26], [10]], "benchmarks.TextSuite.time_render": [[4.680967959825711e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929223036, 0.44384, [4.6618e-06], [4.739e-06], [4.6703e-06], [4.7054e-06], [2325], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.533317190995149e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929223261, 0.44865, [8.4655e-05], [8.6092e-05], [8.504e-05], [8.5441e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.393354828108605e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929223487, 0.44314, [3.3758e-05], [3.3968e-05], [3.3827e-05], [3.3952e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002790191352392572], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929223707, 0.43547, [0.00027809], [0.00027992], [0.00027843], [0.00027956], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001142136555346143], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929223924, 0.43895, [0.0011399], [0.0011458], [0.0011402], [0.0011427], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015315089279153782], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929224142, 0.44254, [0.0015198], [0.0015369], [0.0015245], [0.0015349], [7], [10]]}, "durations": {"": 1.9530932903289795}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/4d6a6d88-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/4d6a6d88-virtualenv-py3.10.json new file mode 100644 index 0000000000..8eb517cd44 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/4d6a6d88-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "4d6a6d882048e784aac9e45fc3d0712eac8a44c6", "env_name": "virtualenv-py3.10", "date": 1594653936000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.71211830975041e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928701459, 0.44811, [1.6928e-07], [1.7293e-07], [1.7049e-07], [1.7257e-07], [64070], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7341769853709463e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928701684, 0.42369, [1.7211e-07], [1.7412e-07], [1.7301e-07], [1.7365e-07], [58559], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.733226603416208e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928701894, 0.4239, [1.7258e-07], [1.7531e-07], [1.7287e-07], [1.7381e-07], [58309], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7369829756098446e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928702104, 0.42248, [1.7256e-07], [1.7493e-07], [1.7347e-07], [1.7386e-07], [58145], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.730062267293436e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928702313, 0.42338, [1.7105e-07], [1.7353e-07], [1.727e-07], [1.7323e-07], [58620], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.73106468285579e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928702523, 0.42349, [1.7271e-07], [1.7373e-07], [1.729e-07], [1.736e-07], [58623], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022415790997911246], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928702733, 0.44145, [0.0022111], [0.0022633], [0.0022401], [0.0022491], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928697426, 0.058805], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928697485, 0.058014], "benchmarks.StyleSuite.time_parse_ansi": [[1.1629347304261993e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928702950, 0.41859, [1.1587e-07], [1.1667e-07], [1.1617e-07], [1.1652e-07], [86439], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.149888907589994e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928703159, 0.43942, [1.1351e-07], [1.158e-07], [1.1392e-07], [1.1576e-07], [96497], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1611507526373169e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928703375, 0.4299, [1.1585e-07], [1.1631e-07], [1.1609e-07], [1.1613e-07], [96350], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928698192, 0.057811], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928698249, 0.057598], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928698307, 0.057625], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002132087497739121], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928703590, 0.43733, [0.0021244], [0.0021533], [0.0021308], [0.0021385], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014943362142990477], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928703812, 0.4326, [0.0014916], [0.001502], [0.0014927], [0.0014998], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006707264003731931], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928704031, 0.43352, [0.00066986], [0.00067391], [0.00067017], [0.00067108], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005578264163988125], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928704249, 0.4249, [0.00055723], [0.00056032], [0.00055764], [0.00055827], [18], [10]], "benchmarks.TextSuite.time_divide": [[2.8334253213622352e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928704458, 0.43659, [2.8239e-05], [2.8549e-05], [2.8276e-05], [2.8421e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001867837759320913], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928704681, 0.44303, [0.00018628], [0.00018719], [0.00018674], [0.00018683], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.252741899453619e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928704903, 0.44296, [4.2042e-05], [4.2936e-05], [4.216e-05], [4.2901e-05], [253], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032937769297390217], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928705125, 0.42599, [0.00032873], [0.00032982], [0.00032918], [0.00032955], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928700099, 0.058176], "benchmarks.TextSuite.time_render": [[4.719828067108801e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928705336, 0.43846, [4.6846e-06], [4.7627e-06], [4.6917e-06], [4.7593e-06], [2338], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.595767974384216e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928705559, 0.43407, [8.5341e-05], [8.6674e-05], [8.5505e-05], [8.6038e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.3765640987663486e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928705773, 0.43021, [3.362e-05], [3.4345e-05], [3.3695e-05], [3.3789e-05], [305], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002785990945994854], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928705988, 0.42689, [0.00027808], [0.0002792], [0.00027822], [0.00027882], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001152412055590604], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928706201, 0.43271, [0.0011342], [0.0011636], [0.0011365], [0.0011621], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015300982881204358], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928706414, 0.435, [0.0015163], [0.0015429], [0.0015173], [0.0015413], [7], [10]]}, "durations": {"": 1.9689950942993164}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/52d159aa-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/52d159aa-virtualenv-py3.10.json new file mode 100644 index 0000000000..b78dc3ab4e --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/52d159aa-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "52d159aae04d12ba24ecdc3d8104e6b8068cbf5f", "env_name": "virtualenv-py3.10", "date": 1628194484000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7058945968935357e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928419145, 0.46426, [1.6899e-07], [1.7097e-07], [1.6959e-07], [1.7072e-07], [64325], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7007191055197154e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928419378, 0.46218, [1.6928e-07], [1.7112e-07], [1.6946e-07], [1.7073e-07], [64337], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7047900862400746e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928419608, 0.46293, [1.6988e-07], [1.7222e-07], [1.7034e-07], [1.7087e-07], [64407], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6987062918839053e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928419840, 0.43796, [1.6901e-07], [1.7506e-07], [1.6945e-07], [1.7083e-07], [59256], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.700489583745791e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928420060, 0.46321, [1.6869e-07], [1.7124e-07], [1.6888e-07], [1.7072e-07], [64749], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6975048857829784e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928420292, 0.45536, [1.6863e-07], [1.7169e-07], [1.6948e-07], [1.7053e-07], [64983], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001030508300755173], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928420524, 0.45054, [0.0010281], [0.0010381], [0.0010294], [0.0010319], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014259791878430406], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928420748, 0.46115, [0.0014206], [0.001435], [0.0014241], [0.0014291], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013004270640522009], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928420976, 0.44145, [0.0012931], [0.0013095], [0.0012971], [0.0013017], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.151534361549962e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928421200, 0.45048, [1.1363e-07], [1.1659e-07], [1.1394e-07], [1.1649e-07], [95323], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1456751691900413e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928421430, 0.45451, [1.143e-07], [1.1497e-07], [1.1441e-07], [1.1481e-07], [96146], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.142799556713515e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928421661, 0.46019, [1.1399e-07], [1.1495e-07], [1.1419e-07], [1.144e-07], [95658], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928415565, 0.064836], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928415630, 0.064728], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928415695, 0.064479], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021430041990242897], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928421892, 0.45143, [0.0021284], [0.0021562], [0.0021387], [0.0021471], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012858229365519946], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928422121, 0.43998, [0.001278], [0.0013006], [0.0012844], [0.001293], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037878200029289085], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928422344, 0.45186, [0.0003762], [0.00038154], [0.00037638], [0.00038124], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003415954359356434], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928422568, 0.45219, [0.00033984], [0.00035252], [0.00034056], [0.00034234], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5294476755905552e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928422793, 0.45996, [2.526e-05], [2.5386e-05], [2.527e-05], [2.5346e-05], [430], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001844626466005013], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928423023, 0.45289, [0.00018314], [0.00018489], [0.00018439], [0.00018469], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.342586236396948e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928423249, 0.44655, [4.3288e-05], [4.3714e-05], [4.332e-05], [4.3553e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032384783315302974], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928423476, 0.45419, [0.000323], [0.00032504], [0.00032364], [0.0003245], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003554540172476193], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928423702, 0.44371, [0.00035482], [0.00035661], [0.00035531], [0.00035573], [29], [10]], "benchmarks.TextSuite.time_render": [[4.65925170721221e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928423922, 0.4521, [4.6509e-06], [4.672e-06], [4.6565e-06], [4.667e-06], [2346], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.579609456369433e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928424152, 0.47335, [8.4585e-05], [8.6328e-05], [8.5135e-05], [8.5863e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.51094919114455e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928424380, 0.4494, [3.5084e-05], [3.5232e-05], [3.5094e-05], [3.5152e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002745021839999888], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928424610, 0.44526, [0.0002739], [0.00027532], [0.00027419], [0.00027463], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001095737499417737], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928424832, 0.45514, [0.0010923], [0.0011003], [0.0010928], [0.0010983], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013680338106496492], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928425063, 0.45511, [0.0013634], [0.0013953], [0.0013668], [0.0013697], [8], [10]]}, "durations": {"": 1.9940869808197021}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/53d9eeaf-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/53d9eeaf-virtualenv-py3.10.json new file mode 100644 index 0000000000..c5dd5da0f6 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/53d9eeaf-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "53d9eeafe01e293a1eb5d9bc65b5a611b46dad53", "env_name": "virtualenv-py3.10", "date": 1638033096000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7049279486400416e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929440364, 0.46631, [1.6952e-07], [1.7084e-07], [1.7022e-07], [1.7068e-07], [64469], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7017859373834976e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929440596, 0.46317, [1.6913e-07], [1.7077e-07], [1.6972e-07], [1.7037e-07], [64364], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7037698439109146e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929440827, 0.46392, [1.6957e-07], [1.7122e-07], [1.6996e-07], [1.7081e-07], [64443], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7020052975934573e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929441060, 0.46301, [1.6894e-07], [1.7106e-07], [1.6975e-07], [1.7051e-07], [63988], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7120931499167352e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929441292, 0.46571, [1.697e-07], [1.8041e-07], [1.7066e-07], [1.7236e-07], [63789], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.70363939930509e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929441525, 0.43888, [1.6949e-07], [1.71e-07], [1.6996e-07], [1.7092e-07], [59154], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011072729001170957], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929441745, 0.45553, [0.0011021], [0.0011113], [0.0011049], [0.001109], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015153422843598363], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929441971, 0.45177, [0.0015073], [0.0015185], [0.0015136], [0.0015181], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014005104385432787], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929442200, 0.45317, [0.0013962], [0.001413], [0.0013972], [0.0014056], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.141952810339963e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929442426, 0.46354, [1.1367e-07], [1.1457e-07], [1.1397e-07], [1.1432e-07], [96100], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1403247722285144e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929442658, 0.46318, [1.1374e-07], [1.1458e-07], [1.1399e-07], [1.1427e-07], [95929], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.144795280331981e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929442889, 0.46421, [1.1427e-07], [1.1652e-07], [1.1436e-07], [1.1471e-07], [95936], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929436790, 0.065786], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929436856, 0.065362], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929436922, 0.065903], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002355558300041594], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929443123, 0.46045, [0.0023391], [0.0023658], [0.0023506], [0.0023593], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014035625008546049], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929443357, 0.45078, [0.0013955], [0.0014249], [0.0014003], [0.0014093], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037317783945971835], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929443584, 0.44929, [0.00036973], [0.00037654], [0.00037024], [0.00037593], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034051880638505665], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929443809, 0.45408, [0.00033991], [0.00034984], [0.00034031], [0.00034095], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.544216744663229e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929444035, 0.45751, [2.5366e-05], [2.5573e-05], [2.5389e-05], [2.5473e-05], [424], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001841946811102138], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929444262, 0.45511, [0.00018351], [0.00018492], [0.00018408], [0.00018442], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.366394494688709e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929444489, 0.44753, [4.3524e-05], [4.388e-05], [4.359e-05], [4.3755e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003245524191785784], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929444716, 0.43766, [0.00032402], [0.00032512], [0.00032441], [0.00032487], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003566702592973437], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929444934, 0.44644, [0.00035582], [0.00035851], [0.00035621], [0.00035695], [29], [10]], "benchmarks.TextSuite.time_render": [[4.666720238173253e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929445157, 0.45206, [4.6589e-06], [4.6915e-06], [4.6618e-06], [4.6727e-06], [2327], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.53927383559494e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929445386, 0.45948, [8.4661e-05], [8.5832e-05], [8.515e-05], [8.5439e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.512439156564489e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929445617, 0.45113, [3.5094e-05], [3.5178e-05], [3.511e-05], [3.5149e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027426918409458414], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929445847, 0.44924, [0.00027335], [0.00027611], [0.00027389], [0.00027463], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001357997374725528], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929446071, 0.4553, [0.0013519], [0.0013647], [0.0013535], [0.0013604], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014475237860876533], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929446302, 0.44455, [0.0014457], [0.0014561], [0.001446], [0.0014493], [7], [10]]}, "durations": {"": 1.9948718547821045}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/550d3911-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/550d3911-virtualenv-py3.10.json new file mode 100644 index 0000000000..3b5c6a76a4 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/550d3911-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "550d391171934874ec85ef7bcad2292d8728c1ce", "env_name": "virtualenv-py3.10", "date": 1632474176000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7012055225441422e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928173768, 0.45874, [1.6935e-07], [1.7183e-07], [1.6987e-07], [1.7106e-07], [64752], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6988035409443387e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928174000, 0.46387, [1.6862e-07], [1.7053e-07], [1.6945e-07], [1.7023e-07], [64386], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7065502321372411e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928174231, 0.46129, [1.6914e-07], [1.7181e-07], [1.6991e-07], [1.7126e-07], [64542], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7065929182325723e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928174465, 0.44014, [1.697e-07], [1.7205e-07], [1.7036e-07], [1.7127e-07], [58848], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6986830260259836e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928174682, 0.46129, [1.6949e-07], [1.7137e-07], [1.6968e-07], [1.7093e-07], [63737], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7017289076060707e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928174913, 0.4629, [1.6913e-07], [1.7065e-07], [1.6973e-07], [1.7043e-07], [64237], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001029439600824844], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928175144, 0.45227, [0.0010276], [0.0010308], [0.0010281], [0.0010306], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014290178556361102], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928175369, 0.44384, [0.0014206], [0.001443], [0.0014248], [0.0014332], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013021406248299172], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928175589, 0.44269, [0.0012989], [0.0013057], [0.0013009], [0.0013048], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1429133220318334e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928175814, 0.46182, [1.1391e-07], [1.1468e-07], [1.1422e-07], [1.144e-07], [96462], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1416457898368397e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928176047, 0.46146, [1.1384e-07], [1.1438e-07], [1.1407e-07], [1.1428e-07], [95720], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1422249136281769e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928176278, 0.45943, [1.1376e-07], [1.1534e-07], [1.1416e-07], [1.1494e-07], [95579], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928170194, 0.065791], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928170260, 0.065146], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928170325, 0.065913], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021364042011555286], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928176509, 0.45155, [0.0021183], [0.0021539], [0.0021295], [0.002141], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012852187519456493], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928176738, 0.45139, [0.0012792], [0.001293], [0.0012816], [0.0012885], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003731508617859398], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928176963, 0.46094, [0.00036765], [0.00037918], [0.00036812], [0.00037813], [29], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034339046772314055], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928177194, 0.4551, [0.00034029], [0.00034594], [0.00034061], [0.0003452], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5356557394434596e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928177421, 0.45924, [2.5314e-05], [2.5461e-05], [2.5326e-05], [2.5394e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018453017250506272], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928177650, 0.4541, [0.00018338], [0.0001853], [0.00018441], [0.00018497], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3428305671776565e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928177877, 0.44844, [4.3361e-05], [4.3578e-05], [4.3405e-05], [4.3483e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032479299989063293], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928178105, 0.43769, [0.00032381], [0.00032571], [0.00032464], [0.00032488], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003564590512943486], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928178323, 0.44647, [0.00035473], [0.00035763], [0.00035506], [0.00035739], [29], [10]], "benchmarks.TextSuite.time_render": [[4.6801607524370915e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928178544, 0.45326, [4.6746e-06], [4.6882e-06], [4.677e-06], [4.6839e-06], [2339], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.483691408400773e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928178775, 0.4581, [8.4367e-05], [8.5389e-05], [8.4512e-05], [8.5327e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.525615579451664e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928179006, 0.45066, [3.5121e-05], [3.5416e-05], [3.5163e-05], [3.5352e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027402082885505245], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928179236, 0.44612, [0.00027276], [0.0002755], [0.00027325], [0.00027431], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010991021001245827], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928179458, 0.44497, [0.0010967], [0.0011016], [0.0010983], [0.0011004], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013653568112204084], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928179680, 0.45591, [0.0013635], [0.0013674], [0.0013648], [0.0013661], [8], [10]]}, "durations": {"": 1.9889721870422363}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/55e11902-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/55e11902-virtualenv-py3.10.json new file mode 100644 index 0000000000..ebf974d786 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/55e11902-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "55e11902ab7d1c959122baaee4f98966fd30209f", "env_name": "virtualenv-py3.10", "date": 1637873229000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7009309752207926e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929454849, 0.46725, [1.6942e-07], [1.7118e-07], [1.699e-07], [1.7076e-07], [64529], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7049500323739197e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929455082, 0.46614, [1.6944e-07], [1.7237e-07], [1.7005e-07], [1.7157e-07], [64644], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.70109690025565e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929455316, 0.46141, [1.6911e-07], [1.7078e-07], [1.6966e-07], [1.7031e-07], [63032], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6999118625141967e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929455544, 0.46294, [1.6911e-07], [1.7219e-07], [1.6988e-07], [1.7079e-07], [64389], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7029554885531188e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929455776, 0.43871, [1.6953e-07], [1.7053e-07], [1.6994e-07], [1.7038e-07], [59178], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.700329927267081e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929455995, 0.46798, [1.6886e-07], [1.712e-07], [1.6983e-07], [1.7066e-07], [64499], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011053270995034837], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929456229, 0.45552, [0.0011022], [0.0011108], [0.001105], [0.0011066], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001516476142569445], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929456454, 0.45336, [0.0015102], [0.0015254], [0.0015136], [0.0015206], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014032265626156004], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929456683, 0.4518, [0.0013989], [0.0014156], [0.0014013], [0.0014054], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1443972510031082e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929456911, 0.44705, [1.1404e-07], [1.1613e-07], [1.1435e-07], [1.1463e-07], [87549], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.145170262736998e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929457140, 0.46136, [1.1389e-07], [1.1622e-07], [1.1412e-07], [1.1476e-07], [95206], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1427112499677163e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929457370, 0.45761, [1.1383e-07], [1.1437e-07], [1.142e-07], [1.1434e-07], [96356], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929451267, 0.066028], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929451333, 0.065509], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929451398, 0.065771], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002346887398744002], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929457602, 0.45872, [0.0023343], [0.0023599], [0.0023437], [0.0023479], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014088047500990797], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929457836, 0.46049, [0.0014024], [0.001418], [0.0014048], [0.0014129], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003711837858385739], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929458064, 0.4483, [0.0003703], [0.00037339], [0.00037082], [0.00037233], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003421592902609958], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929458287, 0.45459, [0.00034108], [0.0003524], [0.00034149], [0.0003424], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5493055157103258e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929458514, 0.44971, [2.546e-05], [2.5587e-05], [2.5477e-05], [2.5517e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001844300847042794], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929458743, 0.46116, [0.00018405], [0.00018572], [0.00018436], [0.00018474], [59], [10]], "benchmarks.TextSuite.time_fit": [[4.342130773233227e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929458973, 0.44822, [4.3317e-05], [4.359e-05], [4.3382e-05], [4.3503e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003239267878763547], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929459201, 0.45607, [0.0003227], [0.00032701], [0.00032375], [0.00032407], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.000356247827735858], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929459429, 0.44639, [0.00035549], [0.00035792], [0.0003556], [0.00035649], [29], [10]], "benchmarks.TextSuite.time_render": [[4.677279566679207e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929459651, 0.45303, [4.6528e-06], [4.6861e-06], [4.6622e-06], [4.6829e-06], [2334], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.52260782266967e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929459881, 0.45707, [8.4416e-05], [8.5401e-05], [8.5089e-05], [8.526e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.524391967268874e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929460110, 0.4482, [3.5221e-05], [3.5331e-05], [3.523e-05], [3.527e-05], [305], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002741030789605391], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929460338, 0.44744, [0.00027327], [0.00027529], [0.00027397], [0.00027455], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013605468757305061], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929460561, 0.45554, [0.001354], [0.0013646], [0.0013558], [0.0013632], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001452008929585905], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929460793, 0.44547, [0.0014487], [0.0014565], [0.0014494], [0.0014536], [7], [10]]}, "durations": {"": 1.9884757995605469}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/573125e9-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/573125e9-virtualenv-py3.10.json new file mode 100644 index 0000000000..775e514fec --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/573125e9-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "573125e9b4eaa4b25bb1a911cf61e365b266afba", "env_name": "virtualenv-py3.10", "date": 1606842626000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7035735748782961e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929132730, 0.4547, [1.6957e-07], [1.7111e-07], [1.7008e-07], [1.704e-07], [63922], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7011813100056663e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929132957, 0.45508, [1.6938e-07], [1.7093e-07], [1.6986e-07], [1.7054e-07], [64894], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.705091724398945e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929133187, 0.45669, [1.6911e-07], [1.7386e-07], [1.6977e-07], [1.707e-07], [64216], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7003631710159307e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929133415, 0.45401, [1.6895e-07], [1.7064e-07], [1.6969e-07], [1.705e-07], [63675], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7076965539820025e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929133642, 0.45636, [1.6952e-07], [1.7719e-07], [1.703e-07], [1.731e-07], [64054], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.704083834704045e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929133869, 0.45792, [1.6976e-07], [1.7225e-07], [1.6984e-07], [1.7067e-07], [64175], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010274875501636415], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929134097, 0.44408, [0.0010233], [0.0010341], [0.0010239], [0.0010304], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014428512118424156], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929134318, 0.43837, [0.0014369], [0.0014536], [0.0014413], [0.0014458], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014141536248644115], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929134536, 0.44569, [0.0014093], [0.0014188], [0.0014126], [0.0014145], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1413853433200745e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929134760, 0.45277, [1.1396e-07], [1.161e-07], [1.1402e-07], [1.1467e-07], [96135], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.14545181153452e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929134987, 0.45326, [1.1433e-07], [1.1619e-07], [1.1443e-07], [1.1497e-07], [94741], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1431372140374344e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929135215, 0.45566, [1.1376e-07], [1.1534e-07], [1.1389e-07], [1.151e-07], [95894], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929129197, 0.062502], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929129260, 0.061635], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929129321, 0.061735], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002750234376435401], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929135444, 0.44358, [0.0027407], [0.0027546], [0.002747], [0.0027524], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0018561249986911812], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929135663, 0.44993, [0.001845], [0.0018771], [0.0018483], [0.0018688], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006638372187808272], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929135885, 0.43884, [0.00065885], [0.00066748], [0.00066337], [0.00066538], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005474407892171783], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929136107, 0.44273, [0.00054382], [0.00055731], [0.00054666], [0.00055638], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8176863155462533e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929136326, 0.449, [2.7763e-05], [2.8728e-05], [2.7805e-05], [2.8691e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.000187044956347611], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929136552, 0.44621, [0.00018575], [0.00018908], [0.00018607], [0.00018782], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.226137247155476e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929136775, 0.44798, [4.2102e-05], [4.2582e-05], [4.2197e-05], [4.2289e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003306175964216011], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929136998, 0.43596, [0.00032933], [0.0003318], [0.00033006], [0.00033124], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00039414744242094457], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929137215, 0.43587, [0.00039226], [0.00039631], [0.0003928], [0.00039555], [26], [10]], "benchmarks.TextSuite.time_render": [[4.667174434155948e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929137432, 0.44509, [4.646e-06], [4.6776e-06], [4.6581e-06], [4.6707e-06], [2339], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.516194520780118e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929137659, 0.45219, [8.4795e-05], [8.6022e-05], [8.5094e-05], [8.5459e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.374592788765231e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929137887, 0.44454, [3.3683e-05], [3.3824e-05], [3.3728e-05], [3.378e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002786886348936556], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929138108, 0.44962, [0.00027786], [0.00027951], [0.0002781], [0.00027909], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001147025499247118], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929138326, 0.44111, [0.0011434], [0.0011533], [0.0011447], [0.001149], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015302321428732413], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929138544, 0.44527, [0.0015265], [0.0015332], [0.0015278], [0.0015325], [7], [10]]}, "durations": {"": 1.9958610534667969}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/579a29c8-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/579a29c8-virtualenv-py3.10.json new file mode 100644 index 0000000000..a3644b13b2 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/579a29c8-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "579a29c82081aa74437d9e2483ac9862c048415d", "env_name": "virtualenv-py3.10", "date": 1595868101000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.736474545074484e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928778555, 0.4267, [1.7119e-07], [1.739e-07], [1.7241e-07], [1.7377e-07], [58852], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7340327364317818e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928778767, 0.42826, [1.7185e-07], [1.7397e-07], [1.7259e-07], [1.7373e-07], [59074], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7354063503795828e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928778980, 0.42553, [1.7303e-07], [1.7386e-07], [1.7329e-07], [1.7369e-07], [58533], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7178092996091828e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928779192, 0.4321, [1.692e-07], [1.739e-07], [1.699e-07], [1.7342e-07], [58358], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7230198439390232e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928779410, 0.44067, [1.6987e-07], [1.8203e-07], [1.7041e-07], [1.7417e-07], [64308], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7332703953086618e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928779633, 0.42248, [1.7291e-07], [1.742e-07], [1.7313e-07], [1.7415e-07], [57889], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002227433299412951], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928779844, 0.43937, [0.0021946], [0.0022601], [0.0021961], [0.0022555], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928774498, 0.059132], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928774557, 0.059068], "benchmarks.StyleSuite.time_parse_ansi": [[1.1624317894753063e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928780062, 0.44065, [1.1579e-07], [1.1657e-07], [1.1603e-07], [1.1633e-07], [96244], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.150645199851889e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928780278, 0.44023, [1.1359e-07], [1.1631e-07], [1.1389e-07], [1.1608e-07], [96311], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1509978583019232e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928780495, 0.44997, [1.1455e-07], [1.1655e-07], [1.1477e-07], [1.1623e-07], [95745], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928775289, 0.058777], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928775348, 0.058742], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928775407, 0.058794], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002142004200140946], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928780721, 0.44142, [0.0021327], [0.0021544], [0.00214], [0.0021438], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014956279275273637], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928780944, 0.43438, [0.0014902], [0.0015024], [0.001493], [0.0014975], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.000673062500815528], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928781165, 0.43958, [0.00067142], [0.00068082], [0.00067214], [0.00067439], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005573969208757933], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928781386, 0.43169, [0.00055353], [0.00055903], [0.00055649], [0.00055757], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8313752580726644e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928781606, 0.43606, [2.8265e-05], [2.8377e-05], [2.8291e-05], [2.8348e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001889353068116562], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928781829, 0.44303, [0.00018718], [0.00019134], [0.00018733], [0.00019102], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.287974996259436e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928782052, 0.43385, [4.276e-05], [4.301e-05], [4.2847e-05], [4.2901e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003364569838008573], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928782272, 0.4345, [0.00033568], [0.00033702], [0.00033619], [0.00033679], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928777196, 0.059081], "benchmarks.TextSuite.time_render": [[4.732899489164659e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928782488, 0.44164, [4.6523e-06], [4.8086e-06], [4.668e-06], [4.7919e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.669725398898924e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928782715, 0.44273, [8.616e-05], [8.6896e-05], [8.6663e-05], [8.675e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.4393229165848774e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928782938, 0.44396, [3.4276e-05], [3.5123e-05], [3.4315e-05], [3.4461e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028335472971603677], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928783160, 0.44001, [0.0002798], [0.00028579], [0.00028012], [0.00028498], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011618008882376468], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928783384, 0.42902, [0.0011601], [0.001167], [0.0011605], [0.0011627], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015376249981012993], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928783601, 0.43825, [0.0015175], [0.0015529], [0.0015184], [0.0015505], [7], [10]]}, "durations": {"": 1.9670758247375488}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/5f021978-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/5f021978-virtualenv-py3.10.json new file mode 100644 index 0000000000..b37afa3c8b --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/5f021978-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "5f0219786bbaf994061011df087602d5edff5d66", "env_name": "virtualenv-py3.10", "date": 1641724467000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7035226366991395e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928463178, 0.47121, [1.6929e-07], [1.7638e-07], [1.6994e-07], [1.7237e-07], [64033], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7104967550450717e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928463413, 0.46938, [1.6922e-07], [1.7177e-07], [1.7068e-07], [1.7127e-07], [64539], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7066034108752568e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928463648, 0.46867, [1.7032e-07], [1.7179e-07], [1.7059e-07], [1.7141e-07], [64263], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7124313816843975e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928463884, 0.47297, [1.6969e-07], [1.7395e-07], [1.6993e-07], [1.7356e-07], [64706], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7017476167767825e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928464120, 0.4696, [1.6905e-07], [1.7056e-07], [1.6976e-07], [1.7038e-07], [64565], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.697733419053571e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928464356, 0.46247, [1.6873e-07], [1.706e-07], [1.6969e-07], [1.7029e-07], [65001], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011088667015428655], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928464592, 0.45823, [0.0011033], [0.0011204], [0.0011067], [0.001113], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001552386928649087], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928464819, 0.45069, [0.0015479], [0.001557], [0.0015505], [0.0015543], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014095390633883653], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928465042, 0.45741, [0.0014019], [0.0014361], [0.001404], [0.0014129], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1439336631824014e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928465271, 0.46735, [1.14e-07], [1.1545e-07], [1.1413e-07], [1.1443e-07], [96508], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1472853324673091e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928465505, 0.45557, [1.1426e-07], [1.1677e-07], [1.144e-07], [1.153e-07], [95846], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1652326348148687e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928465728, 0.47055, [1.1609e-07], [1.1682e-07], [1.1644e-07], [1.1658e-07], [96202], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [[0.008522239499143325], [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928465964, 0.52198, [0.0084901], [0.0085779], [0.0085138], [0.0085343], [2], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [[0.008546103999833576], [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928466225, 0.52079, [0.0084924], [0.0085719], [0.0085191], [0.0085522], [2], [10]], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [[0.008535864493751433], [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928466486, 0.51968, [0.0084976], [0.0085744], [0.0085191], [0.0085518], [2], [10]], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002401412499602884], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928466746, 0.47729, [0.0023849], [0.0024111], [0.0023929], [0.0024044], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014333512143431498], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928466985, 0.44636, [0.0014275], [0.0014408], [0.0014295], [0.0014357], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.00038671653549369827], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928467206, 0.45238, [0.00038171], [0.00039182], [0.00038211], [0.00039098], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003404233871298211], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928467438, 0.45553, [0.00033704], [0.00035018], [0.00033738], [0.00034487], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.531585199997211e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928467663, 0.46305, [2.5279e-05], [2.5447e-05], [2.5293e-05], [2.5356e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018472809486034936], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928467894, 0.45794, [0.00018414], [0.00018541], [0.00018456], [0.00018487], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3558418377758746e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928468123, 0.44959, [4.3458e-05], [4.3744e-05], [4.3534e-05], [4.3643e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032473737850192595], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928468352, 0.4597, [0.0003236], [0.00032612], [0.00032425], [0.00032511], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035738648248611596], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928468581, 0.44933, [0.00035701], [0.00035825], [0.00035717], [0.00035775], [29], [10]], "benchmarks.TextSuite.time_render": [[4.668496161822756e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928468804, 0.45655, [4.6568e-06], [4.6896e-06], [4.6596e-06], [4.6708e-06], [2346], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.519108200744085e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928469036, 0.46041, [8.5037e-05], [8.5481e-05], [8.5088e-05], [8.5372e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5178668325703625e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928469268, 0.45318, [3.5077e-05], [3.5333e-05], [3.5146e-05], [3.5209e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002742088813408229], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928469499, 0.45048, [0.00027373], [0.00027495], [0.00027405], [0.00027469], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013609556881419849], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928469724, 0.45751, [0.0013536], [0.001364], [0.0013562], [0.0013628], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014542143554925652], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928469956, 0.44957, [0.001449], [0.0014817], [0.0014521], [0.0014696], [7], [10]]}, "durations": {"": 2.003809928894043}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/5f03e3ba-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/5f03e3ba-virtualenv-py3.10.json new file mode 100644 index 0000000000..72b74f3e4e --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/5f03e3ba-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "5f03e3ba5306ea935126d354d71d3c7bb4dec3a3", "env_name": "virtualenv-py3.10", "date": 1603019948000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7029400369316336e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928962279, 0.4288, [1.7001e-07], [1.7142e-07], [1.7018e-07], [1.7081e-07], [58853], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6975923588875979e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928962494, 0.45268, [1.6889e-07], [1.7064e-07], [1.6947e-07], [1.7004e-07], [64449], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7122144386242466e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928962720, 0.44383, [1.6952e-07], [1.7701e-07], [1.7086e-07], [1.7138e-07], [64662], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7052503344942357e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928962945, 0.45549, [1.7007e-07], [1.7118e-07], [1.7026e-07], [1.71e-07], [64114], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7053431360609528e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928963173, 0.45722, [1.6968e-07], [1.7377e-07], [1.7023e-07], [1.7067e-07], [64348], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7023318621135e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928963401, 0.456, [1.6909e-07], [1.7173e-07], [1.6969e-07], [1.7074e-07], [64144], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010147333494387567], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928963629, 0.4386, [0.0010127], [0.0010217], [0.0010137], [0.0010151], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928957985, 0.061291], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014055181873118272], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928963848, 0.44808, [0.0014012], [0.0014379], [0.0014023], [0.0014139], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1483355694441893e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928964074, 0.45479, [1.1393e-07], [1.1562e-07], [1.14e-07], [1.1537e-07], [95375], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1531780253540436e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928964302, 0.4352, [1.139e-07], [1.158e-07], [1.1473e-07], [1.1552e-07], [87364], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1466431835136977e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928964524, 0.44575, [1.1395e-07], [1.172e-07], [1.1447e-07], [1.1641e-07], [95954], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928958936, 0.060677], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928958997, 0.060723], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928959058, 0.060341], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0027481563738547266], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928964743, 0.44822, [0.0027384], [0.0027943], [0.0027456], [0.0027549], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0018641839997144416], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928964966, 0.45091, [0.0018554], [0.0018823], [0.0018621], [0.001872], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006637421874984284], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928965189, 0.44186, [0.00065813], [0.00067295], [0.00066221], [0.00066779], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005481392635326636], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928965415, 0.44284, [0.00054686], [0.0005553], [0.0005472], [0.00055266], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.7963297092051037e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928965636, 0.44729, [2.7859e-05], [2.8125e-05], [2.7886e-05], [2.8073e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018773648250651985], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928965859, 0.44907, [0.00018706], [0.00019296], [0.0001872], [0.00019119], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.22623665238994e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928966086, 0.45329, [4.2169e-05], [4.265e-05], [4.2204e-05], [4.2296e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003306686773993856], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928966316, 0.43283, [0.000329], [0.00033176], [0.00033028], [0.00033116], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928960899, 0.061053], "benchmarks.TextSuite.time_render": [[4.670691716725854e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928966531, 0.44117, [4.6569e-06], [4.6863e-06], [4.6596e-06], [4.6803e-06], [2329], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.543684650542523e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928966755, 0.44878, [8.492e-05], [8.6589e-05], [8.5022e-05], [8.5955e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.391310484373882e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928966982, 0.44135, [3.377e-05], [3.4059e-05], [3.38e-05], [3.4e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027908670214143257], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928967202, 0.43236, [0.00027816], [0.0002797], [0.00027871], [0.00027919], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011475694466045955], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928967417, 0.43754, [0.0011417], [0.0011546], [0.0011434], [0.0011509], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015298422139104722], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928967634, 0.44091, [0.0015248], [0.0015364], [0.0015273], [0.0015305], [7], [10]]}, "durations": {"": 2.012441873550415}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/5f55063b-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/5f55063b-virtualenv-py3.10.json new file mode 100644 index 0000000000..f5d1c5a695 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/5f55063b-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "5f55063b139e5fcb70dc75cbebd4195c48f1e9bc", "env_name": "virtualenv-py3.10", "date": 1593030443000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7426155866769343e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928557720, 0.44015, [1.7078e-07], [1.7553e-07], [1.7241e-07], [1.7483e-07], [64410], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7307732454880455e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928557935, 0.43725, [1.7199e-07], [1.7359e-07], [1.7266e-07], [1.7338e-07], [64320], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7381171223370905e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928558158, 0.42462, [1.7164e-07], [1.7654e-07], [1.7314e-07], [1.7427e-07], [59024], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7338147194241619e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928558369, 0.42713, [1.7146e-07], [1.7358e-07], [1.7326e-07], [1.7349e-07], [58695], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7082182191926202e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928558579, 0.43687, [1.6988e-07], [1.7426e-07], [1.6999e-07], [1.7256e-07], [64458], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7132887430961657e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928558802, 0.44965, [1.6957e-07], [1.739e-07], [1.698e-07], [1.7355e-07], [64441], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002201112496550195], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928559028, 0.43323, [0.0021928], [0.0022446], [0.0021973], [0.0022294], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928554011, 0.057544], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928554069, 0.057697], "benchmarks.StyleSuite.time_parse_ansi": [[1.157208851811601e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928559242, 0.4371, [1.1398e-07], [1.1696e-07], [1.143e-07], [1.1675e-07], [95939], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.152207594246434e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928559457, 0.43555, [1.1365e-07], [1.1663e-07], [1.1392e-07], [1.1644e-07], [95894], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1548119693731335e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928559671, 0.44418, [1.1413e-07], [1.1717e-07], [1.1445e-07], [1.1647e-07], [94878], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928554793, 0.057445], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928554850, 0.057195], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928554907, 0.056875], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0020350915991002696], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928559894, 0.42237, [0.0020269], [0.0020659], [0.0020317], [0.0020452], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014367262150959245], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928560108, 0.4207, [0.001434], [0.0014608], [0.0014345], [0.0014396], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928555382, 0.057685], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928555440, 0.057371], "benchmarks.TextSuite.time_divide": [[2.82225680704526e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928560321, 0.4417, [2.7741e-05], [2.8701e-05], [2.7832e-05], [2.8494e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001870984136797327], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928560542, 0.4333, [0.00018636], [0.000188], [0.00018692], [0.00018728], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.2128788602718785e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928560763, 0.44034, [4.2025e-05], [4.292e-05], [4.2065e-05], [4.2777e-05], [253], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003335685483292646], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928560983, 0.42822, [0.00033024], [0.00033744], [0.00033108], [0.00033605], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928556368, 0.057561], "benchmarks.TextSuite.time_render": [[4.675921118193493e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928561195, 0.43693, [4.6644e-06], [4.6917e-06], [4.675e-06], [4.6765e-06], [2339], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.527701947969035e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928561417, 0.44177, [8.5037e-05], [8.596e-05], [8.5078e-05], [8.5696e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.374086849976561e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928561640, 0.43075, [3.3632e-05], [3.4252e-05], [3.3707e-05], [3.3846e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002787668915540987], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928561855, 0.42758, [0.00027809], [0.00028596], [0.00027844], [0.00027954], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011450092214444238], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928562068, 0.42967, [0.001136], [0.0011669], [0.0011372], [0.0011539], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015197291421437903], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928562282, 0.43347, [0.0015173], [0.0015357], [0.0015195], [0.0015202], [7], [10]]}, "durations": {"": 1.9274108409881592}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/64755d41-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/64755d41-virtualenv-py3.10.json new file mode 100644 index 0000000000..987b04a5f6 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/64755d41-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "64755d41fa02fce7ec96e93c2356c45e2e489111", "env_name": "virtualenv-py3.10", "date": 1614430154000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6965338984778662e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929046829, 0.46, [1.687e-07], [1.7121e-07], [1.6948e-07], [1.7025e-07], [64424], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.704037171582712e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929047060, 0.43072, [1.6973e-07], [1.7137e-07], [1.702e-07], [1.7071e-07], [58920], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.706237033781775e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929047274, 0.44922, [1.6924e-07], [1.805e-07], [1.7032e-07], [1.7162e-07], [64400], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7043955852118696e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929047503, 0.45591, [1.6887e-07], [1.7088e-07], [1.7008e-07], [1.7055e-07], [64451], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7031919212220384e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929047733, 0.45571, [1.6977e-07], [1.7077e-07], [1.7003e-07], [1.7058e-07], [64339], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7052593059742275e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929047962, 0.45449, [1.6895e-07], [1.711e-07], [1.6988e-07], [1.7096e-07], [63516], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010033427732361652], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929048189, 0.45091, [0.0009986], [0.0010074], [0.0010008], [0.0010042], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014030390011612326], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929048413, 0.4473, [0.0014005], [0.0014155], [0.0014015], [0.0014056], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013944688107585534], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929048637, 0.44478, [0.0013901], [0.001403], [0.0013931], [0.0013962], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1404005064879602e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929048860, 0.45724, [1.1353e-07], [1.1507e-07], [1.1388e-07], [1.1435e-07], [96041], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1528624321089372e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929049089, 0.45136, [1.1368e-07], [1.1667e-07], [1.1409e-07], [1.1657e-07], [93866], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1400625216944154e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929049313, 0.45482, [1.1364e-07], [1.1453e-07], [1.138e-07], [1.1435e-07], [95488], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929043306, 0.063175], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929043370, 0.062626], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929043432, 0.062161], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023428916989360004], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929049541, 0.46131, [0.0023405], [0.0023488], [0.002341], [0.0023454], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014403332856350712], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929049772, 0.44078, [0.0014346], [0.0014532], [0.0014393], [0.0014425], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006583841559404391], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929049990, 0.43817, [0.00065618], [0.00066033], [0.00065775], [0.00065947], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005479879213166178], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929050212, 0.445, [0.00054439], [0.00057321], [0.00054576], [0.00055696], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5343872384283808e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929050431, 0.4548, [2.5303e-05], [2.5408e-05], [2.5342e-05], [2.5378e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001848050622876534], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929050656, 0.44336, [0.00018405], [0.00018564], [0.00018457], [0.00018496], [56], [10]], "benchmarks.TextSuite.time_fit": [[4.3598299950589335e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929050875, 0.44159, [4.3447e-05], [4.3758e-05], [4.3496e-05], [4.3717e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003240322581522407], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929051099, 0.43042, [0.00032367], [0.0003245], [0.00032387], [0.00032422], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00038991435226139236], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929051313, 0.4457, [0.00038817], [0.00039106], [0.00038868], [0.00039061], [27], [10]], "benchmarks.TextSuite.time_render": [[4.681328553562882e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929051535, 0.44673, [4.6717e-06], [4.7011e-06], [4.6742e-06], [4.6885e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.539192583612021e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929051762, 0.45511, [8.477e-05], [8.665e-05], [8.5005e-05], [8.5749e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5212323016278426e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929051988, 0.44421, [3.5087e-05], [3.5336e-05], [3.513e-05], [3.5259e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027470724997233207], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929052215, 0.44087, [0.00027314], [0.00027617], [0.00027383], [0.00027545], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010986958499415778], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929052434, 0.43797, [0.0010954], [0.0011024], [0.0010959], [0.0011016], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014876964269205928], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929052652, 0.43619, [0.0014852], [0.0014927], [0.0014868], [0.0014895], [7], [10]]}, "durations": {"": 2.0037131309509277}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/666d0cf2-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/666d0cf2-virtualenv-py3.10.json new file mode 100644 index 0000000000..ac8a7e6b60 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/666d0cf2-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "666d0cf2b2eca98ff75bd260f91b200d0bb82e90", "env_name": "virtualenv-py3.10", "date": 1637405513000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7059216979300207e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929483869, 0.46535, [1.6993e-07], [1.7094e-07], [1.7045e-07], [1.7081e-07], [64392], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.709019096843553e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929484100, 0.46715, [1.69e-07], [1.717e-07], [1.7019e-07], [1.7136e-07], [64405], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7002134261694357e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929484334, 0.46378, [1.6929e-07], [1.7051e-07], [1.6954e-07], [1.7017e-07], [64543], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7039360575301497e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929484568, 0.45849, [1.6915e-07], [1.7143e-07], [1.6969e-07], [1.7058e-07], [63401], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7012746920399016e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929484797, 0.46463, [1.6888e-07], [1.7061e-07], [1.6962e-07], [1.7021e-07], [64490], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.698780700455599e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929485030, 0.4678, [1.6942e-07], [1.7151e-07], [1.6966e-07], [1.7036e-07], [64328], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001039016699360218], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929485261, 0.45232, [0.0010348], [0.0010461], [0.0010373], [0.0010427], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001429678570795139], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929485485, 0.44288, [0.001422], [0.0014424], [0.0014263], [0.0014325], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013064713111816673], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929485704, 0.44442, [0.0013024], [0.0013231], [0.0013039], [0.0013094], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1418550215190512e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929485930, 0.4571, [1.1387e-07], [1.1535e-07], [1.1402e-07], [1.1468e-07], [94759], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1405231649255829e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929486158, 0.44506, [1.1346e-07], [1.174e-07], [1.1372e-07], [1.1567e-07], [87802], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1406058148527631e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929486385, 0.46433, [1.1388e-07], [1.1636e-07], [1.1396e-07], [1.1542e-07], [96465], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929480287, 0.065892], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929480353, 0.06518], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929480419, 0.064819], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0022066499950597063], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929486618, 0.45052, [0.0021978], [0.0022218], [0.0022014], [0.0022086], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0013307968747540144], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929486841, 0.45045, [0.0013223], [0.0013412], [0.0013249], [0.001334], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003770327499036544], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929487070, 0.45037, [0.0003715], [0.00037914], [0.00037257], [0.00037736], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034180240313177025], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929487293, 0.45233, [0.00033766], [0.00034821], [0.00033838], [0.00034259], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5328922338838523e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929487517, 0.45603, [2.5101e-05], [2.5532e-05], [2.5159e-05], [2.5482e-05], [425], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018498636175003224], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929487743, 0.45479, [0.00018346], [0.00018634], [0.0001842], [0.00018552], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.349864433222352e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929487970, 0.44737, [4.3458e-05], [4.4164e-05], [4.3487e-05], [4.3546e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003249583232607092], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929488197, 0.43982, [0.00032337], [0.00032803], [0.00032414], [0.00032677], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003559333335336608], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929488413, 0.45738, [0.00035458], [0.00036427], [0.00035485], [0.0003571], [30], [10]], "benchmarks.TextSuite.time_render": [[4.681305513344945e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929488639, 0.45041, [4.6548e-06], [4.6957e-06], [4.659e-06], [4.6905e-06], [2324], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.511783971698605e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929488867, 0.45545, [8.4799e-05], [8.5566e-05], [8.5074e-05], [8.5398e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.528940459019443e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929489097, 0.44655, [3.5224e-05], [3.5363e-05], [3.5262e-05], [3.5303e-05], [304], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027400657908353756], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929489324, 0.44615, [0.00027351], [0.00027464], [0.00027372], [0.00027418], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001119129150174558], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929489545, 0.45786, [0.0010965], [0.0011302], [0.0011088], [0.0011242], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013640703109558672], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929489779, 0.4553, [0.0013606], [0.0013689], [0.0013627], [0.0013659], [8], [10]]}, "durations": {"": 1.988671064376831}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/690507d4-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/690507d4-virtualenv-py3.10.json new file mode 100644 index 0000000000..3204737923 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/690507d4-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "690507d4f39ff4ae9e5618711627037ac26e256c", "env_name": "virtualenv-py3.10", "date": 1621287005000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7055391959849702e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928333083, 0.45456, [1.6973e-07], [1.7106e-07], [1.7025e-07], [1.7079e-07], [63734], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7052009692883833e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928333310, 0.45405, [1.698e-07], [1.7099e-07], [1.702e-07], [1.7078e-07], [64861], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.703780635253241e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928333539, 0.4547, [1.6939e-07], [1.7126e-07], [1.6989e-07], [1.7093e-07], [63369], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6995471132619938e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928333766, 0.4524, [1.6931e-07], [1.7085e-07], [1.6965e-07], [1.7004e-07], [62797], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.696196676231718e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928333992, 0.4566, [1.6902e-07], [1.7076e-07], [1.6928e-07], [1.7005e-07], [64278], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7001884858257172e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928334220, 0.43228, [1.6891e-07], [1.7229e-07], [1.6969e-07], [1.7032e-07], [59209], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010318208500393667], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928334436, 0.44465, [0.0010292], [0.0010381], [0.0010304], [0.0010331], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014297995003289543], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928334657, 0.46539, [0.0014239], [0.0014329], [0.001426], [0.0014314], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014235286253097001], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928334885, 0.45289, [0.0014219], [0.0014304], [0.0014222], [0.0014275], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1557706520754057e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928335110, 0.45123, [1.1465e-07], [1.1658e-07], [1.1475e-07], [1.1573e-07], [93849], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1424178187962725e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928335334, 0.45577, [1.1396e-07], [1.1479e-07], [1.1422e-07], [1.1435e-07], [95551], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1490234874890529e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928335563, 0.45654, [1.1419e-07], [1.1781e-07], [1.1454e-07], [1.1534e-07], [95247], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928329594, 0.063525], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928329658, 0.062237], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928329720, 0.062164], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002133625099668279], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928335790, 0.44434, [0.0021128], [0.0021426], [0.002121], [0.0021377], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012864271247963188], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928336016, 0.43432, [0.0012799], [0.0012952], [0.0012842], [0.0012901], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006589544382222812], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928336236, 0.439, [0.00065683], [0.00066446], [0.0006584], [0.00065952], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005474320519409192], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928336457, 0.44326, [0.00054373], [0.00055577], [0.00054547], [0.00055243], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5388628264943903e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928336676, 0.45107, [2.5238e-05], [2.5484e-05], [2.531e-05], [2.5444e-05], [425], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018476078448343444], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928336900, 0.44887, [0.00018387], [0.00018535], [0.00018469], [0.00018495], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.347839755803866e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928337125, 0.43851, [4.3333e-05], [4.3669e-05], [4.3353e-05], [4.3572e-05], [244], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032490995128624017], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928337348, 0.43061, [0.00032458], [0.0003259], [0.00032468], [0.00032516], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003564339136134769], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928337562, 0.43987, [0.00035575], [0.00035723], [0.000356], [0.00035682], [29], [10]], "benchmarks.TextSuite.time_render": [[4.700765783165551e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928337780, 0.44748, [4.6678e-06], [4.7389e-06], [4.679e-06], [4.7266e-06], [2329], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.534749599675706e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928338008, 0.45211, [8.518e-05], [8.6115e-05], [8.5281e-05], [8.56e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.526865361445565e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928338236, 0.44223, [3.5155e-05], [3.5436e-05], [3.5219e-05], [3.5289e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002749084344127608], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928338461, 0.44124, [0.00027333], [0.00027587], [0.00027442], [0.00027528], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010947916991426608], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928338681, 0.44788, [0.0010928], [0.0010971], [0.0010935], [0.0010954], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014860387870742542], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928338909, 0.43559, [0.0014818], [0.0014929], [0.0014832], [0.00149], [7], [10]]}, "durations": {"": 1.981421947479248}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/6d7ba589-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/6d7ba589-virtualenv-py3.10.json new file mode 100644 index 0000000000..641feb6321 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/6d7ba589-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "6d7ba589e2e37e91f12d0a0d4e4a6ae0c9e144a5", "env_name": "virtualenv-py3.10", "date": 1591790104000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [null, [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928507933, 0.059222], "benchmarks.ColorSuite.time_downgrade_to_standard": [null, [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928507992, 0.058364], "benchmarks.ColorSuite.time_downgrade_to_windows": [null, [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928508051, 0.058069], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [null, [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928508109, 0.059971], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [null, [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928508169, 0.058018], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [null, [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928508227, 0.058165], "benchmarks.PrettySuite.time_pretty": [null, [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928508285, 0.058273], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928508343, 0.05774], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928508401, 0.057994], "benchmarks.StyleSuite.time_parse_ansi": [null, [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928508459, 0.058585], "benchmarks.StyleSuite.time_parse_hex": [null, [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928508518, 0.058293], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [null, [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928508576, 0.059203], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928508636, 0.058099], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928508694, 0.058112], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928508752, 0.057669], "benchmarks.TableSuite.time_table_heavy_wrapping": [null, [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928508810, 0.058181], "benchmarks.TableSuite.time_table_no_wrapping": [null, [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928508868, 0.05935], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928508927, 0.058248], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928508986, 0.057603], "benchmarks.TextSuite.time_divide": [null, [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928509043, 0.057807], "benchmarks.TextSuite.time_divide_unicode_heavy": [null, [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928509101, 0.057848], "benchmarks.TextSuite.time_fit": [null, [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928509159, 0.058172], "benchmarks.TextSuite.time_fit_unicode_heavy": [null, [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928509217, 0.057525], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928509275, 0.057732], "benchmarks.TextSuite.time_render": [null, [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928509333, 0.057952], "benchmarks.TextSuite.time_render_unicode_heavy": [null, [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928509391, 0.057931], "benchmarks.TextSuite.time_split": [null, [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928509449, 0.057919], "benchmarks.TextSuite.time_split_unicode_heavy": [null, [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928509507, 0.058091], "benchmarks.TextSuite.time_wrapping": [null, [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928509565, 0.057806], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [null, [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928509623, 0.057942]}, "durations": {"": 1.957338809967041}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/7441bf27-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/7441bf27-virtualenv-py3.10.json new file mode 100644 index 0000000000..3483b56087 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/7441bf27-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "7441bf27f3a023c9d3cd57229e4e5e06ec1b8e9f", "env_name": "virtualenv-py3.10", "date": 1604838636000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.69993956141873e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929118445, 0.45436, [1.6902e-07], [1.706e-07], [1.6959e-07], [1.7017e-07], [64611], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6992707311881512e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929118673, 0.455, [1.6811e-07], [1.709e-07], [1.6974e-07], [1.7026e-07], [64160], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7042165959298685e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929118900, 0.45666, [1.6919e-07], [1.7381e-07], [1.7017e-07], [1.7061e-07], [64392], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.701407808991948e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929119128, 0.45565, [1.6887e-07], [1.7082e-07], [1.6945e-07], [1.7043e-07], [64057], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7025582359342565e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929119356, 0.45392, [1.6901e-07], [1.7342e-07], [1.6943e-07], [1.711e-07], [64523], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7029257402860175e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929119585, 0.45366, [1.6925e-07], [1.7076e-07], [1.6988e-07], [1.7071e-07], [64840], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001029433349322062], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929119815, 0.44297, [0.0010255], [0.0010321], [0.0010274], [0.0010301], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014356697169465146], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929120035, 0.43558, [0.0014312], [0.0014429], [0.0014338], [0.0014394], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014150416882330319], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929120252, 0.44498, [0.0014119], [0.0014206], [0.0014127], [0.0014172], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1404079408120664e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929120475, 0.45216, [1.1347e-07], [1.1506e-07], [1.1361e-07], [1.1444e-07], [95443], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1443809598085704e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929120701, 0.45489, [1.1399e-07], [1.149e-07], [1.1439e-07], [1.1467e-07], [95745], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1409922493678854e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929120929, 0.45508, [1.1383e-07], [1.1421e-07], [1.1406e-07], [1.1418e-07], [95989], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929114929, 0.061891], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929114991, 0.061595], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929115052, 0.061577], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0027333021243975963], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929121156, 0.44115, [0.0027268], [0.0027483], [0.0027288], [0.0027398], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0018545936666972314], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929121374, 0.44863, [0.0018451], [0.0018652], [0.0018506], [0.0018572], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006624596562687657], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929121595, 0.43908, [0.00065986], [0.00066608], [0.00066138], [0.00066306], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005470712632431011], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929121816, 0.44171, [0.00054432], [0.0005528], [0.00054458], [0.00054816], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8061184237135182e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929122035, 0.44841, [2.8018e-05], [2.8198e-05], [2.8056e-05], [2.8065e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018741521042804315], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929122258, 0.44715, [0.00018649], [0.00018802], [0.00018726], [0.00018763], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2205236956896074e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929122481, 0.44443, [4.2101e-05], [4.2355e-05], [4.2137e-05], [4.2255e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003298904517695548], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929122702, 0.43364, [0.00032901], [0.00033133], [0.00032954], [0.00033032], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003926722694394322], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929122917, 0.43529, [0.00039187], [0.00039371], [0.0003923], [0.00039293], [26], [10]], "benchmarks.TextSuite.time_render": [[4.680221675507437e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929123134, 0.44451, [4.662e-06], [4.6956e-06], [4.6704e-06], [4.6843e-06], [2330], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.536893306080047e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929123359, 0.448, [8.4807e-05], [8.5676e-05], [8.5224e-05], [8.5509e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.379626033534578e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929123585, 0.44541, [3.3681e-05], [3.3922e-05], [3.3742e-05], [3.382e-05], [313], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002797815407550818], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929123806, 0.437, [0.00027888], [0.00028045], [0.0002795], [0.00027998], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001141516221751873], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929124024, 0.43956, [0.0011405], [0.0011435], [0.0011408], [0.0011423], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001525812431022392], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929124242, 0.44277, [0.0015221], [0.0015345], [0.0015229], [0.0015302], [7], [10]]}, "durations": {"": 1.9917261600494385}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/7d00fa83-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/7d00fa83-virtualenv-py3.10.json new file mode 100644 index 0000000000..2d96625aee --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/7d00fa83-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "7d00fa83f262ae3bd6fa6c27661e0894675900fc", "env_name": "virtualenv-py3.10", "date": 1601133139000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7152168381914458e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928935586, 0.45022, [1.7037e-07], [1.7468e-07], [1.7094e-07], [1.7302e-07], [64611], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7124719806948264e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928935812, 0.42435, [1.7021e-07], [1.7596e-07], [1.7065e-07], [1.7297e-07], [59068], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7004018757994035e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928936025, 0.44922, [1.694e-07], [1.7119e-07], [1.695e-07], [1.7066e-07], [64485], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7023790921083508e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928936249, 0.44529, [1.6892e-07], [1.7351e-07], [1.6959e-07], [1.7213e-07], [64905], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7052329803763258e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928936476, 0.44483, [1.6918e-07], [1.7618e-07], [1.6994e-07], [1.7237e-07], [64791], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7033085957146206e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928936701, 0.43773, [1.6877e-07], [1.7081e-07], [1.6981e-07], [1.7038e-07], [64680], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0009145681820386512], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928936926, 0.42703, [0.00091065], [0.000919], [0.00091292], [0.0009166], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928931372, 0.057696], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013091172495478531], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928937139, 0.43233, [0.0013056], [0.0013171], [0.0013087], [0.0013098], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1448396771341196e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928937361, 0.42008, [1.1412e-07], [1.1601e-07], [1.1422e-07], [1.1476e-07], [87636], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1539506549148682e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928937571, 0.44916, [1.1406e-07], [1.1704e-07], [1.1436e-07], [1.1656e-07], [95693], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1471164977843093e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928937796, 0.43959, [1.1401e-07], [1.1677e-07], [1.1446e-07], [1.1558e-07], [95306], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928932299, 0.05767], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928932357, 0.057931], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928932415, 0.057468], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002859541626094142], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928938012, 0.43849, [0.0028467], [0.0028628], [0.002852], [0.0028608], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001917430582883147], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928938236, 0.4463, [0.0019126], [0.0019259], [0.0019149], [0.0019222], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006689111003652215], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928938458, 0.43736, [0.00066326], [0.00068545], [0.00066453], [0.00068324], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000553631944866437], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928938676, 0.42185, [0.0005489], [0.0005577], [0.00055082], [0.00055466], [18], [10]], "benchmarks.TextSuite.time_divide": [[2.7876415161668826e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928938884, 0.43846, [2.7764e-05], [2.8006e-05], [2.7789e-05], [2.7922e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018746380718719018], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928939102, 0.43805, [0.00018712], [0.00018808], [0.0001874], [0.00018764], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.230848390582844e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928939321, 0.43639, [4.2038e-05], [4.2757e-05], [4.2158e-05], [4.2459e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003381525480841857], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928939537, 0.43111, [0.00033217], [0.00033881], [0.00033273], [0.00033864], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928934224, 0.058127], "benchmarks.TextSuite.time_render": [[4.670490798636853e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928939751, 0.43583, [4.667e-06], [4.6942e-06], [4.6685e-06], [4.6866e-06], [2337], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.537926778516284e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928939972, 0.43947, [8.4675e-05], [8.5659e-05], [8.5186e-05], [8.5463e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.3882745181192426e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928940193, 0.43579, [3.3822e-05], [3.3982e-05], [3.3851e-05], [3.3898e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002802438110528463], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928940410, 0.42857, [0.00027797], [0.00028093], [0.00027941], [0.00028069], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011615555558819324], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928940624, 0.43524, [0.0011469], [0.0011728], [0.0011496], [0.0011715], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015286369286643875], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928940839, 0.43395, [0.0015273], [0.0015322], [0.0015279], [0.00153], [7], [10]]}, "durations": {"": 1.9654920101165771}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/7d02d29b-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/7d02d29b-virtualenv-py3.10.json new file mode 100644 index 0000000000..3ff3a712b4 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/7d02d29b-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "7d02d29ba887c5c2b0203e0fb7e3c34cf1e14079", "env_name": "virtualenv-py3.10", "date": 1620839897000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7077510481264497e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928318810, 0.45309, [1.6936e-07], [1.7157e-07], [1.707e-07], [1.7092e-07], [64410], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.706749065736248e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928319038, 0.45742, [1.6839e-07], [1.777e-07], [1.7044e-07], [1.7107e-07], [64040], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7087207586668443e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928319267, 0.44896, [1.6999e-07], [1.7179e-07], [1.7071e-07], [1.7138e-07], [64421], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6970038628436962e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928319497, 0.45759, [1.6928e-07], [1.7042e-07], [1.6943e-07], [1.7033e-07], [64463], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.702653902179122e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928319726, 0.45623, [1.6886e-07], [1.7112e-07], [1.6917e-07], [1.7068e-07], [64311], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6978547887025366e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928319953, 0.45391, [1.6856e-07], [1.7095e-07], [1.6965e-07], [1.7017e-07], [64982], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010310937490430661], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928320182, 0.44358, [0.0010281], [0.0010342], [0.0010303], [0.0010327], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014274505010689609], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928320403, 0.45385, [0.0014251], [0.0014358], [0.0014254], [0.001431], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014291428565879221], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928320629, 0.43585, [0.0014252], [0.0014377], [0.0014274], [0.0014305], [7], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1466584996186426e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928320845, 0.45462, [1.1386e-07], [1.1489e-07], [1.1426e-07], [1.1481e-07], [95309], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1440406518055994e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928321073, 0.45606, [1.1405e-07], [1.149e-07], [1.1421e-07], [1.1456e-07], [95471], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1432087586143092e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928321302, 0.45638, [1.1421e-07], [1.1494e-07], [1.1425e-07], [1.146e-07], [96087], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928315316, 0.062295], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928315379, 0.06217], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928315441, 0.061908], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002121429200633429], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928321531, 0.44301, [0.0021103], [0.0021321], [0.0021124], [0.0021268], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012849895647377707], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928321756, 0.44529, [0.0012761], [0.0012971], [0.0012803], [0.0012876], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006609492183997645], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928321977, 0.44011, [0.00065855], [0.00066375], [0.000659], [0.00066209], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005540559474244027], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928322200, 0.43631, [0.00054473], [0.00055554], [0.00054723], [0.00055462], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5303272734231173e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928322419, 0.4549, [2.5237e-05], [2.5439e-05], [2.5239e-05], [2.5395e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001852891554931532], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928322645, 0.4503, [0.00018411], [0.0001862], [0.0001845], [0.00018571], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.348280693866252e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928322871, 0.44136, [4.3388e-05], [4.3622e-05], [4.344e-05], [4.358e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032538104841801067], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928323095, 0.43236, [0.00032391], [0.00032614], [0.00032494], [0.0003257], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003564827583714163], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928323309, 0.4387, [0.00035554], [0.00035729], [0.00035597], [0.00035685], [29], [10]], "benchmarks.TextSuite.time_render": [[4.679865193169243e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928323527, 0.44595, [4.6556e-06], [4.7006e-06], [4.6596e-06], [4.6866e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.495348447468132e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928323754, 0.45365, [8.4525e-05], [8.6103e-05], [8.4707e-05], [8.5316e-05], [129], [10]], "benchmarks.TextSuite.time_split": [[3.518007681978976e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928323983, 0.44174, [3.5117e-05], [3.5323e-05], [3.5155e-05], [3.5208e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002751134869820242], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928324208, 0.442, [0.00027418], [0.00027559], [0.00027491], [0.00027528], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011011437498382294], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928324429, 0.43825, [0.0010993], [0.0011034], [0.0011002], [0.0011017], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014841130718455783], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928324647, 0.43485, [0.0014816], [0.0014891], [0.0014835], [0.0014849], [7], [10]]}, "durations": {"": 2.0028321743011475}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/7e4a2db4-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/7e4a2db4-virtualenv-py3.10.json new file mode 100644 index 0000000000..adae4f767f --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/7e4a2db4-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "7e4a2db4afa29a59ff90d265ad115a225038a5d0", "env_name": "virtualenv-py3.10", "date": 1597915067000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7312274627873389e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928843145, 0.42725, [1.718e-07], [1.7357e-07], [1.7281e-07], [1.733e-07], [59069], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7344319274046708e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928843357, 0.42102, [1.7202e-07], [1.7496e-07], [1.7232e-07], [1.739e-07], [58188], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.777581145458935e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928843566, 0.42961, [1.7185e-07], [1.7928e-07], [1.7674e-07], [1.7828e-07], [58538], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.772104383225627e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928843781, 0.4363, [1.734e-07], [1.8227e-07], [1.7444e-07], [1.7931e-07], [58927], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7272044444259472e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928844001, 0.43276, [1.7104e-07], [1.7416e-07], [1.719e-07], [1.7337e-07], [58999], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7308010152578406e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928844218, 0.44067, [1.6953e-07], [1.752e-07], [1.7148e-07], [1.7371e-07], [64487], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0012555486108693811], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928844434, 0.44469, [0.0012361], [0.0013045], [0.0012413], [0.0012842], [9], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928838944, 0.058717], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0016895034156429272], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928844656, 0.43305, [0.0016802], [0.0017085], [0.001685], [0.0016947], [6], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1612291047267581e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928844871, 0.43274, [1.1511e-07], [1.188e-07], [1.1582e-07], [1.1652e-07], [96550], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1627379717064531e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928845087, 0.43524, [1.1587e-07], [1.1659e-07], [1.1606e-07], [1.164e-07], [96787], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1638364998192817e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928845303, 0.422, [1.1568e-07], [1.1652e-07], [1.1609e-07], [1.1645e-07], [87022], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928839870, 0.057734], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928839928, 0.057605], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928839986, 0.059306], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0022837875003460795], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928845514, 0.43581, [0.0022611], [0.0023101], [0.002267], [0.0022996], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014666101425453754], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928845733, 0.42564, [0.0014631], [0.0014723], [0.0014644], [0.0014681], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006732291677811493], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928845948, 0.43034, [0.00066385], [0.00068119], [0.00066946], [0.00067633], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005628495281497533], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928846161, 0.42767, [0.00054804], [0.00058536], [0.00055807], [0.00056617], [18], [10]], "benchmarks.TextSuite.time_divide": [[2.8208985658150956e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928846371, 0.44365, [2.7865e-05], [2.9148e-05], [2.794e-05], [2.8449e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018850950883668766], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928846594, 0.44194, [0.00018701], [0.00019119], [0.00018714], [0.00019033], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2368358616119776e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928846816, 0.44202, [4.1847e-05], [4.2673e-05], [4.225e-05], [4.2569e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003364388389708174], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928847036, 0.43241, [0.00033108], [0.00033716], [0.00033583], [0.00033691], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928841789, 0.057951], "benchmarks.TextSuite.time_render": [[4.658614678212554e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928847251, 0.43115, [4.6482e-06], [4.7763e-06], [4.6519e-06], [4.6832e-06], [2119], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.536262896541302e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928847469, 0.4424, [8.4729e-05], [8.5824e-05], [8.5276e-05], [8.5483e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.368716559318939e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928847692, 0.43337, [3.3514e-05], [3.4128e-05], [3.3555e-05], [3.38e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002821019191508861], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928847907, 0.43083, [0.00027847], [0.00028576], [0.00027943], [0.00028431], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011662615563384155], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928848121, 0.42793, [0.0011651], [0.0011752], [0.0011655], [0.0011683], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015554523581938285], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928848338, 0.4403, [0.0015541], [0.0015578], [0.0015549], [0.0015561], [7], [10]]}, "durations": {"": 2.0842061042785645}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/7ef7ffee-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/7ef7ffee-virtualenv-py3.10.json new file mode 100644 index 0000000000..3fad19fc4d --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/7ef7ffee-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "7ef7ffeee33f269be0a9c36efad943ac8bd15487", "env_name": "virtualenv-py3.10", "date": 1609437433000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6997115926848885e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929204123, 0.45748, [1.6906e-07], [1.7159e-07], [1.6974e-07], [1.7082e-07], [64319], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.706327780843142e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929204351, 0.45507, [1.6897e-07], [1.7215e-07], [1.7017e-07], [1.7123e-07], [64363], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.707562660580813e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929204579, 0.44674, [1.6962e-07], [1.7201e-07], [1.6994e-07], [1.7098e-07], [64554], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7003118888666897e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929204806, 0.45514, [1.6919e-07], [1.7091e-07], [1.6945e-07], [1.7037e-07], [64286], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7044878890213844e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929205033, 0.45498, [1.7014e-07], [1.7266e-07], [1.7024e-07], [1.7136e-07], [64156], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7011135523638199e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929205260, 0.45723, [1.6903e-07], [1.7123e-07], [1.6939e-07], [1.7038e-07], [64447], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010279999507474711], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929205487, 0.44118, [0.0010227], [0.0010321], [0.0010253], [0.0010298], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014366607148466365], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929205705, 0.43525, [0.0014323], [0.001451], [0.0014361], [0.0014396], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014127708127489313], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929205920, 0.44605, [0.0014089], [0.0014172], [0.0014096], [0.0014134], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1407525987620847e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929206143, 0.45375, [1.1387e-07], [1.1429e-07], [1.1394e-07], [1.1424e-07], [95828], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1432287290079367e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929206370, 0.45274, [1.1392e-07], [1.1498e-07], [1.1413e-07], [1.1467e-07], [95344], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1463674062890038e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929206595, 0.45355, [1.1425e-07], [1.1496e-07], [1.1445e-07], [1.1468e-07], [95385], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929200596, 0.062448], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929200659, 0.061732], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929200721, 0.061748], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.003225901000405429], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929206822, 0.47048, [0.0032218], [0.0032385], [0.0032253], [0.0032281], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.002120674998150207], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929207055, 0.44282, [0.0021002], [0.0021341], [0.0021094], [0.0021281], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006601445311389398], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929207279, 0.44052, [0.00065804], [0.00066373], [0.00065897], [0.00066197], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000546400237669188], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929207500, 0.44218, [0.00054333], [0.00055386], [0.0005453], [0.00054747], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8034559086825592e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929207718, 0.44825, [2.7841e-05], [2.831e-05], [2.7864e-05], [2.8285e-05], [381], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018681578078764703], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929207942, 0.44605, [0.0001861], [0.00018853], [0.00018647], [0.00018714], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.239101994845764e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929208165, 0.43927, [4.2093e-05], [4.244e-05], [4.2172e-05], [4.2416e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003296060604043305], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929208387, 0.45608, [0.00032852], [0.00033145], [0.00032881], [0.00033094], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00039179086497125146], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929208613, 0.43372, [0.0003914], [0.00039339], [0.0003916], [0.00039198], [26], [10]], "benchmarks.TextSuite.time_render": [[4.708054804081965e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929208828, 0.44413, [4.6782e-06], [4.716e-06], [4.7039e-06], [4.7135e-06], [2317], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.508661421800516e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929209053, 0.44699, [8.4722e-05], [8.6361e-05], [8.4774e-05], [8.5719e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.385616983928813e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929209279, 0.44384, [3.3669e-05], [3.3995e-05], [3.3734e-05], [3.389e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027874831072482705], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929209499, 0.43593, [0.00027804], [0.0002805], [0.00027849], [0.00027933], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011445926098127125], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929209716, 0.43905, [0.0011432], [0.0011518], [0.001144], [0.0011452], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015272857147335473], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929209934, 0.4428, [0.0015239], [0.0015356], [0.0015245], [0.0015317], [7], [10]]}, "durations": {"": 1.9905059337615967}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/837b6d7e-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/837b6d7e-virtualenv-py3.10.json new file mode 100644 index 0000000000..58d918a829 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/837b6d7e-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "837b6d7e85254f0047cb41a4cbe0e4b00f54809d", "env_name": "virtualenv-py3.10", "date": 1593800813000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7314400652883433e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928628094, 0.43377, [1.7156e-07], [1.7366e-07], [1.7265e-07], [1.7323e-07], [64761], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7027701335729176e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928628311, 0.45028, [1.6933e-07], [1.7068e-07], [1.6991e-07], [1.7056e-07], [64681], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7082448805436622e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928628535, 0.4374, [1.6882e-07], [1.7336e-07], [1.7015e-07], [1.7289e-07], [64121], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.716318124119509e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928628757, 0.43994, [1.7043e-07], [1.7408e-07], [1.707e-07], [1.7392e-07], [64315], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.731136091072997e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928628981, 0.42481, [1.7236e-07], [1.7422e-07], [1.7288e-07], [1.7371e-07], [58807], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7379118770533637e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928629192, 0.45223, [1.7311e-07], [1.7478e-07], [1.7336e-07], [1.7419e-07], [64285], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022265042032813655], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928629419, 0.43745, [0.0022056], [0.0022521], [0.002208], [0.0022448], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928624370, 0.058751], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928624429, 0.058399], "benchmarks.StyleSuite.time_parse_ansi": [[1.1601193713591404e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928629634, 0.44023, [1.1556e-07], [1.1614e-07], [1.159e-07], [1.1604e-07], [96547], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1387365450129381e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928629859, 0.43791, [1.1344e-07], [1.1448e-07], [1.1376e-07], [1.1429e-07], [96434], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1488108242607518e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928630083, 0.43797, [1.1354e-07], [1.1628e-07], [1.138e-07], [1.1613e-07], [96138], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928625132, 0.058143], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928625190, 0.057854], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928625248, 0.057857], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002100912400055677], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928630306, 0.43308, [0.0020977], [0.0021073], [0.0021003], [0.0021016], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014629047156112002], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928630525, 0.42589, [0.0014545], [0.0014674], [0.0014561], [0.001465], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928625732, 0.058355], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928625790, 0.058843], "benchmarks.TextSuite.time_divide": [[2.778382078357428e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928630740, 0.44048, [2.7731e-05], [2.783e-05], [2.774e-05], [2.7793e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001872054037225449], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928630960, 0.43882, [0.00018586], [0.0001878], [0.00018685], [0.00018744], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.273183603072539e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928631179, 0.44109, [4.2158e-05], [4.3363e-05], [4.227e-05], [4.3173e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.000335991935102239], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928631400, 0.43127, [0.00033443], [0.00033806], [0.00033488], [0.00033686], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928626729, 0.058235], "benchmarks.TextSuite.time_render": [[4.682887363269996e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928631614, 0.4372, [4.6773e-06], [4.6896e-06], [4.681e-06], [4.6848e-06], [2326], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.672292907557296e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928631836, 0.44366, [8.4552e-05], [8.811e-05], [8.6325e-05], [8.7698e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.445008112905341e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928632058, 0.43619, [3.3619e-05], [3.4768e-05], [3.4274e-05], [3.4602e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002822015812853351], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928632274, 0.43194, [0.00027969], [0.00028413], [0.0002807], [0.00028398], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011445162219590405], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928632490, 0.43268, [0.0011387], [0.0011504], [0.001142], [0.0011454], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015336725711157279], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928632704, 0.43729, [0.0015169], [0.0015511], [0.0015199], [0.0015466], [7], [10]]}, "durations": {"": 1.9572207927703857}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/88b07b3e-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/88b07b3e-virtualenv-py3.10.json new file mode 100644 index 0000000000..4e730690a1 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/88b07b3e-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "88b07b3ebc64356e6036bb8a2f33b006af64f7a7", "env_name": "virtualenv-py3.10", "date": 1610705207000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7024395317885234e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929275552, 0.4558, [1.6925e-07], [1.7062e-07], [1.6967e-07], [1.7054e-07], [59618], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7039474633023662e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929275769, 0.45688, [1.6977e-07], [1.707e-07], [1.7021e-07], [1.7051e-07], [64259], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7085925471028554e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929275997, 0.45949, [1.7047e-07], [1.716e-07], [1.7067e-07], [1.713e-07], [63654], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6988362170702758e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929276226, 0.45801, [1.6885e-07], [1.7161e-07], [1.6956e-07], [1.7016e-07], [63835], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.699852078992171e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929276456, 0.45899, [1.691e-07], [1.7179e-07], [1.697e-07], [1.7004e-07], [64392], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7007414558399993e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929276686, 0.46057, [1.6966e-07], [1.709e-07], [1.6978e-07], [1.7068e-07], [64252], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010232624990749173], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929276914, 0.44575, [0.0010199], [0.0010282], [0.0010218], [0.0010261], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014402618565197503], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929277134, 0.43938, [0.0014295], [0.0014576], [0.0014332], [0.0014474], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014254296856961446], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929277353, 0.45935, [0.0014094], [0.0014915], [0.001415], [0.0014579], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1414959633109373e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929277591, 0.45539, [1.1374e-07], [1.1518e-07], [1.1406e-07], [1.1437e-07], [95751], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1459040947674226e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929277820, 0.45661, [1.142e-07], [1.1646e-07], [1.1422e-07], [1.1584e-07], [95759], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1420448083004163e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929278050, 0.45519, [1.137e-07], [1.1515e-07], [1.1399e-07], [1.1464e-07], [95630], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929271990, 0.062413], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929272053, 0.061734], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929272115, 0.061817], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0032390416236012243], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929278278, 0.46664, [0.0032268], [0.0032562], [0.0032348], [0.0032404], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.00213432919990737], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929278514, 0.44632, [0.0021176], [0.0021573], [0.0021264], [0.0021419], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006624570314670564], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929278740, 0.44399, [0.00065892], [0.0006752], [0.00066057], [0.00067112], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005475789473980274], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929278964, 0.44477, [0.00054442], [0.00055428], [0.00054638], [0.00054814], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.785563578661385e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929279184, 0.44793, [2.7741e-05], [2.7975e-05], [2.7784e-05], [2.787e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018819684492913877], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929279408, 0.45633, [0.000187], [0.00019449], [0.00018749], [0.00018916], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.244121055492023e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929279635, 0.44965, [4.2208e-05], [4.386e-05], [4.227e-05], [4.2752e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003306290323493041], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929279855, 0.43765, [0.00032947], [0.00033426], [0.00033029], [0.00033243], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00039268511542244454], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929280072, 0.43942, [0.00039134], [0.00040039], [0.00039235], [0.0003952], [26], [10]], "benchmarks.TextSuite.time_render": [[4.67088127233714e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929280287, 0.45986, [4.6494e-06], [4.7587e-06], [4.6563e-06], [4.6839e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.528571428513036e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929280516, 0.45045, [8.4575e-05], [8.6745e-05], [8.494e-05], [8.629e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.392754973528776e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929280742, 0.44714, [3.3744e-05], [3.4147e-05], [3.3868e-05], [3.4032e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002799898647936061], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929280965, 0.44157, [0.00027838], [0.00028276], [0.00027951], [0.00028074], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001156333332700241], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929281184, 0.43864, [0.0011494], [0.0012274], [0.00115], [0.0011836], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015330029979980153], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929281404, 0.45116, [0.0015266], [0.0015464], [0.0015283], [0.0015362], [7], [10]]}, "durations": {"": 2.0033068656921387}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/8a7f5d82-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/8a7f5d82-virtualenv-py3.10.json new file mode 100644 index 0000000000..86e519b5bf --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/8a7f5d82-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "8a7f5d82ba7bbe108a17bdc75720d11852968aed", "env_name": "virtualenv-py3.10", "date": 1608315995000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6953014842832631e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929175581, 0.45837, [1.6859e-07], [1.7111e-07], [1.6924e-07], [1.7013e-07], [64614], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7055859463819154e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929175811, 0.4559, [1.6873e-07], [1.7156e-07], [1.7018e-07], [1.708e-07], [64605], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.6983904257291298e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929176040, 0.44875, [1.6884e-07], [1.7136e-07], [1.6931e-07], [1.7113e-07], [64837], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7045226080122942e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929176270, 0.45509, [1.6886e-07], [1.7153e-07], [1.6988e-07], [1.7096e-07], [64664], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7083843096820946e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929176500, 0.45395, [1.7e-07], [1.7213e-07], [1.7072e-07], [1.7119e-07], [63852], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7056262349747764e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929176726, 0.45651, [1.6929e-07], [1.7151e-07], [1.7002e-07], [1.7084e-07], [64784], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010255041997879744], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929176955, 0.44675, [0.0010244], [0.0010292], [0.0010247], [0.0010267], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014361369290522166], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929177179, 0.43637, [0.0014333], [0.0014427], [0.0014342], [0.0014383], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014121197491476778], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929177395, 0.447, [0.0014098], [0.001421], [0.0014109], [0.0014151], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1425290498552254e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929177619, 0.45619, [1.1397e-07], [1.1464e-07], [1.1399e-07], [1.1454e-07], [96212], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1409599503140356e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929177848, 0.454, [1.1369e-07], [1.1445e-07], [1.14e-07], [1.1423e-07], [95630], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1446415029047722e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929178076, 0.45409, [1.1422e-07], [1.1472e-07], [1.144e-07], [1.1465e-07], [95440], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929172058, 0.062077], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929172120, 0.062048], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929172183, 0.0617], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.003236182252294384], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929178304, 0.47107, [0.0032297], [0.0032508], [0.0032342], [0.0032376], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0021179625007789584], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929178538, 0.44453, [0.0021047], [0.0021287], [0.0021112], [0.0021221], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006580625004062313], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929178763, 0.43839, [0.00065668], [0.00066048], [0.00065736], [0.00065853], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005475537105475699], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929178985, 0.44479, [0.00054448], [0.00055454], [0.00054663], [0.00054887], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.7875818851161895e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929179207, 0.44904, [2.7843e-05], [2.942e-05], [2.7866e-05], [2.7925e-05], [381], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018679458758254585], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929179430, 0.44714, [0.00018551], [0.00018738], [0.0001863], [0.00018695], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2090219780690065e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929179653, 0.44407, [4.1999e-05], [4.2323e-05], [4.2038e-05], [4.2205e-05], [248], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032867472609429953], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929179874, 0.43478, [0.00032795], [0.00032909], [0.00032818], [0.00032894], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003919551348259959], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929180091, 0.43392, [0.00039115], [0.00039297], [0.00039193], [0.00039203], [26], [10]], "benchmarks.TextSuite.time_render": [[4.666072373758572e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929180306, 0.44691, [4.6561e-06], [4.6793e-06], [4.6635e-06], [4.6687e-06], [2349], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.524071870397165e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929180534, 0.45074, [8.491e-05], [8.5762e-05], [8.5152e-05], [8.5361e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.3787192268601546e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929180761, 0.44501, [3.3666e-05], [3.4061e-05], [3.376e-05], [3.385e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027918186498101095], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929180982, 0.43643, [0.00027714], [0.00028031], [0.00027802], [0.00027992], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011476018892911573], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929181199, 0.44175, [0.001142], [0.0011542], [0.0011425], [0.0011533], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001525970215360368], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929181419, 0.44329, [0.0015241], [0.0015296], [0.0015258], [0.0015279], [7], [10]]}, "durations": {"": 1.9889202117919922}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/8b185610-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/8b185610-virtualenv-py3.10.json new file mode 100644 index 0000000000..420214fe0e --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/8b185610-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "8b185610d336693f2ff08c30157682ba7382d9ee", "env_name": "virtualenv-py3.10", "date": 1594399550000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7168903867823397e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928676356, 0.42605, [1.6868e-07], [1.7356e-07], [1.6987e-07], [1.7322e-07], [59181], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7156599994907917e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928676570, 0.45073, [1.6883e-07], [1.7373e-07], [1.6964e-07], [1.7334e-07], [64303], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.718635833089222e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928676797, 0.42913, [1.7004e-07], [1.7429e-07], [1.704e-07], [1.7331e-07], [64325], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7129236887015558e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928677012, 0.44036, [1.6838e-07], [1.74e-07], [1.6978e-07], [1.7338e-07], [64711], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7331575899968566e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928677228, 0.44188, [1.6939e-07], [1.7654e-07], [1.7198e-07], [1.7369e-07], [64611], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.730976246412862e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928677444, 0.4325, [1.7272e-07], [1.7357e-07], [1.728e-07], [1.7333e-07], [64538], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022552750015165657], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928677659, 0.44322, [0.0022378], [0.0022778], [0.002239], [0.0022725], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928672618, 0.058588], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928672677, 0.058272], "benchmarks.StyleSuite.time_parse_ansi": [[1.1619377396060483e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928677879, 0.42452, [1.1594e-07], [1.1652e-07], [1.1606e-07], [1.1642e-07], [87793], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1637748378131947e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928678091, 0.44074, [1.1421e-07], [1.1725e-07], [1.1488e-07], [1.1682e-07], [95873], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.155181537751077e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928678307, 0.44095, [1.1416e-07], [1.1656e-07], [1.1456e-07], [1.1643e-07], [96041], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928673397, 0.058196], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928673455, 0.057861], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928673513, 0.058665], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002130449903779663], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928678525, 0.43856, [0.0021231], [0.0021428], [0.0021275], [0.0021371], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014712708590585472], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928678747, 0.42785, [0.0014624], [0.0014875], [0.0014652], [0.001481], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928673999, 0.058368], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928674057, 0.058557], "benchmarks.TextSuite.time_divide": [[2.8091873364175325e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928678964, 0.44376, [2.7756e-05], [2.8428e-05], [2.7814e-05], [2.8354e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018709247345676677], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928679187, 0.439, [0.00018632], [0.00018768], [0.00018648], [0.00018735], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.283656973523492e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928679407, 0.43359, [4.2742e-05], [4.3007e-05], [4.2786e-05], [4.2897e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003362728551315564], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928679627, 0.43277, [0.00033497], [0.00033736], [0.00033578], [0.0003365], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928674988, 0.058294], "benchmarks.TextSuite.time_render": [[4.684978898870939e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928679842, 0.43744, [4.6601e-06], [4.7325e-06], [4.6687e-06], [4.705e-06], [2322], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.625716418464435e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928680065, 0.44709, [8.5348e-05], [8.7329e-05], [8.5556e-05], [8.6888e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.4101948380515346e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928680292, 0.43858, [3.3711e-05], [3.456e-05], [3.3737e-05], [3.4476e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.000282641891563135], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928680511, 0.43373, [0.00027884], [0.00028615], [0.00027948], [0.00028494], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011528495573050654], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928680726, 0.43438, [0.0011346], [0.0011632], [0.0011372], [0.0011614], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015347560007025354], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928680939, 0.43682, [0.001515], [0.0015497], [0.0015179], [0.0015489], [7], [10]]}, "durations": {"": 1.964888095855713}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/8b47f338-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/8b47f338-virtualenv-py3.10.json new file mode 100644 index 0000000000..f586b61617 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/8b47f338-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "8b47f338e2b17e0e97c973fb488c6d039cade3a6", "env_name": "virtualenv-py3.10", "date": 1637241388000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.704770948299811e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929498335, 0.46535, [1.6941e-07], [1.7118e-07], [1.6981e-07], [1.7073e-07], [64505], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7028041498662157e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929498566, 0.46247, [1.6948e-07], [1.7149e-07], [1.6998e-07], [1.7051e-07], [64845], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7013318067423483e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929498799, 0.4604, [1.6967e-07], [1.7044e-07], [1.7005e-07], [1.7037e-07], [64480], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7048964461196602e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929499030, 0.46266, [1.6978e-07], [1.7342e-07], [1.7018e-07], [1.7111e-07], [64702], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.710183421980304e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929499262, 0.4644, [1.6905e-07], [1.7343e-07], [1.7023e-07], [1.7189e-07], [64659], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7028929748629222e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929499495, 0.4667, [1.6938e-07], [1.7198e-07], [1.7009e-07], [1.7052e-07], [64686], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001039081248745788], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929499727, 0.44389, [0.0010375], [0.0010456], [0.0010384], [0.0010401], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014347708129207604], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929499952, 0.46215, [0.0014232], [0.0014423], [0.0014295], [0.0014374], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013174009982321877], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929500183, 0.44583, [0.0012999], [0.0013229], [0.0013051], [0.0013205], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.144420922600396e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929500410, 0.46225, [1.1388e-07], [1.1708e-07], [1.1436e-07], [1.1517e-07], [96170], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1470633126258756e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929500642, 0.44546, [1.1391e-07], [1.185e-07], [1.1428e-07], [1.1517e-07], [87568], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1445141108981999e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929500869, 0.46398, [1.1408e-07], [1.1492e-07], [1.1428e-07], [1.1471e-07], [96174], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929494748, 0.066077], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929494814, 0.066052], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929494880, 0.065718], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0022119542001746593], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929501102, 0.45225, [0.0021935], [0.0022166], [0.0022008], [0.0022153], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0013303228770382702], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929501325, 0.45344, [0.0013251], [0.0013386], [0.0013292], [0.0013349], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003806986605923157], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929501556, 0.45671, [0.00038033], [0.00038155], [0.00038042], [0.00038078], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034290322641496575], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929501782, 0.45645, [0.0003397], [0.0003518], [0.00034112], [0.0003484], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5345872369522895e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929502009, 0.4603, [2.5248e-05], [2.5446e-05], [2.5287e-05], [2.5395e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018478592241520127], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929502238, 0.45732, [0.0001843], [0.00019192], [0.0001846], [0.00018495], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3506973496714264e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929502467, 0.44784, [4.342e-05], [4.4112e-05], [4.3461e-05], [4.3614e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032628562926660264], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929502694, 0.43938, [0.00032502], [0.00032752], [0.00032557], [0.00032668], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.000355923844898794], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929502912, 0.44618, [0.00035429], [0.00035689], [0.00035487], [0.00035642], [29], [10]], "benchmarks.TextSuite.time_render": [[4.654723462910036e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929503134, 0.45355, [4.6398e-06], [4.6846e-06], [4.6485e-06], [4.6608e-06], [2327], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.532660635184555e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929503365, 0.45703, [8.4378e-05], [8.6022e-05], [8.5116e-05], [8.5704e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.539265578313332e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929503594, 0.45204, [3.5322e-05], [3.5428e-05], [3.5374e-05], [3.5422e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002751573418591809], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929503825, 0.4488, [0.00027426], [0.00028041], [0.00027456], [0.00027936], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010963458495098165], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929504049, 0.44783, [0.0010906], [0.0011211], [0.001092], [0.0011161], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013667968742083758], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929504272, 0.45775, [0.0013635], [0.0013722], [0.0013649], [0.0013686], [8], [10]]}, "durations": {"": 1.9783689975738525}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/911d305f-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/911d305f-virtualenv-py3.10.json new file mode 100644 index 0000000000..964846052e --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/911d305f-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "911d305fe718d989a5d3606c8e0cdf5db97bf8fe", "env_name": "virtualenv-py3.10", "date": 1592142712000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [null, [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928519164, 0.05889], "benchmarks.ColorSuite.time_downgrade_to_standard": [null, [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928519223, 0.058991], "benchmarks.ColorSuite.time_downgrade_to_windows": [null, [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928519282, 0.058612], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [null, [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928519341, 0.058286], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [null, [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928519400, 0.057999], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [null, [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928519458, 0.058387], "benchmarks.PrettySuite.time_pretty": [null, [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928519516, 0.057659], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928519574, 0.057636], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928519631, 0.057999], "benchmarks.StyleSuite.time_parse_ansi": [null, [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928519690, 0.058697], "benchmarks.StyleSuite.time_parse_hex": [null, [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928519748, 0.060165], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [null, [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928519809, 0.057682], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928519866, 0.058021], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928519924, 0.05799], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928519982, 0.05768], "benchmarks.TableSuite.time_table_heavy_wrapping": [null, [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928520040, 0.058119], "benchmarks.TableSuite.time_table_no_wrapping": [null, [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928520098, 0.059722], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928520158, 0.058841], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928520217, 0.057828], "benchmarks.TextSuite.time_divide": [null, [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928520275, 0.058048], "benchmarks.TextSuite.time_divide_unicode_heavy": [null, [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928520333, 0.057758], "benchmarks.TextSuite.time_fit": [null, [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928520391, 0.05827], "benchmarks.TextSuite.time_fit_unicode_heavy": [null, [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928520449, 0.057695], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928520507, 0.057978], "benchmarks.TextSuite.time_render": [null, [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928520565, 0.057817], "benchmarks.TextSuite.time_render_unicode_heavy": [null, [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928520623, 0.057796], "benchmarks.TextSuite.time_split": [null, [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928520681, 0.05822], "benchmarks.TextSuite.time_split_unicode_heavy": [null, [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928520739, 0.057887], "benchmarks.TextSuite.time_wrapping": [null, [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928520797, 0.05788], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [null, [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928520855, 0.057894]}, "durations": {"": 1.9719171524047852}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/932e26b6-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/932e26b6-virtualenv-py3.10.json new file mode 100644 index 0000000000..a383d78389 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/932e26b6-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "932e26b6508ccc10469a091f5e629dee8f2c124b", "env_name": "virtualenv-py3.10", "date": 1594142083000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7375078801034093e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928652230, 0.42456, [1.7282e-07], [1.7517e-07], [1.7355e-07], [1.7453e-07], [58370], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7232673024938964e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928652441, 0.42474, [1.7162e-07], [1.7374e-07], [1.7202e-07], [1.7317e-07], [59113], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7179807855122533e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928652652, 0.43885, [1.6901e-07], [1.7767e-07], [1.7004e-07], [1.7416e-07], [64119], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.738748867612897e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928652874, 0.42584, [1.7288e-07], [1.7448e-07], [1.7346e-07], [1.7405e-07], [58579], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7205797626414604e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928653085, 0.44103, [1.6998e-07], [1.7542e-07], [1.7083e-07], [1.7433e-07], [64328], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7357968707662575e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928653301, 0.44615, [1.6884e-07], [1.7752e-07], [1.7302e-07], [1.7394e-07], [64314], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022556415991857644], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928653529, 0.44268, [0.0022447], [0.0022682], [0.0022478], [0.0022604], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928648504, 0.058183], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928648562, 0.058728], "benchmarks.StyleSuite.time_parse_ansi": [[1.1636780299431053e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928653747, 0.42378, [1.1596e-07], [1.1654e-07], [1.1619e-07], [1.1651e-07], [87415], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1610518087156556e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928653959, 0.42607, [1.1602e-07], [1.1714e-07], [1.1605e-07], [1.1639e-07], [87825], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1519156793616148e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928654172, 0.44173, [1.1384e-07], [1.1696e-07], [1.1411e-07], [1.165e-07], [96420], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928649271, 0.058128], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928649329, 0.058031], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928649387, 0.057526], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021029166993685065], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928654389, 0.43446, [0.0020978], [0.0021154], [0.0020997], [0.0021052], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014632678544980343], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928654609, 0.42624, [0.0014495], [0.0014684], [0.0014525], [0.0014662], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928649870, 0.058305], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928649929, 0.05829], "benchmarks.TextSuite.time_divide": [[2.779296494252351e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928654825, 0.44419, [2.7688e-05], [2.8234e-05], [2.7726e-05], [2.8139e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019048204332397414], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928655048, 0.43886, [0.00018928], [0.00019078], [0.00019018], [0.00019067], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.241432530345418e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928655273, 0.44251, [4.2136e-05], [4.3417e-05], [4.2318e-05], [4.2513e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003329099516474432], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928655494, 0.43602, [0.00032839], [0.000338], [0.00032894], [0.000337], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928650860, 0.058311], "benchmarks.TextSuite.time_render": [[4.727717685895485e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928655715, 0.44039, [4.6884e-06], [4.7761e-06], [4.6927e-06], [4.7662e-06], [2329], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.719368349829892e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928655940, 0.44761, [8.6326e-05], [8.8197e-05], [8.68e-05], [8.7318e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.4062033638549154e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928656165, 0.43906, [3.3642e-05], [3.4534e-05], [3.3693e-05], [3.4464e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028500112160612405], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928656385, 0.43557, [0.00028298], [0.00028643], [0.0002842], [0.00028562], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011527013880873306], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928656602, 0.43383, [0.0011354], [0.0011624], [0.0011386], [0.0011614], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015521250004115117], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928656818, 0.4409, [0.0015454], [0.0015612], [0.0015494], [0.0015548], [7], [10]]}, "durations": {"": 1.9519822597503662}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/949e1f72-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/949e1f72-virtualenv-py3.10.json new file mode 100644 index 0000000000..f21df2e97f --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/949e1f72-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "949e1f72fb9f2f90abb18cbdef47609a24febdb7", "env_name": "virtualenv-py3.10", "date": 1607775158000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7029757551577644e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929147028, 0.45655, [1.6968e-07], [1.7081e-07], [1.7003e-07], [1.7045e-07], [64550], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7129334648886068e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929147257, 0.45789, [1.7057e-07], [1.7384e-07], [1.7095e-07], [1.7286e-07], [64175], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7037231874163812e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929147485, 0.45818, [1.6941e-07], [1.733e-07], [1.6993e-07], [1.7098e-07], [64097], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7019146784158564e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929147713, 0.45524, [1.6928e-07], [1.7084e-07], [1.6971e-07], [1.7038e-07], [64123], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7040813538765309e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929147941, 0.45569, [1.697e-07], [1.7467e-07], [1.7002e-07], [1.7059e-07], [63784], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7041177953576877e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929148168, 0.45847, [1.697e-07], [1.712e-07], [1.7006e-07], [1.7062e-07], [64356], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010309937002602964], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929148396, 0.44574, [0.0010281], [0.0010354], [0.0010298], [0.0010314], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014440446414352793], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929148618, 0.43949, [0.0014396], [0.0014538], [0.001441], [0.001446], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014179766258166637], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929148836, 0.44533, [0.0014117], [0.0014268], [0.0014147], [0.0014216], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1481544149288418e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929149061, 0.45295, [1.1427e-07], [1.1543e-07], [1.1445e-07], [1.1495e-07], [94829], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1436803517864134e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929149288, 0.45272, [1.1379e-07], [1.1477e-07], [1.1416e-07], [1.1451e-07], [95120], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1455043607759289e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929149514, 0.45456, [1.1413e-07], [1.152e-07], [1.1445e-07], [1.1475e-07], [95309], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929143508, 0.061859], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929143570, 0.061879], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929143632, 0.061608], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002748364622675581], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929149742, 0.45106, [0.0027357], [0.0027663], [0.0027416], [0.0027589], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0018719340005191043], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929149962, 0.44157, [0.0018634], [0.0018768], [0.0018703], [0.0018723], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006610716236536973], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929150185, 0.44031, [0.00065694], [0.0006701], [0.00065804], [0.00066623], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005484835526562835], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929150409, 0.44485, [0.00054418], [0.00055302], [0.00054563], [0.00055031], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.786643714436783e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929150628, 0.4467, [2.7809e-05], [2.795e-05], [2.7834e-05], [2.7885e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001872562192658191], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929150851, 0.44655, [0.00018629], [0.00018763], [0.000187], [0.00018742], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.215380280098666e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929151074, 0.44672, [4.2108e-05], [4.2228e-05], [4.2135e-05], [4.219e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003298608874413936], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929151296, 0.43489, [0.00032922], [0.00033071], [0.00032967], [0.00033], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003935088081142077], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929151512, 0.43634, [0.00039083], [0.00039563], [0.00039177], [0.00039506], [26], [10]], "benchmarks.TextSuite.time_render": [[4.689375974753977e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929151728, 0.4435, [4.6454e-06], [4.7239e-06], [4.6508e-06], [4.7204e-06], [2310], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.544791398890084e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929151952, 0.45091, [8.4735e-05], [8.6213e-05], [8.532e-05], [8.5682e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.376495670892883e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929152179, 0.44394, [3.3636e-05], [3.3927e-05], [3.37e-05], [3.3829e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002801216213737388], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929152401, 0.43747, [0.00027783], [0.00028155], [0.0002787], [0.00028053], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001147650444181636], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929152618, 0.44158, [0.0011449], [0.0011499], [0.0011466], [0.0011488], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015247916432729524], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929152837, 0.44279, [0.0015232], [0.0015308], [0.001524], [0.001526], [7], [10]]}, "durations": {"": 1.9965839385986328}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/95d8bf98-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/95d8bf98-virtualenv-py3.10.json new file mode 100644 index 0000000000..c9cb5bc562 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/95d8bf98-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "95d8bf9841d0f7f467d87e347d1620a054b9eee6", "env_name": "virtualenv-py3.10", "date": 1591521223000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [null, [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928504190, 0.060062], "benchmarks.ColorSuite.time_downgrade_to_standard": [null, [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928504251, 0.058234], "benchmarks.ColorSuite.time_downgrade_to_windows": [null, [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928504309, 0.05794], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [null, [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928504367, 0.057871], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [null, [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928504425, 0.057688], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [null, [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928504483, 0.058], "benchmarks.PrettySuite.time_pretty": [null, [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928504541, 0.058312], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928504599, 0.058035], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928504657, 0.058021], "benchmarks.StyleSuite.time_parse_ansi": [null, [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928504715, 0.059098], "benchmarks.StyleSuite.time_parse_hex": [null, [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928504774, 0.059978], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [null, [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928504835, 0.063138], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928504898, 0.060041], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928504958, 0.058854], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928505017, 0.058735], "benchmarks.TableSuite.time_table_heavy_wrapping": [null, [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928505076, 0.059871], "benchmarks.TableSuite.time_table_no_wrapping": [null, [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928505136, 0.058193], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928505194, 0.058021], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928505252, 0.05804], "benchmarks.TextSuite.time_divide": [null, [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928505310, 0.057805], "benchmarks.TextSuite.time_divide_unicode_heavy": [null, [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928505368, 0.058285], "benchmarks.TextSuite.time_fit": [null, [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928505426, 0.057829], "benchmarks.TextSuite.time_fit_unicode_heavy": [null, [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928505484, 0.057966], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928505542, 0.058825], "benchmarks.TextSuite.time_render": [null, [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928505601, 0.058993], "benchmarks.TextSuite.time_render_unicode_heavy": [null, [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928505660, 0.058045], "benchmarks.TextSuite.time_split": [null, [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928505718, 0.057868], "benchmarks.TextSuite.time_split_unicode_heavy": [null, [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928505776, 0.057619], "benchmarks.TextSuite.time_wrapping": [null, [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928505834, 0.058251], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [null, [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928505892, 0.057668]}, "durations": {"": 2.12862491607666}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/96ea5fed-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/96ea5fed-virtualenv-py3.10.json new file mode 100644 index 0000000000..d7a93d49cf --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/96ea5fed-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "96ea5feddfa8130ca8e961ab772dfdbb836cb3fa", "env_name": "virtualenv-py3.10", "date": 1598372847000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7316030840513793e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928856427, 0.42741, [1.7267e-07], [1.7448e-07], [1.7288e-07], [1.7347e-07], [58952], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7276608421838726e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928856639, 0.4259, [1.7187e-07], [1.743e-07], [1.7218e-07], [1.7377e-07], [58923], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7196527954547122e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928856852, 0.43995, [1.6886e-07], [1.7405e-07], [1.7053e-07], [1.7321e-07], [64443], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7357961115949515e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928857076, 0.43478, [1.6868e-07], [1.7463e-07], [1.7103e-07], [1.7398e-07], [64809], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7308621182496977e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928857291, 0.43332, [1.717e-07], [1.744e-07], [1.7214e-07], [1.7368e-07], [58623], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7374265166264073e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928857511, 0.42335, [1.7291e-07], [1.7402e-07], [1.7341e-07], [1.7396e-07], [58652], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001097102051426191], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928857721, 0.43139, [0.0010913], [0.0011045], [0.0010954], [0.001099], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928852181, 0.058487], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.001493163641758396], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928857937, 0.43031, [0.0014892], [0.0015001], [0.0014917], [0.0014972], [7], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1650578665402596e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928858156, 0.42528, [1.161e-07], [1.1773e-07], [1.1645e-07], [1.1664e-07], [87616], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1636110488428678e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928858369, 0.44929, [1.1598e-07], [1.1696e-07], [1.1628e-07], [1.1656e-07], [94647], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1662411426497627e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928858593, 0.42483, [1.1595e-07], [1.2152e-07], [1.164e-07], [1.1852e-07], [86956], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928853102, 0.059031], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928853162, 0.057906], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928853219, 0.057841], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0030062344994803425], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928858805, 0.45159, [0.0029959], [0.003032], [0.0030028], [0.0030158], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0019549964999896474], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928859036, 0.4454, [0.0019383], [0.0019804], [0.0019503], [0.0019601], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006746847328031435], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928859261, 0.42948, [0.00067265], [0.00068436], [0.00067422], [0.0006759], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005672357365256175], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928859472, 0.43532, [0.00055666], [0.00057062], [0.00056009], [0.00056754], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8418685870028115e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928859694, 0.44721, [2.8232e-05], [2.8618e-05], [2.8245e-05], [2.8555e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001885252192886056], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928859918, 0.44345, [0.00018577], [0.00019176], [0.00018654], [0.00019079], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.254158431510759e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928860137, 0.44786, [4.194e-05], [4.3131e-05], [4.2003e-05], [4.3078e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003303958388466028], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928860354, 0.42865, [0.00032919], [0.00033584], [0.00032968], [0.00033251], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928855047, 0.05887], "benchmarks.TextSuite.time_render": [[4.739229232535885e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928860567, 0.44225, [4.6743e-06], [4.8503e-06], [4.6821e-06], [4.7958e-06], [2323], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.498502347720205e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928860790, 0.44589, [8.4331e-05], [8.5831e-05], [8.4775e-05], [8.5298e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.433012977602163e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928861012, 0.44415, [3.41e-05], [3.4515e-05], [3.4156e-05], [3.4444e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028185135129574885], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928861231, 0.43494, [0.00027825], [0.00028467], [0.00027917], [0.00028441], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011610370565904304], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928861446, 0.43957, [0.0011431], [0.0011705], [0.0011456], [0.0011688], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015498154992071378], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928861673, 0.44193, [0.0015472], [0.0015531], [0.0015492], [0.0015514], [7], [10]]}, "durations": {"": 2.083641767501831}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/972dedff-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/972dedff-virtualenv-py3.10.json new file mode 100644 index 0000000000..ce18b94a9f --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/972dedff-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "972dedff546a60642db36831dbb8aaab19077a2c", "env_name": "virtualenv-py3.10", "date": 1644350984000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6966378869754063e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928495086, 0.46992, [1.6874e-07], [1.7064e-07], [1.6945e-07], [1.7023e-07], [64687], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7017139318109407e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928495321, 0.45793, [1.6932e-07], [1.7182e-07], [1.6983e-07], [1.703e-07], [64740], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7002950434441852e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928495556, 0.46019, [1.6913e-07], [1.7472e-07], [1.6977e-07], [1.7424e-07], [64312], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7467250773761525e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928495790, 0.45191, [1.7185e-07], [1.7663e-07], [1.7369e-07], [1.7497e-07], [60206], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7190822590057033e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928496014, 0.46004, [1.6948e-07], [1.7801e-07], [1.7119e-07], [1.7264e-07], [64735], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7009651108030483e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928496250, 0.4653, [1.6952e-07], [1.7196e-07], [1.6986e-07], [1.707e-07], [64319], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011247847222774806], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928496482, 0.44639, [0.001112], [0.0011365], [0.0011158], [0.0011325], [9], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015590207850826637], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928496704, 0.4506, [0.0015551], [0.0015745], [0.0015573], [0.0015604], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014094245016167406], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928496927, 0.45541, [0.0014043], [0.0014183], [0.0014068], [0.0014121], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.15377114080549e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928497155, 0.46082, [1.1383e-07], [1.1643e-07], [1.1402e-07], [1.1641e-07], [96374], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1530580833173779e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928497380, 0.4676, [1.1424e-07], [1.1631e-07], [1.1452e-07], [1.1606e-07], [95519], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1414555468820137e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928497613, 0.43722, [1.1394e-07], [1.1443e-07], [1.1403e-07], [1.1429e-07], [87802], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [[0.00856696874689078], [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928497832, 0.52107, [0.0085105], [0.0085887], [0.0085325], [0.0085761], [2], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [[0.008623926994914655], [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928498093, 0.52342, [0.0084933], [0.008741], [0.0085369], [0.0087188], [2], [10]], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [[0.0085112914966885], [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928498357, 0.52026, [0.0084441], [0.0085937], [0.0084911], [0.0085498], [2], [10]], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0018723436684619323], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928498617, 0.46144, [0.0018687], [0.0018865], [0.0018704], [0.0018784], [6], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001163543945747531], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928498844, 0.45098, [0.0011545], [0.0011705], [0.0011583], [0.0011655], [9], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003731056432505804], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928499071, 0.45304, [0.00036918], [0.0003779], [0.00036939], [0.00037736], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003431505324589389], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928499294, 0.45801, [0.00033954], [0.00035455], [0.00034024], [0.00034843], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5219379093086475e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928499521, 0.48708, [2.5129e-05], [2.5432e-05], [2.5169e-05], [2.5248e-05], [430], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001847848450716842], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928499751, 0.45863, [0.00018368], [0.00018612], [0.00018468], [0.00018542], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.354522359317047e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928499980, 0.45059, [4.3406e-05], [4.3589e-05], [4.3499e-05], [4.3567e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003285789090582649], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928500208, 0.46249, [0.00032374], [0.00033239], [0.00032437], [0.00033095], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00036147917201341095], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928500440, 0.45334, [0.00035645], [0.00036522], [0.0003572], [0.00036511], [29], [10]], "benchmarks.TextSuite.time_render": [[4.6709620594807475e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928500664, 0.45489, [4.6603e-06], [4.6945e-06], [4.6672e-06], [4.6786e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.508430858000793e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928500895, 0.46037, [8.4182e-05], [8.555e-05], [8.4551e-05], [8.528e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.515611525153282e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928501126, 0.45158, [3.5113e-05], [3.5189e-05], [3.5147e-05], [3.5168e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002742062053398397], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928501356, 0.45824, [0.00027279], [0.00027536], [0.00027397], [0.00027449], [39], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001361679685942363], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928501585, 0.45899, [0.0013561], [0.0013646], [0.0013591], [0.0013633], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014518333607286746], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928501817, 0.44956, [0.0014478], [0.0014776], [0.0014492], [0.0014702], [7], [10]]}, "durations": {"": 1.9903857707977295}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/99831099-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/99831099-virtualenv-py3.10.json new file mode 100644 index 0000000000..fe9ca7d510 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/99831099-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "99831099bddeb1fc133dc17deb3743f0a6eeeabd", "env_name": "virtualenv-py3.10", "date": 1638115235000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6982679175346359e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929411358, 0.4647, [1.6906e-07], [1.7112e-07], [1.6956e-07], [1.7051e-07], [64561], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.706459781564628e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929411589, 0.46668, [1.6944e-07], [1.7227e-07], [1.6994e-07], [1.7091e-07], [64359], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7064087511396272e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929411824, 0.44285, [1.6919e-07], [1.7259e-07], [1.703e-07], [1.7147e-07], [58843], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7012664847376487e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929412045, 0.46681, [1.6876e-07], [1.7083e-07], [1.6977e-07], [1.7042e-07], [64367], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7029855906558936e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929412279, 0.44022, [1.687e-07], [1.7099e-07], [1.6991e-07], [1.706e-07], [59129], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7017031937624742e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929412500, 0.44931, [1.683e-07], [1.7164e-07], [1.6926e-07], [1.7109e-07], [61097], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011088145998655818], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929412725, 0.45704, [0.0011029], [0.001145], [0.0011059], [0.0011133], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015167499285390867], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929412951, 0.45188, [0.0015075], [0.0015242], [0.0015143], [0.0015202], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013967474369565025], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929413181, 0.45271, [0.0013941], [0.0014128], [0.0013961], [0.0013988], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1438807979086921e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929413407, 0.46603, [1.1408e-07], [1.1454e-07], [1.1426e-07], [1.1447e-07], [96350], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1441311339866706e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929413641, 0.45787, [1.1415e-07], [1.1478e-07], [1.1421e-07], [1.1447e-07], [96505], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1426662973699961e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929413875, 0.4625, [1.1388e-07], [1.1447e-07], [1.1409e-07], [1.1438e-07], [95582], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929407766, 0.066034], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929407832, 0.065672], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929407898, 0.070778], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002354537500650622], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929414107, 0.46527, [0.0023322], [0.0023688], [0.0023464], [0.0023621], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001406848936312599], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929414342, 0.45461, [0.0013948], [0.0014186], [0.0014015], [0.0014138], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037511310750103027], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929414571, 0.452, [0.00036923], [0.00038161], [0.0003696], [0.00038101], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00033897580672806547], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929414798, 0.45278, [0.0003382], [0.00034913], [0.00033863], [0.00033953], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5416714819191904e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929415024, 0.45998, [2.5256e-05], [2.5557e-05], [2.5292e-05], [2.5498e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018457614627048568], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929415253, 0.45621, [0.00018413], [0.00018542], [0.00018451], [0.00018495], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.359315854839875e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929415482, 0.45154, [4.341e-05], [4.4443e-05], [4.3421e-05], [4.3797e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003251639671713835], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929415712, 0.44338, [0.00032456], [0.00032633], [0.0003251], [0.00032562], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035597701709524823], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929415931, 0.44762, [0.00035452], [0.00035662], [0.00035576], [0.00035616], [29], [10]], "benchmarks.TextSuite.time_render": [[4.6830586492034534e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929416153, 0.45532, [4.6658e-06], [4.7253e-06], [4.678e-06], [4.6892e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.519799996251754e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929416385, 0.45802, [8.4782e-05], [8.5324e-05], [8.5154e-05], [8.5293e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.5137730366032985e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929416615, 0.4508, [3.5055e-05], [3.5293e-05], [3.5131e-05], [3.5204e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027435251295652335], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929416846, 0.44989, [0.0002739], [0.00027633], [0.00027395], [0.00027475], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013601067494164454], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929417070, 0.4556, [0.0013565], [0.0013641], [0.0013585], [0.0013618], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.00144711607260563], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929417301, 0.44477, [0.001445], [0.0014551], [0.0014462], [0.0014513], [7], [10]]}, "durations": {"": 1.9822556972503662}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/9a4fbf83-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/9a4fbf83-virtualenv-py3.10.json new file mode 100644 index 0000000000..568bd0a564 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/9a4fbf83-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "9a4fbf83c5051eaf94a88996292c438c895306d5", "env_name": "virtualenv-py3.10", "date": 1595437545000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7386930548873132e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928739952, 0.45265, [1.7111e-07], [1.7619e-07], [1.7318e-07], [1.7463e-07], [63637], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7230044321104053e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928740177, 0.44588, [1.6995e-07], [1.7494e-07], [1.7036e-07], [1.7383e-07], [62521], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.72545012648743e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928740397, 0.44363, [1.695e-07], [1.759e-07], [1.7023e-07], [1.7427e-07], [62227], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7037679203746364e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928740615, 0.44989, [1.6957e-07], [1.7424e-07], [1.6983e-07], [1.7327e-07], [64452], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.737208866830249e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928740839, 0.43956, [1.6957e-07], [1.7818e-07], [1.7001e-07], [1.7405e-07], [64524], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7139659365246047e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928741057, 0.45054, [1.6827e-07], [1.7392e-07], [1.6965e-07], [1.7337e-07], [64972], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0021915999008342625], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928741282, 0.43506, [0.0021855], [0.0022052], [0.0021888], [0.0021949], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928735895, 0.062236], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928735957, 0.06095], "benchmarks.StyleSuite.time_parse_ansi": [[1.1658293135745944e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928741497, 0.42647, [1.1614e-07], [1.1683e-07], [1.1638e-07], [1.1675e-07], [87476], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1498905654465906e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928741709, 0.43337, [1.1385e-07], [1.1637e-07], [1.1408e-07], [1.1618e-07], [87677], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.145625050099677e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928741928, 0.44186, [1.14e-07], [1.1499e-07], [1.1421e-07], [1.1496e-07], [96016], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928736665, 0.060719], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928736726, 0.058912], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928736785, 0.058785], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.00213501249672845], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928742152, 0.44067, [0.0020952], [0.0021407], [0.0021285], [0.0021365], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001505148786236532], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928742376, 0.43714, [0.0014974], [0.0015108], [0.0015001], [0.0015081], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.000671309699343207], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928742598, 0.43843, [0.00065785], [0.0006777], [0.00066951], [0.00067533], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005592442232429878], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928742818, 0.42836, [0.0005557], [0.00056451], [0.00055711], [0.00056129], [18], [10]], "benchmarks.TextSuite.time_divide": [[2.8101753942839998e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928743030, 0.43291, [2.7832e-05], [2.8438e-05], [2.7841e-05], [2.839e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018889364033831252], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928743250, 0.44454, [0.00018637], [0.0001921], [0.00018701], [0.0001909], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2501335963606834e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928743471, 0.43217, [4.2014e-05], [4.3025e-05], [4.2117e-05], [4.295e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003339798549272781], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928743690, 0.43164, [0.0003302], [0.00033798], [0.00033052], [0.00033699], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928738581, 0.059351], "benchmarks.TextSuite.time_render": [[4.728479212368737e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928743904, 0.43175, [4.6732e-06], [4.7967e-06], [4.6806e-06], [4.7775e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.626853532476834e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928744120, 0.44458, [8.5439e-05], [8.705e-05], [8.5642e-05], [8.6704e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.386980897866033e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928744345, 0.4354, [3.3638e-05], [3.3934e-05], [3.3678e-05], [3.391e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002787044052368131], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928744562, 0.42997, [0.00027754], [0.00027963], [0.0002786], [0.00027892], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001163493056083098], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928744776, 0.4368, [0.0011444], [0.0011821], [0.0011587], [0.0011653], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001542642856033386], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928744993, 0.44139, [0.0015144], [0.0015682], [0.0015177], [0.0015639], [7], [10]]}, "durations": {"": 2.0578808784484863}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/9abc0292-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/9abc0292-virtualenv-py3.10.json new file mode 100644 index 0000000000..a68ea29c55 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/9abc0292-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "9abc0292c1f96433e4f87b10d5dea0d617b0ab23", "env_name": "virtualenv-py3.10", "date": 1597074281000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7436755900738068e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928830015, 0.43858, [1.7219e-07], [1.9119e-07], [1.7358e-07], [1.8241e-07], [58543], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7281580510216833e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928830235, 0.45154, [1.7127e-07], [1.76e-07], [1.7158e-07], [1.7382e-07], [62214], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7408680274644608e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928830455, 0.43516, [1.7292e-07], [1.8035e-07], [1.7353e-07], [1.7709e-07], [59854], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7334309856629754e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928830671, 0.45819, [1.7233e-07], [1.7734e-07], [1.7275e-07], [1.7519e-07], [63301], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.726152067704983e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928830903, 0.45786, [1.6992e-07], [1.7717e-07], [1.7109e-07], [1.7322e-07], [63629], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7279195024118287e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928831134, 0.43673, [1.697e-07], [1.7473e-07], [1.7052e-07], [1.7368e-07], [64946], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0013254479381430428], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928831351, 0.4335, [0.0013162], [0.0013434], [0.0013177], [0.0013398], [8], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928825940, 0.058209], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928825998, 0.057693], "benchmarks.StyleSuite.time_parse_ansi": [[1.1619074018194943e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928831567, 0.45128, [1.146e-07], [1.1696e-07], [1.16e-07], [1.1642e-07], [95735], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1617918764174161e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928831793, 0.4337, [1.147e-07], [1.1718e-07], [1.1571e-07], [1.1632e-07], [96226], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1625632190902994e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928832012, 0.4454, [1.1471e-07], [1.1751e-07], [1.1619e-07], [1.1638e-07], [96646], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928826725, 0.058334], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928826784, 0.057861], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928826842, 0.057589], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023085165972588583], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928832229, 0.44221, [0.0023022], [0.002314], [0.0023044], [0.002309], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014938482158218644], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928832452, 0.43078, [0.0014653], [0.0015017], [0.0014732], [0.0014962], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006769309684386826], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928832670, 0.44257, [0.00067313], [0.00069285], [0.00067405], [0.00068539], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000564776638283446], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928832897, 0.43519, [0.00055025], [0.00057366], [0.00056426], [0.00056881], [18], [10]], "benchmarks.TextSuite.time_divide": [[2.8389237465098558e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928833117, 0.44553, [2.8336e-05], [2.841e-05], [2.8386e-05], [2.8393e-05], [379], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019049086825505488], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928833338, 0.44401, [0.00018818], [0.00019159], [0.00018865], [0.00019092], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.248857458737949e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928833559, 0.43865, [4.1986e-05], [4.3156e-05], [4.2111e-05], [4.3017e-05], [248], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033843211290772045], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928833779, 0.43836, [0.00033167], [0.00035884], [0.00033615], [0.00033982], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928828651, 0.063001], "benchmarks.TextSuite.time_render": [[4.777508618050992e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928833997, 0.4336, [4.7379e-06], [4.8187e-06], [4.751e-06], [4.8037e-06], [2322], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.65903406018584e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928834215, 0.42096, [8.5511e-05], [8.7115e-05], [8.6415e-05], [8.6664e-05], [116], [10]], "benchmarks.TextSuite.time_split": [[3.43698573907694e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928834428, 0.44215, [3.4307e-05], [3.4539e-05], [3.432e-05], [3.4417e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002845039463765617], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928834648, 0.43493, [0.00028015], [0.00029144], [0.00028329], [0.00028692], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011678935002742542], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928834866, 0.43851, [0.001162], [0.0011697], [0.0011639], [0.0011683], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015627648577459954], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928835084, 0.42995, [0.0015509], [0.0015655], [0.0015528], [0.0015645], [7], [10]]}, "durations": {"": 2.013007164001465}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/9f2a426e-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/9f2a426e-virtualenv-py3.10.json new file mode 100644 index 0000000000..b50271a036 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/9f2a426e-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "9f2a426ea7b27e9ef41bb08bff7b0481d4755aa6", "env_name": "virtualenv-py3.10", "date": 1603122075000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7051829723035e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928975704, 0.45428, [1.693e-07], [1.7101e-07], [1.6986e-07], [1.7082e-07], [64518], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7051761587887072e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928975930, 0.46355, [1.6948e-07], [1.7215e-07], [1.6979e-07], [1.7076e-07], [65168], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.709415406481479e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928976171, 0.45347, [1.7005e-07], [1.7176e-07], [1.7036e-07], [1.7125e-07], [64344], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7059708729575333e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928976397, 0.45258, [1.6983e-07], [1.7114e-07], [1.6995e-07], [1.7092e-07], [64550], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.703384136445452e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928976624, 0.45418, [1.6833e-07], [1.7615e-07], [1.7024e-07], [1.7078e-07], [64235], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7177979153814433e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928976850, 0.45908, [1.7044e-07], [1.7848e-07], [1.7136e-07], [1.7486e-07], [64112], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010149916502996347], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928977080, 0.43868, [0.0010119], [0.0010181], [0.0010128], [0.0010166], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928971420, 0.060655], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014040807491255691], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928977300, 0.44256, [0.0013988], [0.0014065], [0.0014005], [0.0014055], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1532585875856004e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928977521, 0.45513, [1.1431e-07], [1.158e-07], [1.1448e-07], [1.1559e-07], [96195], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1603592188811979e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928977749, 0.45409, [1.1362e-07], [1.167e-07], [1.1585e-07], [1.1627e-07], [96473], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1415330291053145e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928977978, 0.45153, [1.1392e-07], [1.1481e-07], [1.141e-07], [1.1423e-07], [96554], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928972379, 0.060603], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928972440, 0.060561], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928972501, 0.060786], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002737713624810567], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928978205, 0.43842, [0.0027315], [0.0027451], [0.0027353], [0.0027411], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0018642640012937286], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928978422, 0.45057, [0.0018511], [0.0018769], [0.0018549], [0.0018688], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006623398439842276], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928978646, 0.43926, [0.00065982], [0.00067771], [0.00066149], [0.00066308], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005538772108449944], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928978870, 0.43759, [0.0005478], [0.00055745], [0.00055289], [0.00055427], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.804970606462419e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928979094, 0.44976, [2.7928e-05], [2.8551e-05], [2.7933e-05], [2.8397e-05], [381], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018746636857956713], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928979321, 0.44782, [0.0001871], [0.00018883], [0.00018734], [0.00018771], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2384543824399195e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928979547, 0.44542, [4.2257e-05], [4.2464e-05], [4.237e-05], [4.2415e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003300188062337017], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928979769, 0.43135, [0.00032851], [0.00033092], [0.00032977], [0.00033058], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928974326, 0.060808], "benchmarks.TextSuite.time_render": [[4.699827059279202e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928979983, 0.43533, [4.6639e-06], [4.7512e-06], [4.6833e-06], [4.7404e-06], [2339], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.536799998637434e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928980202, 0.44936, [8.4795e-05], [8.5609e-05], [8.507e-05], [8.5445e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.391292790556923e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928980429, 0.44202, [3.3827e-05], [3.41e-05], [3.3843e-05], [3.4002e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028034289189727624], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928980649, 0.43415, [0.00027901], [0.00028106], [0.00027971], [0.00028047], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011459815011928892], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928980866, 0.43887, [0.001144], [0.001169], [0.001145], [0.0011484], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015235238575509618], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928981084, 0.43962, [0.0015199], [0.0015304], [0.001521], [0.0015274], [7], [10]]}, "durations": {"": 1.9609119892120361}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/a27a3ee2-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/a27a3ee2-virtualenv-py3.10.json new file mode 100644 index 0000000000..6cbcf721ad --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/a27a3ee2-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "a27a3ee20bff6c6aa0642f31fb736e72d16abbce", "env_name": "virtualenv-py3.10", "date": 1600101858000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7042800680936237e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928909229, 0.42891, [1.6948e-07], [1.7485e-07], [1.7001e-07], [1.7153e-07], [64527], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7180735607927396e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928909443, 0.43918, [1.6933e-07], [1.7368e-07], [1.7038e-07], [1.7321e-07], [64518], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.717659715346583e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928909659, 0.42738, [1.6846e-07], [1.734e-07], [1.6999e-07], [1.7322e-07], [64490], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.737773394621508e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928909873, 0.43312, [1.7368e-07], [1.741e-07], [1.7373e-07], [1.7393e-07], [64504], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7345675113671666e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928910088, 0.42318, [1.724e-07], [1.7388e-07], [1.7312e-07], [1.7368e-07], [58799], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7281638282229994e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928910299, 0.42297, [1.715e-07], [1.736e-07], [1.7232e-07], [1.734e-07], [59044], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011325370562392184], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928910509, 0.42988, [0.0011302], [0.0011429], [0.0011322], [0.0011335], [9], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928905022, 0.057851], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0015301667133046848], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928910722, 0.43497, [0.0015273], [0.0015373], [0.0015285], [0.0015313], [7], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1514082085278366e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928910943, 0.43922, [1.1388e-07], [1.1636e-07], [1.1418e-07], [1.1629e-07], [96321], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.148777592758897e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928911167, 0.44638, [1.144e-07], [1.1545e-07], [1.1446e-07], [1.1538e-07], [95312], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1430559190946105e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928911391, 0.44827, [1.1411e-07], [1.1458e-07], [1.1427e-07], [1.1436e-07], [96462], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928905957, 0.057415], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928906014, 0.057183], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928906072, 0.057108], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0030256926220317837], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928911616, 0.45324, [0.0030176], [0.0030308], [0.0030228], [0.0030281], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001963548582959144], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928911846, 0.44673, [0.0019601], [0.0020088], [0.0019621], [0.0019669], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006744960937794531], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928912074, 0.43447, [0.00067075], [0.00067785], [0.00067261], [0.0006755], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005577971314778551], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928912294, 0.43981, [0.00055435], [0.00056808], [0.00055484], [0.00055944], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.844203366817173e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928912514, 0.43454, [2.8263e-05], [2.8525e-05], [2.8334e-05], [2.8503e-05], [386], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019038999105983398], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928912736, 0.44125, [0.00018992], [0.00019128], [0.00019023], [0.0001911], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.279382467275463e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928912956, 0.43349, [4.2366e-05], [4.3206e-05], [4.2775e-05], [4.2928e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033351546763667775], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928913178, 0.42827, [0.00033053], [0.00033667], [0.0003312], [0.0003356], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928907867, 0.057792], "benchmarks.TextSuite.time_render": [[4.679437361052641e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928913392, 0.43419, [4.66e-06], [4.7068e-06], [4.6688e-06], [4.7015e-06], [2323], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.515022648225568e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928913612, 0.44249, [8.4387e-05], [8.599e-05], [8.5056e-05], [8.5285e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.3680288489006504e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928913834, 0.4347, [3.3615e-05], [3.4087e-05], [3.3652e-05], [3.3837e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002821311893451304], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928914050, 0.43042, [0.00027872], [0.00028469], [0.00027904], [0.00028425], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011427662215687127], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928914265, 0.43025, [0.0011399], [0.0011449], [0.0011416], [0.0011444], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015367023567835402], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928914478, 0.43563, [0.0015217], [0.0015512], [0.0015235], [0.0015504], [7], [10]]}, "durations": {"": 1.9690570831298828}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/a6d1d784-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/a6d1d784-virtualenv-py3.10.json new file mode 100644 index 0000000000..774c3c94f3 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/a6d1d784-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "a6d1d784879fe939cd9c262d9b2f25a673ce88c9", "env_name": "virtualenv-py3.10", "date": 1638115443000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.693641204731282e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929367764, 0.46266, [1.6873e-07], [1.7074e-07], [1.69e-07], [1.6981e-07], [64513], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7028117153496322e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929367995, 0.45723, [1.6951e-07], [1.7192e-07], [1.6977e-07], [1.7154e-07], [64843], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7094650969542762e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929368229, 0.46035, [1.6947e-07], [1.7956e-07], [1.7021e-07], [1.7948e-07], [64021], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.702568146514439e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929368461, 0.44046, [1.6985e-07], [1.7068e-07], [1.7013e-07], [1.7055e-07], [59358], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.702479761820018e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929368681, 0.46671, [1.6968e-07], [1.7882e-07], [1.6997e-07], [1.7147e-07], [64234], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6955152081863054e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929368913, 0.46156, [1.6816e-07], [1.7047e-07], [1.6899e-07], [1.6997e-07], [65168], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001111442111626578], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929369147, 0.44229, [0.0011071], [0.0011155], [0.0011092], [0.0011131], [9], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015210982861130365], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929369368, 0.45264, [0.0015103], [0.0015274], [0.0015192], [0.0015228], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014059401237318525], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929369598, 0.4546, [0.0014008], [0.0014107], [0.0014018], [0.001407], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.152333821686819e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929369823, 0.44698, [1.1407e-07], [1.1656e-07], [1.1484e-07], [1.1631e-07], [86564], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1524275221005641e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929370052, 0.44112, [1.1338e-07], [1.1696e-07], [1.1372e-07], [1.1677e-07], [85855], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1440585883210438e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929370275, 0.46163, [1.1379e-07], [1.1472e-07], [1.1427e-07], [1.1459e-07], [95086], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929364174, 0.068449], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929364243, 0.066985], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929364310, 0.066614], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023555874009616676], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929370506, 0.46066, [0.0023453], [0.0023707], [0.0023519], [0.00236], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001407257812388707], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929370741, 0.45093, [0.0014003], [0.0014115], [0.0014025], [0.0014098], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00038124766703091426], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929370968, 0.45235, [0.00036827], [0.00038583], [0.00036968], [0.0003839], [27], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003428434030220453], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929371195, 0.45595, [0.00033961], [0.00035342], [0.00034035], [0.00035196], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.545662413365415e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929371422, 0.46099, [2.5421e-05], [2.5591e-05], [2.5437e-05], [2.5505e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018464798280359087], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929371653, 0.4549, [0.00018372], [0.00018503], [0.00018448], [0.00018482], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.341412396917907e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929371880, 0.44664, [4.3359e-05], [4.36e-05], [4.3363e-05], [4.3447e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003247979850240165], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929372107, 0.45621, [0.00032323], [0.00032554], [0.00032421], [0.00032509], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003560538617452478], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929372333, 0.4457, [0.00035422], [0.00035843], [0.00035561], [0.00035645], [29], [10]], "benchmarks.TextSuite.time_render": [[4.68243460391974e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929372555, 0.45353, [4.6678e-06], [4.708e-06], [4.6728e-06], [4.6874e-06], [2332], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.542684113061735e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929372785, 0.46289, [8.4381e-05], [9.2768e-05], [8.4666e-05], [8.5745e-05], [129], [10]], "benchmarks.TextSuite.time_split": [[3.5212895430828403e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929373019, 0.45, [3.5156e-05], [3.5402e-05], [3.5192e-05], [3.5231e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002742187502199637], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929373248, 0.44813, [0.00027246], [0.00027636], [0.00027312], [0.00027488], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.00135714318639657], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929373471, 0.45506, [0.0013541], [0.0013627], [0.0013552], [0.0013592], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014486667142981397], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929373701, 0.44424, [0.0014465], [0.0014527], [0.001448], [0.0014514], [7], [10]]}, "durations": {"": 2.0430939197540283}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/a81230bc-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/a81230bc-virtualenv-py3.10.json new file mode 100644 index 0000000000..7be9e6e7b3 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/a81230bc-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "a81230bcff8e66a6e16522a0ab9186416d615f09", "env_name": "virtualenv-py3.10", "date": 1621440919000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7089820134849163e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928347340, 0.45862, [1.7e-07], [1.7457e-07], [1.7038e-07], [1.7177e-07], [64166], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7021133058504719e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928347569, 0.44902, [1.696e-07], [1.7089e-07], [1.6974e-07], [1.706e-07], [64851], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7093464614946301e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928347799, 0.43832, [1.6961e-07], [1.7247e-07], [1.7055e-07], [1.7112e-07], [60333], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.708929539256602e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928348018, 0.45747, [1.6953e-07], [1.7288e-07], [1.7004e-07], [1.7116e-07], [64374], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7095533240400798e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928348248, 0.45705, [1.6957e-07], [1.7225e-07], [1.7007e-07], [1.7169e-07], [64006], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7013976745683384e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928348476, 0.45399, [1.7002e-07], [1.7076e-07], [1.701e-07], [1.7062e-07], [63806], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010306896001566201], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928348703, 0.44456, [0.0010285], [0.0010362], [0.0010301], [0.0010322], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001427216124284314], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928348925, 0.45429, [0.0014229], [0.0014321], [0.0014246], [0.0014298], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014342976418057723], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928349151, 0.43711, [0.0014271], [0.0014412], [0.0014308], [0.0014379], [7], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1472595696275204e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928349368, 0.45598, [1.1421e-07], [1.1517e-07], [1.1438e-07], [1.1482e-07], [95828], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1479176945339659e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928349597, 0.45676, [1.1441e-07], [1.1687e-07], [1.1472e-07], [1.1508e-07], [95752], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.146414121082228e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928349826, 0.45598, [1.1409e-07], [1.1498e-07], [1.1449e-07], [1.1481e-07], [95593], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928343833, 0.063079], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928343896, 0.062244], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928343958, 0.062379], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002125933303614147], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928350055, 0.44442, [0.0021152], [0.0021442], [0.002121], [0.0021357], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001284916625081678], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928350280, 0.44527, [0.0012786], [0.0012955], [0.0012825], [0.00129], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006593489679289632], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928350502, 0.43857, [0.0006576], [0.00066139], [0.00065902], [0.00065983], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005478475795825943], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928350724, 0.44481, [0.00054467], [0.00055428], [0.00054712], [0.00054821], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5265698322256757e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928350945, 0.45124, [2.5191e-05], [2.537e-05], [2.5224e-05], [2.5303e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018454670674239833], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928351169, 0.44915, [0.00018408], [0.00018504], [0.0001844], [0.00018485], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3587735771273485e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928351394, 0.44117, [4.3434e-05], [4.3712e-05], [4.3511e-05], [4.3678e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032423104593445635], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928351617, 0.45005, [0.00032311], [0.00032504], [0.00032386], [0.00032476], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035670832760937123], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928351841, 0.43927, [0.00035589], [0.00035784], [0.00035626], [0.00035733], [29], [10]], "benchmarks.TextSuite.time_render": [[4.675652580225816e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928352059, 0.44572, [4.6561e-06], [4.7094e-06], [4.6589e-06], [4.6924e-06], [2330], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.618554682016111e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928352285, 0.45317, [8.456e-05], [8.6489e-05], [8.6002e-05], [8.6316e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5144470565879314e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928352514, 0.44139, [3.5063e-05], [3.5388e-05], [3.5078e-05], [3.5229e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027454221019165983], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928352738, 0.44116, [0.00027362], [0.00027615], [0.00027384], [0.00027542], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010963437511236408], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928352959, 0.43727, [0.0010932], [0.0010995], [0.0010945], [0.0010984], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014880772858824848], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928353177, 0.4356, [0.0014842], [0.001494], [0.0014856], [0.0014912], [7], [10]]}, "durations": {"": 1.9775969982147217}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/aaea99f7-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/aaea99f7-virtualenv-py3.10.json new file mode 100644 index 0000000000..f14bca4dbb --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/aaea99f7-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "aaea99f764bcd48a12fd09e5b53efd2bafd9281d", "env_name": "virtualenv-py3.10", "date": 1613822412000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7035946231118903e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929032498, 0.45811, [1.6948e-07], [1.7147e-07], [1.701e-07], [1.7055e-07], [64698], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7005740944381448e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929032727, 0.45645, [1.6892e-07], [1.712e-07], [1.6964e-07], [1.7091e-07], [64397], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.6961856813956265e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929032955, 0.45848, [1.6895e-07], [1.7124e-07], [1.6924e-07], [1.702e-07], [64697], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7039711889193895e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929033184, 0.45721, [1.6908e-07], [1.707e-07], [1.6999e-07], [1.7052e-07], [64419], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.710571628402691e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929033413, 0.45837, [1.6945e-07], [1.7495e-07], [1.7003e-07], [1.7149e-07], [64054], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.708411568939796e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929033640, 0.43101, [1.7029e-07], [1.7254e-07], [1.7071e-07], [1.7122e-07], [59074], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010266583500197156], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929033856, 0.44167, [0.0010232], [0.0010299], [0.0010262], [0.0010291], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014252031251089647], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929034075, 0.4615, [0.0014176], [0.0014349], [0.0014196], [0.0014259], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014211224388418486], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929034299, 0.44766, [0.0014098], [0.0014256], [0.0014148], [0.0014221], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.138836964717925e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929034524, 0.45651, [1.1352e-07], [1.1451e-07], [1.1381e-07], [1.1396e-07], [96360], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1403014810501425e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929034753, 0.45591, [1.1371e-07], [1.1484e-07], [1.1378e-07], [1.142e-07], [96374], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1407160758650121e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929034982, 0.45675, [1.1373e-07], [1.147e-07], [1.1401e-07], [1.1419e-07], [96589], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929028981, 0.061856], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929029043, 0.061734], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929029105, 0.061513], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0032523646259505767], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929035211, 0.46727, [0.0032449], [0.0032725], [0.0032476], [0.0032594], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.002136987398262136], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929035447, 0.43601, [0.0021279], [0.0021504], [0.002132], [0.0021421], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006721614681737265], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929035663, 0.4419, [0.00065748], [0.00068076], [0.00065921], [0.00067391], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005539429992878516], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929035889, 0.44698, [0.00054715], [0.00055713], [0.0005492], [0.0005551], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5422931233603327e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929036111, 0.44501, [2.5357e-05], [2.575e-05], [2.5395e-05], [2.5453e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001846386467463915], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929036338, 0.45035, [0.00018376], [0.00018493], [0.00018456], [0.00018488], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3481876030166796e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929036562, 0.43963, [4.3443e-05], [4.3648e-05], [4.346e-05], [4.3548e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.000324092166424221], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929036786, 0.44884, [0.0003231], [0.00032853], [0.00032364], [0.00032525], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003891874819398961], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929037009, 0.44444, [0.00038819], [0.0003903], [0.00038851], [0.00038941], [27], [10]], "benchmarks.TextSuite.time_render": [[4.667558423783678e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929037230, 0.44597, [4.6504e-06], [4.6887e-06], [4.6572e-06], [4.6793e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.518782431110594e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929037456, 0.45257, [8.4762e-05], [8.5916e-05], [8.5165e-05], [8.5228e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5262270256030014e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929037683, 0.44676, [3.5062e-05], [3.5386e-05], [3.5127e-05], [3.5343e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002739638025798884], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929037911, 0.44074, [0.00027237], [0.00027468], [0.0002733], [0.00027416], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001097691699396819], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929038130, 0.44915, [0.0010951], [0.0011009], [0.0010968], [0.0010992], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014937857132671134], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929038358, 0.43867, [0.0014845], [0.0015002], [0.0014882], [0.0014994], [7], [10]]}, "durations": {"": 1.9741952419281006}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/ac1a33da-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/ac1a33da-virtualenv-py3.10.json new file mode 100644 index 0000000000..6a34ddbf04 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/ac1a33da-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "ac1a33da175972f895e894121df609d0cb1448fe", "env_name": "virtualenv-py3.10", "date": 1636301366000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7055549280694258e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928202672, 0.4663, [1.7013e-07], [1.7073e-07], [1.7032e-07], [1.7064e-07], [64576], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7031432603515683e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928202904, 0.45468, [1.6951e-07], [1.7082e-07], [1.6996e-07], [1.7049e-07], [64659], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7019480119984683e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928203138, 0.45417, [1.6919e-07], [1.7198e-07], [1.6968e-07], [1.7063e-07], [64399], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7046419165111376e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928203370, 0.46493, [1.6904e-07], [1.7262e-07], [1.6947e-07], [1.7156e-07], [64203], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6996182278878235e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928203602, 0.4653, [1.6973e-07], [1.7054e-07], [1.6985e-07], [1.7013e-07], [64476], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7035111172927143e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928203835, 0.46646, [1.6925e-07], [1.7059e-07], [1.7011e-07], [1.7038e-07], [64545], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010278916495735759], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928204069, 0.45261, [0.0010256], [0.0010317], [0.0010275], [0.0010283], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014257812490541255], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928204294, 0.4625, [0.0014199], [0.0014303], [0.0014227], [0.0014282], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013062031248409767], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928204524, 0.44475, [0.0012951], [0.0013184], [0.0013016], [0.001311], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.140761227710675e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928204750, 0.4639, [1.1362e-07], [1.1469e-07], [1.1396e-07], [1.1454e-07], [96423], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1431385233683782e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928204982, 0.46453, [1.137e-07], [1.155e-07], [1.1399e-07], [1.1478e-07], [96367], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1405374051054004e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928205215, 0.43433, [1.1363e-07], [1.1545e-07], [1.1393e-07], [1.1418e-07], [87764], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928199111, 0.066393], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928199178, 0.065317], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928199243, 0.065764], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021228875033557416], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928205432, 0.45023, [0.0021096], [0.0021335], [0.0021166], [0.0021325], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012783515630871989], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928205660, 0.44969, [0.0012736], [0.0012911], [0.0012762], [0.0012803], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037327826794353314], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928205884, 0.44954, [0.00036982], [0.00037671], [0.00037034], [0.00037575], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003444326503085904], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928206106, 0.44373, [0.00033653], [0.00035535], [0.00033847], [0.00034547], [30], [10]], "benchmarks.TextSuite.time_divide": [[2.525865081146688e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928206325, 0.45105, [2.5184e-05], [2.5635e-05], [2.5192e-05], [2.5311e-05], [431], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018414331887093983], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928206555, 0.4542, [0.0001836], [0.00018511], [0.00018411], [0.00018432], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.462133887249228e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928206782, 0.44513, [4.4237e-05], [4.4688e-05], [4.4356e-05], [4.4651e-05], [239], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032451075845352944], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928207007, 0.43806, [0.00032392], [0.00032553], [0.00032405], [0.00032477], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003554676549011392], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928207225, 0.44502, [0.00035469], [0.00035578], [0.00035515], [0.00035563], [29], [10]], "benchmarks.TextSuite.time_render": [[4.663124727711817e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928207446, 0.45325, [4.652e-06], [4.6689e-06], [4.656e-06], [4.6658e-06], [2341], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.480436326863128e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928207677, 0.45763, [8.4385e-05], [8.5518e-05], [8.449e-05], [8.5311e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.614149831044769e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928207907, 0.44961, [3.6062e-05], [3.6293e-05], [3.612e-05], [3.6185e-05], [298], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002741100384483639], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928208135, 0.45469, [0.00027323], [0.00027512], [0.00027334], [0.00027444], [39], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011020895515684971], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928208362, 0.44548, [0.0011001], [0.0011044], [0.0011011], [0.0011024], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013700364997930592], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928208584, 0.44717, [0.0013585], [0.0013829], [0.0013604], [0.0013801], [8], [10]]}, "durations": {"": 2.0034019947052}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/aca0b60b-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/aca0b60b-virtualenv-py3.10.json new file mode 100644 index 0000000000..2149629b03 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/aca0b60b-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "aca0b60b22fae4c6e16cec7615c2e7c00f73e44d", "env_name": "virtualenv-py3.10", "date": 1610557278000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6979068882969545e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929261153, 0.45869, [1.692e-07], [1.7053e-07], [1.6942e-07], [1.7042e-07], [64600], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7020309905146757e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929261381, 0.45617, [1.6895e-07], [1.7099e-07], [1.6948e-07], [1.7042e-07], [64407], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.705886511498212e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929261609, 0.45585, [1.6981e-07], [1.7164e-07], [1.7036e-07], [1.7076e-07], [63823], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.703659859609806e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929261836, 0.45617, [1.6927e-07], [1.7076e-07], [1.6999e-07], [1.7067e-07], [64691], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.704958673588024e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929262066, 0.45714, [1.6901e-07], [1.7978e-07], [1.6968e-07], [1.7486e-07], [64363], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6980670332693827e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929262293, 0.45681, [1.689e-07], [1.7111e-07], [1.6963e-07], [1.7049e-07], [64463], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010281833514454775], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929262522, 0.44339, [0.0010218], [0.0010329], [0.0010269], [0.0010292], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014339881433573154], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929262742, 0.43562, [0.0014306], [0.0014466], [0.0014326], [0.0014363], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014138098758849083], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929262958, 0.44435, [0.0014093], [0.0014185], [0.0014117], [0.001417], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1401449880373922e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929263181, 0.45645, [1.1387e-07], [1.1445e-07], [1.1392e-07], [1.1421e-07], [95939], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1443270225171499e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929263411, 0.45604, [1.1387e-07], [1.1499e-07], [1.1415e-07], [1.1463e-07], [95568], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1406076018727822e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929263640, 0.45291, [1.1364e-07], [1.1429e-07], [1.139e-07], [1.1415e-07], [95103], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929257617, 0.063062], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929257680, 0.062193], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929257743, 0.062107], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.003231895749195246], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929263867, 0.47303, [0.0032274], [0.0032412], [0.0032312], [0.0032359], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.00212119999632705], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929264102, 0.4479, [0.0021128], [0.0021326], [0.0021166], [0.0021248], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006615611873712623], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929264332, 0.44166, [0.00066031], [0.0006646], [0.00066088], [0.00066344], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000546990130954471], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929264556, 0.44545, [0.00054453], [0.00055482], [0.00054522], [0.00054746], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8134737607254584e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929264778, 0.45325, [2.7757e-05], [2.8699e-05], [2.7795e-05], [2.8536e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018772002633277065], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929265006, 0.44781, [0.0001871], [0.00018804], [0.00018724], [0.00018801], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.241892768268335e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929265229, 0.44642, [4.2121e-05], [4.2643e-05], [4.2294e-05], [4.256e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033005645109956424], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929265451, 0.43617, [0.00032916], [0.00033341], [0.00032984], [0.00033081], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003927091350375961], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929265668, 0.4359, [0.00039106], [0.00040295], [0.00039214], [0.00039385], [26], [10]], "benchmarks.TextSuite.time_render": [[4.700245483344387e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929265885, 0.44808, [4.6844e-06], [4.7747e-06], [4.6901e-06], [4.707e-06], [2326], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.508284383879072e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929266114, 0.45134, [8.4051e-05], [8.5437e-05], [8.4758e-05], [8.5298e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.381015594758189e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929266341, 0.44531, [3.3708e-05], [3.3933e-05], [3.3794e-05], [3.39e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002796486349669411], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929266563, 0.43816, [0.00027817], [0.00028029], [0.00027899], [0.00028003], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011550139445009539], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929266781, 0.44439, [0.0011491], [0.0011623], [0.0011497], [0.0011609], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015380804273133564], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929267003, 0.44982, [0.0015263], [0.0016385], [0.0015297], [0.0015829], [7], [10]]}, "durations": {"": 1.9768939018249512}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/ad6e3dea-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/ad6e3dea-virtualenv-py3.10.json new file mode 100644 index 0000000000..e1c80e0ae8 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/ad6e3dea-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "ad6e3dea2dfe549a309ae602164a6dc7540f3c05", "env_name": "virtualenv-py3.10", "date": 1638117333000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7166836254051273e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929353186, 0.46998, [1.7069e-07], [1.7348e-07], [1.7139e-07], [1.7207e-07], [64474], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.707324738468546e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929353422, 0.46564, [1.6994e-07], [1.7235e-07], [1.7037e-07], [1.7184e-07], [64732], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7161118860790375e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929353655, 0.45741, [1.7007e-07], [1.7974e-07], [1.705e-07], [1.7178e-07], [64440], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7128570427507506e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929353880, 0.46379, [1.6983e-07], [1.7205e-07], [1.7045e-07], [1.7161e-07], [64033], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7106433715715202e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929354112, 0.46647, [1.6997e-07], [1.7178e-07], [1.7035e-07], [1.7124e-07], [64916], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7102998742249e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929354346, 0.46544, [1.6975e-07], [1.7176e-07], [1.7055e-07], [1.7154e-07], [64477], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011044375496567227], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929354579, 0.46642, [0.0011009], [0.0011078], [0.0011033], [0.0011057], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001517199428885111], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929354802, 0.45288, [0.0015077], [0.0015347], [0.001514], [0.0015253], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014020651251485106], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929355033, 0.45724, [0.0013925], [0.0014177], [0.0013955], [0.0014041], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1427258234920079e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929355264, 0.46601, [1.1402e-07], [1.1459e-07], [1.142e-07], [1.1434e-07], [96037], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1419825515356431e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929355496, 0.46227, [1.1369e-07], [1.1468e-07], [1.14e-07], [1.1441e-07], [96111], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1511939419719757e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929355729, 0.46656, [1.1397e-07], [1.1595e-07], [1.1405e-07], [1.1567e-07], [95838], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929349589, 0.066147], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929349655, 0.065858], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929349721, 0.065511], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023498082999140026], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929355962, 0.4605, [0.002325], [0.0023617], [0.0023403], [0.0023549], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014064557490200968], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929356196, 0.45041, [0.0013961], [0.0014107], [0.0013998], [0.0014099], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037908333927459486], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929356422, 0.45708, [0.00037676], [0.00038228], [0.00037721], [0.0003807], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034137632258446707], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929356651, 0.45521, [0.00034074], [0.00034201], [0.00034102], [0.00034167], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5464340687057997e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929356878, 0.46274, [2.5285e-05], [2.5611e-05], [2.5328e-05], [2.5575e-05], [430], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018554943208227534], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929357110, 0.46631, [0.00018464], [0.00019381], [0.00018482], [0.00018943], [59], [10]], "benchmarks.TextSuite.time_fit": [[4.3584937243892056e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929357345, 0.45508, [4.3453e-05], [4.3719e-05], [4.3483e-05], [4.3643e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003247758938937984], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929357580, 0.45681, [0.00032376], [0.00032589], [0.00032453], [0.00032519], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003560352071935054], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929357807, 0.44608, [0.00035437], [0.00035714], [0.00035504], [0.00035665], [29], [10]], "benchmarks.TextSuite.time_render": [[4.681095323915653e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929358029, 0.45275, [4.6634e-06], [4.7022e-06], [4.6711e-06], [4.6989e-06], [2329], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.607275378835766e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929358259, 0.46141, [8.5438e-05], [8.7824e-05], [8.5806e-05], [8.6341e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.522174513527478e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929358492, 0.4514, [3.502e-05], [3.5961e-05], [3.5081e-05], [3.5341e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002766790543368237], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929358722, 0.44555, [0.00027452], [0.00027891], [0.00027538], [0.00027792], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013801171880913898], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929358943, 0.46369, [0.0013621], [0.0013958], [0.0013763], [0.0013877], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014559939985961784], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929359178, 0.45188, [0.0014476], [0.0015803], [0.0014507], [0.0015258], [7], [10]]}, "durations": {"": 2.005476951599121}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/b391635e-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/b391635e-virtualenv-py3.10.json new file mode 100644 index 0000000000..5f1e9c9b6b --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/b391635e-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "b391635ee4a325fb96ed531b00e4b55f66909639", "env_name": "virtualenv-py3.10", "date": 1599839230000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7171113977231818e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928896057, 0.4208, [1.6891e-07], [1.7364e-07], [1.6974e-07], [1.733e-07], [59058], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7326176896325207e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928896265, 0.44149, [1.7222e-07], [1.7407e-07], [1.724e-07], [1.7361e-07], [64704], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7326500571829757e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928896481, 0.42514, [1.722e-07], [1.742e-07], [1.7323e-07], [1.7336e-07], [58910], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7424341945248364e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928896692, 0.44518, [1.7185e-07], [1.7549e-07], [1.7362e-07], [1.7535e-07], [62645], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7319663555598585e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928896913, 0.45123, [1.7105e-07], [1.7535e-07], [1.7212e-07], [1.7448e-07], [64322], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7316413064189517e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928897137, 0.44729, [1.7235e-07], [1.7447e-07], [1.7284e-07], [1.7398e-07], [62627], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011370277788955718], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928897358, 0.43163, [0.0011311], [0.0011522], [0.0011326], [0.0011388], [9], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928891817, 0.06109], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0015254762152575754], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928897572, 0.43484, [0.0015008], [0.0015435], [0.0015115], [0.0015373], [7], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1690353489742776e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928897793, 0.441, [1.1616e-07], [1.1735e-07], [1.1657e-07], [1.1727e-07], [92790], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1696400284598351e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928898013, 0.44085, [1.1638e-07], [1.1757e-07], [1.1672e-07], [1.1714e-07], [96244], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.164986364381274e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928898229, 0.43071, [1.1623e-07], [1.1716e-07], [1.1631e-07], [1.1664e-07], [96438], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928892754, 0.057563], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928892811, 0.057408], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928892869, 0.057671], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0030024322513781954], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928898445, 0.45038, [0.0029655], [0.0030357], [0.0029746], [0.0030236], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0019979833014076576], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928898674, 0.44609, [0.0019748], [0.0020109], [0.0019847], [0.0020074], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006732166667158404], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928898886, 0.42553, [0.00067161], [0.00067601], [0.00067253], [0.0006743], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005606853159597928], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928899095, 0.42972, [0.0005544], [0.00056468], [0.00055669], [0.00056445], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8459909917633523e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928899314, 0.44467, [2.7853e-05], [3.1088e-05], [2.8005e-05], [2.8508e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019092872772537368], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928899536, 0.44513, [0.00019008], [0.00019125], [0.00019078], [0.00019102], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2737418028991665e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928899758, 0.44079, [4.2264e-05], [4.3084e-05], [4.2369e-05], [4.3044e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033374933850756214], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928899978, 0.43169, [0.00033055], [0.00033774], [0.00033095], [0.00033693], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928894692, 0.05768], "benchmarks.TextSuite.time_render": [[4.72765888174202e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928900196, 0.43982, [4.6917e-06], [4.7693e-06], [4.6954e-06], [4.7597e-06], [2335], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.674470639865225e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928900421, 0.44408, [8.6065e-05], [8.7558e-05], [8.6628e-05], [8.7371e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.434052237476142e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928900645, 0.44066, [3.4247e-05], [3.457e-05], [3.4281e-05], [3.4382e-05], [313], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002858738652493402], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928900864, 0.43354, [0.00028464], [0.00028642], [0.00028531], [0.00028597], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011589119999876453], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928901080, 0.43463, [0.0011506], [0.0011699], [0.0011509], [0.0011668], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001540008928194376], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928901297, 0.43582, [0.0015223], [0.0015583], [0.0015242], [0.0015552], [7], [10]]}, "durations": {"": 1.9634599685668945}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/b9e0014a-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/b9e0014a-virtualenv-py3.10.json new file mode 100644 index 0000000000..78bc2d38e8 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/b9e0014a-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "b9e0014add85dcbb3c725289955db2e346c84dfb", "env_name": "virtualenv-py3.10", "date": 1616751437000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.6998178342983942e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928116323, 0.44799, [1.6818e-07], [1.7116e-07], [1.6978e-07], [1.7052e-07], [64666], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.70502177501734e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928116553, 0.42977, [1.7013e-07], [1.7116e-07], [1.7031e-07], [1.7065e-07], [59010], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.708060499454652e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928116767, 0.45767, [1.6922e-07], [1.762e-07], [1.6994e-07], [1.712e-07], [64447], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7004442711291243e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928116994, 0.45538, [1.689e-07], [1.71e-07], [1.6962e-07], [1.704e-07], [64139], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.702947773471493e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928117221, 0.46279, [1.6903e-07], [1.7138e-07], [1.698e-07], [1.709e-07], [65105], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7016582945508121e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928117451, 0.45508, [1.6871e-07], [1.712e-07], [1.697e-07], [1.7088e-07], [64319], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010140812504687347], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928117678, 0.43782, [0.0010096], [0.001016], [0.0010115], [0.0010144], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014073906259000069], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928117895, 0.44708, [0.0014003], [0.0014124], [0.0014051], [0.0014088], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013990103761898354], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928118118, 0.44505, [0.0013951], [0.0014053], [0.0013976], [0.0014011], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1467188923626322e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928118341, 0.45495, [1.1409e-07], [1.1642e-07], [1.1452e-07], [1.1502e-07], [95867], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1468241056827694e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928118569, 0.44641, [1.1419e-07], [1.1647e-07], [1.145e-07], [1.1622e-07], [96195], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1533843505286693e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928118797, 0.45388, [1.1398e-07], [1.1714e-07], [1.1432e-07], [1.166e-07], [95296], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928112783, 0.06405], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928112847, 0.063369], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928112910, 0.063683], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0020583042001817375], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928119023, 0.43674, [0.0020375], [0.0020835], [0.0020558], [0.0020705], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012585462763025942], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928119243, 0.45369, [0.0012464], [0.001273], [0.0012522], [0.0012689], [9], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006639763664376612], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928119468, 0.44393, [0.00065901], [0.00066992], [0.00066003], [0.00066843], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.000550776316422822], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928119690, 0.44585, [0.00054582], [0.00055971], [0.00054866], [0.00055531], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.592313389588474e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928119910, 0.4457, [2.5675e-05], [2.6046e-05], [2.5705e-05], [2.5967e-05], [422], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018688303488919412], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928120137, 0.44773, [0.00018391], [0.00018843], [0.00018498], [0.00018813], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.362060948446285e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928120358, 0.44746, [4.3169e-05], [4.4233e-05], [4.319e-05], [4.4155e-05], [242], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032757661275325286], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928120578, 0.43624, [0.00032508], [0.00033857], [0.00032604], [0.00033228], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035616805010552826], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928120792, 0.44982, [0.0003548], [0.00035831], [0.00035588], [0.00035735], [30], [10]], "benchmarks.TextSuite.time_render": [[4.678165021476379e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928121015, 0.4452, [4.651e-06], [4.6976e-06], [4.6594e-06], [4.6905e-06], [2330], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.535840231616021e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928121242, 0.4644, [8.4407e-05], [8.5812e-05], [8.5252e-05], [8.56e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5228553957388027e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928121467, 0.44109, [3.5154e-05], [3.5396e-05], [3.5201e-05], [3.5298e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027554385527956153], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928121692, 0.43998, [0.0002732], [0.00027617], [0.00027442], [0.00027572], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010960312516544945], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928121910, 0.44672, [0.0010919], [0.0010989], [0.0010943], [0.0010978], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014901487842767633], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928122138, 0.43597, [0.0014879], [0.0014951], [0.0014892], [0.0014913], [7], [10]]}, "durations": {}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/ba5d0c2c-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/ba5d0c2c-virtualenv-py3.10.json new file mode 100644 index 0000000000..d1199db221 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/ba5d0c2c-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "ba5d0c2cfc35e929022dbe26c2edb4c210cb11ee", "env_name": "virtualenv-py3.10", "date": 1637405586000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7099719111164134e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929469379, 0.46212, [1.7e-07], [1.7237e-07], [1.7059e-07], [1.7156e-07], [64614], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6992863450832084e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929469612, 0.46668, [1.6965e-07], [1.706e-07], [1.6968e-07], [1.7036e-07], [64506], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7590241712395733e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929469847, 0.46733, [1.6986e-07], [1.806e-07], [1.7063e-07], [1.788e-07], [62716], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.70707002050929e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929470083, 0.45427, [1.6823e-07], [1.7291e-07], [1.7007e-07], [1.7193e-07], [64939], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.693035584829865e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929470312, 0.46714, [1.6847e-07], [1.7146e-07], [1.6881e-07], [1.6973e-07], [64691], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7005772273243105e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929470548, 0.46326, [1.6928e-07], [1.7169e-07], [1.6995e-07], [1.7037e-07], [64680], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010359979496570304], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929470779, 0.45233, [0.0010316], [0.0010429], [0.0010329], [0.0010386], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001431943430881282], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929471005, 0.44223, [0.0014292], [0.0014394], [0.0014299], [0.001434], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013096198126731906], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929471224, 0.44682, [0.001304], [0.0013227], [0.0013055], [0.001315], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1422716500932673e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929471453, 0.46259, [1.1321e-07], [1.1439e-07], [1.1366e-07], [1.1431e-07], [96135], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1448200174943257e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929471684, 0.46498, [1.1412e-07], [1.2063e-07], [1.1435e-07], [1.1702e-07], [96010], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1426247877882212e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929471919, 0.45399, [1.1407e-07], [1.1621e-07], [1.1417e-07], [1.1485e-07], [96585], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929465787, 0.065325], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929465852, 0.064656], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929465917, 0.064757], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0022018249990651386], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929472142, 0.44804, [0.0021871], [0.0022209], [0.0021976], [0.0022047], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0013314192492543953], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929472364, 0.4441, [0.0013222], [0.0014545], [0.0013259], [0.0013835], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00038731405543836043], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929472588, 0.4463, [0.0003837], [0.00038774], [0.00038438], [0.00038755], [27], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034269085482528975], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929472808, 0.45312, [0.00033989], [0.00035148], [0.00034092], [0.00034969], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5358665487215255e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929473033, 0.45872, [2.526e-05], [2.553e-05], [2.5311e-05], [2.5471e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001850423876272418], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929473262, 0.45789, [0.00018349], [0.00018715], [0.00018417], [0.00018611], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.378081666800426e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929473490, 0.45569, [4.3516e-05], [4.4552e-05], [4.3555e-05], [4.426e-05], [240], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032770027445944687], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929473715, 0.44077, [0.00032418], [0.00033175], [0.00032457], [0.00032793], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035871982781200446], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929473933, 0.45091, [0.00035736], [0.00037312], [0.0003578], [0.00036066], [29], [10]], "benchmarks.TextSuite.time_render": [[4.662722945550666e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929474156, 0.45536, [4.6424e-06], [4.6853e-06], [4.6601e-06], [4.6774e-06], [2319], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.52210273478704e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929474384, 0.46074, [8.4844e-05], [8.5595e-05], [8.5096e-05], [8.5269e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.511532793402091e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929474616, 0.44927, [3.5022e-05], [3.5207e-05], [3.5058e-05], [3.5169e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002737938683774126], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929474845, 0.44867, [0.00027329], [0.00027608], [0.00027358], [0.00027495], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010997395496815444], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929475068, 0.45672, [0.0010966], [0.0011037], [0.0010976], [0.0011008], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001370867188597913], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929475301, 0.45793, [0.001363], [0.001396], [0.0013674], [0.001374], [8], [10]]}, "durations": {"": 2.0138518810272217}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/bd34e0a1-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/bd34e0a1-virtualenv-py3.10.json new file mode 100644 index 0000000000..dbab786307 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/bd34e0a1-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "bd34e0a1ef8f59700f19277ec30cf0cb5ff01a08", "env_name": "virtualenv-py3.10", "date": 1630249006000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.699839021486255e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928448058, 0.46411, [1.6928e-07], [1.7066e-07], [1.6976e-07], [1.7022e-07], [64543], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7065917911440012e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928448289, 0.46101, [1.6959e-07], [1.7176e-07], [1.7032e-07], [1.7143e-07], [63906], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7027047136842674e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928448519, 0.45347, [1.6933e-07], [1.7085e-07], [1.7008e-07], [1.7056e-07], [62197], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.705627804106428e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928448744, 0.44593, [1.6984e-07], [1.7211e-07], [1.7033e-07], [1.7091e-07], [60616], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.704742747131115e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928448965, 0.46111, [1.6981e-07], [1.736e-07], [1.7015e-07], [1.7185e-07], [64022], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7001839810550803e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928449194, 0.46202, [1.6917e-07], [1.7086e-07], [1.6973e-07], [1.7031e-07], [64463], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001030816650018096], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928449424, 0.44965, [0.0010278], [0.001033], [0.0010292], [0.0010322], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014227369993022876], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928449648, 0.46324, [0.0014192], [0.0014278], [0.0014211], [0.0014265], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013010312486585462], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928449875, 0.44209, [0.0012946], [0.0013369], [0.0012984], [0.0013199], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1713555658106811e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928450099, 0.45425, [1.1411e-07], [1.1791e-07], [1.1594e-07], [1.175e-07], [95901], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1427845266258002e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928450322, 0.462, [1.1387e-07], [1.1492e-07], [1.1404e-07], [1.1434e-07], [96212], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1614896881760536e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928450553, 0.44326, [1.1572e-07], [1.1644e-07], [1.16e-07], [1.1632e-07], [96114], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928444497, 0.065574], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928444563, 0.064713], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928444627, 0.064512], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021352125972043724], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928450775, 0.44949, [0.0021156], [0.0021471], [0.0021243], [0.0021448], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012830364375986392], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928451003, 0.44869, [0.0012772], [0.0012901], [0.0012793], [0.0012865], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003747924108340937], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928451226, 0.44902, [0.00037021], [0.00037966], [0.00037076], [0.00037859], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003422741935918889], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928451448, 0.45319, [0.00034156], [0.00035121], [0.000342], [0.0003429], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.532128905682089e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928451673, 0.45978, [2.5261e-05], [2.5411e-05], [2.5301e-05], [2.535e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001846931525012794], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928451903, 0.45977, [0.00018348], [0.00018552], [0.00018419], [0.00018484], [59], [10]], "benchmarks.TextSuite.time_fit": [[4.347222154426229e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928452133, 0.44653, [4.3403e-05], [4.369e-05], [4.3446e-05], [4.3533e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032489785488935244], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928452361, 0.43679, [0.00032404], [0.00032617], [0.00032458], [0.0003256], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00036011494852698826], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928452579, 0.44723, [0.00035618], [0.00036365], [0.00035723], [0.00036237], [29], [10]], "benchmarks.TextSuite.time_render": [[4.676347421060345e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928452802, 0.44919, [4.6442e-06], [4.6921e-06], [4.6663e-06], [4.6841e-06], [2307], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.474758152972705e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928453031, 0.45763, [8.4345e-05], [8.5664e-05], [8.4437e-05], [8.541e-05], [129], [10]], "benchmarks.TextSuite.time_split": [[3.527678568566267e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928453262, 0.44942, [3.5132e-05], [3.5366e-05], [3.5193e-05], [3.5317e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.000274004381361393], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928453492, 0.44553, [0.00027321], [0.00027504], [0.00027377], [0.00027419], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010965041496092454], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928453714, 0.45428, [0.0010928], [0.0011023], [0.001094], [0.001101], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013701978750759736], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928453944, 0.45584, [0.0013647], [0.0013789], [0.0013687], [0.0013732], [8], [10]]}, "durations": {"": 1.992645263671875}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/c24ab497-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/c24ab497-virtualenv-py3.10.json new file mode 100644 index 0000000000..a5a457a19d --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/c24ab497-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "c24ab497ead3a30758ac1208ce76b925057138ac", "env_name": "virtualenv-py3.10", "date": 1591896878000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [null, [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928511659, 0.058873], "benchmarks.ColorSuite.time_downgrade_to_standard": [null, [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928511718, 0.059166], "benchmarks.ColorSuite.time_downgrade_to_windows": [null, [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928511777, 0.05774], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [null, [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928511835, 0.057941], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [null, [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928511893, 0.058], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [null, [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928511951, 0.057943], "benchmarks.PrettySuite.time_pretty": [null, [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928512009, 0.057429], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928512067, 0.057275], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928512124, 0.059217], "benchmarks.StyleSuite.time_parse_ansi": [null, [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928512183, 0.05876], "benchmarks.StyleSuite.time_parse_hex": [null, [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928512242, 0.060284], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [null, [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928512302, 0.057922], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928512360, 0.057638], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928512418, 0.057971], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928512476, 0.057943], "benchmarks.TableSuite.time_table_heavy_wrapping": [null, [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928512534, 0.05887], "benchmarks.TableSuite.time_table_no_wrapping": [null, [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928512593, 0.060205], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928512653, 0.060177], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928512714, 0.059204], "benchmarks.TextSuite.time_divide": [null, [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928512773, 0.059], "benchmarks.TextSuite.time_divide_unicode_heavy": [null, [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928512832, 0.058709], "benchmarks.TextSuite.time_fit": [null, [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928512891, 0.059158], "benchmarks.TextSuite.time_fit_unicode_heavy": [null, [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928512950, 0.058901], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928513009, 0.058609], "benchmarks.TextSuite.time_render": [null, [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928513068, 0.058868], "benchmarks.TextSuite.time_render_unicode_heavy": [null, [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928513127, 0.058921], "benchmarks.TextSuite.time_split": [null, [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928513186, 0.058957], "benchmarks.TextSuite.time_split_unicode_heavy": [null, [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928513245, 0.058532], "benchmarks.TextSuite.time_wrapping": [null, [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928513303, 0.058786], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [null, [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928513362, 0.058708]}, "durations": {"": 1.952800989151001}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/c3d0e358-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/c3d0e358-virtualenv-py3.10.json new file mode 100644 index 0000000000..aea7a94f5d --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/c3d0e358-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "c3d0e3584202d66703d2bcf2aaf3e7740bef6e2d", "env_name": "virtualenv-py3.10", "date": 1615044722000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.706721948289093e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929104157, 0.4578, [1.6967e-07], [1.7193e-07], [1.7016e-07], [1.7117e-07], [64125], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7067263036055206e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929104385, 0.43914, [1.701e-07], [1.7114e-07], [1.705e-07], [1.7087e-07], [60337], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7029728942220878e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929104604, 0.45742, [1.6832e-07], [1.7136e-07], [1.6943e-07], [1.7096e-07], [64010], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7058191830740293e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929104833, 0.45027, [1.7007e-07], [1.7242e-07], [1.7031e-07], [1.716e-07], [64784], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6997921753092606e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929105058, 0.43076, [1.6894e-07], [1.7276e-07], [1.6948e-07], [1.7053e-07], [58848], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7002529336257544e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929105273, 0.45924, [1.6863e-07], [1.7079e-07], [1.6944e-07], [1.7044e-07], [64523], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0009867746372368524], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929105502, 0.44858, [0.00098351], [0.0009905], [0.00098456], [0.0009894], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0013813307486998383], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929105731, 0.4425, [0.0013773], [0.0013982], [0.0013799], [0.0013838], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013766301235591527], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929105952, 0.43972, [0.0013681], [0.0013831], [0.0013721], [0.0013805], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1451074278215668e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929106171, 0.45274, [1.142e-07], [1.1476e-07], [1.1435e-07], [1.1459e-07], [94714], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.144319970689746e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929106398, 0.4575, [1.1395e-07], [1.1581e-07], [1.1416e-07], [1.1507e-07], [95540], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1434822253539605e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929106626, 0.44599, [1.1352e-07], [1.1473e-07], [1.1385e-07], [1.1467e-07], [92774], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929100649, 0.062294], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929100711, 0.062668], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929100774, 0.062616], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0020758249971549957], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929106849, 0.43742, [0.0020646], [0.0020825], [0.0020688], [0.0020801], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001257328125575441], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929107071, 0.43877, [0.0012507], [0.0012633], [0.0012556], [0.0012597], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006604114687434048], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929107290, 0.44145, [0.00065931], [0.00066414], [0.00065988], [0.00066294], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005531458155019209], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929107514, 0.44704, [0.0005459], [0.00055725], [0.00054798], [0.00055356], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.536036300994194e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929107736, 0.45422, [2.5291e-05], [2.5645e-05], [2.5326e-05], [2.5417e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018511529297343102], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929107964, 0.44979, [0.00018419], [0.00018566], [0.00018479], [0.00018534], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.342335775093274e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929108189, 0.44062, [4.3393e-05], [4.3498e-05], [4.3412e-05], [4.3444e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003250845907270118], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929108413, 0.45113, [0.0003243], [0.00032594], [0.00032449], [0.00032538], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035472413834088064], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929108638, 0.43849, [0.00035346], [0.00035631], [0.00035435], [0.00035543], [29], [10]], "benchmarks.TextSuite.time_render": [[4.69378584045557e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929108856, 0.44704, [4.6866e-06], [4.7115e-06], [4.6916e-06], [4.7047e-06], [2330], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.506103517902375e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929109084, 0.45227, [8.4416e-05], [8.5233e-05], [8.4788e-05], [8.5182e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.518062299170191e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929109311, 0.44387, [3.5155e-05], [3.5274e-05], [3.5167e-05], [3.5212e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027354166675836616], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929109537, 0.44793, [0.00027265], [0.00027461], [0.00027282], [0.00027439], [39], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010926770497462711], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929109761, 0.44975, [0.0010917], [0.0010962], [0.0010918], [0.001094], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014860089286230505], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929109989, 0.43598, [0.0014841], [0.001493], [0.0014855], [0.0014868], [7], [10]]}, "durations": {"": 2.0572969913482666}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/c3ee3b05-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/c3ee3b05-virtualenv-py3.10.json new file mode 100644 index 0000000000..68aca2e426 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/c3ee3b05-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "c3ee3b05d6d06be435f199126490bc33fcceb502", "env_name": "virtualenv-py3.10", "date": 1599494837000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7359650694168215e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928869645, 0.42879, [1.7304e-07], [1.7438e-07], [1.7332e-07], [1.7389e-07], [58488], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7321814904444916e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928869859, 0.44494, [1.7037e-07], [1.738e-07], [1.7288e-07], [1.7355e-07], [63672], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7122861978936038e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928870085, 0.42443, [1.692e-07], [1.7393e-07], [1.7003e-07], [1.725e-07], [59039], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.730784538795744e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928870295, 0.42424, [1.6995e-07], [1.7532e-07], [1.7038e-07], [1.7388e-07], [58837], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7222288226416987e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928870505, 0.44042, [1.6955e-07], [1.7508e-07], [1.7015e-07], [1.7413e-07], [63390], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.732525867726762e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928870727, 0.42593, [1.715e-07], [1.7359e-07], [1.7314e-07], [1.7349e-07], [58186], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010950937503366731], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928870939, 0.43273, [0.0010927], [0.0011018], [0.0010941], [0.0010958], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928865417, 0.058607], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014801220718904265], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928871155, 0.4295, [0.0014596], [0.0015119], [0.0014632], [0.0014943], [7], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.150097373401724e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928871372, 0.43168, [1.1363e-07], [1.164e-07], [1.1393e-07], [1.1616e-07], [87652], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1623627455916411e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928871592, 0.45323, [1.1605e-07], [1.1669e-07], [1.1622e-07], [1.1634e-07], [96318], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1681741001228055e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928871818, 0.44773, [1.1421e-07], [1.1779e-07], [1.1633e-07], [1.1735e-07], [94619], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928866355, 0.058379], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928866413, 0.058399], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928866471, 0.058258], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002998671876412118], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928872040, 0.45122, [0.0029648], [0.0030303], [0.0029776], [0.0030186], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001991791585169267], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928872270, 0.43846, [0.0019668], [0.0020335], [0.0019694], [0.0020166], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006747890929545974], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928872490, 0.43672, [0.00067335], [0.00067698], [0.00067447], [0.00067524], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005638497639569994], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928872710, 0.44086, [0.00055526], [0.00056567], [0.00056305], [0.00056422], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.7937122073338986e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928872929, 0.44164, [2.7806e-05], [2.8029e-05], [2.788e-05], [2.7962e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018892068392392902], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928873149, 0.44191, [0.00018595], [0.00019177], [0.0001867], [0.00019095], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.255028314613569e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928873366, 0.42847, [4.2108e-05], [4.2968e-05], [4.2218e-05], [4.2891e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.000330760741734036], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928873582, 0.42684, [0.0003297], [0.0003338], [0.00033013], [0.00033126], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928868285, 0.058934], "benchmarks.TextSuite.time_render": [[4.742500867413157e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928873793, 0.43919, [4.6899e-06], [4.795e-06], [4.6998e-06], [4.7872e-06], [2303], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.594543644918188e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928874015, 0.43372, [8.4961e-05], [8.7627e-05], [8.5185e-05], [8.7142e-05], [126], [10]], "benchmarks.TextSuite.time_split": [[3.414321132192028e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928874235, 0.43689, [3.3703e-05], [3.4457e-05], [3.3733e-05], [3.4407e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028423841649782844], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928874450, 0.42524, [0.00028296], [0.00028481], [0.00028413], [0.00028433], [36], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011712430002969792], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928874660, 0.42689, [0.0011672], [0.0011881], [0.0011683], [0.0011754], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015502083593414034], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928874876, 0.43958, [0.0015291], [0.0015619], [0.0015317], [0.0015579], [7], [10]]}, "durations": {"": 1.986644983291626}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/c57e1f50-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/c57e1f50-virtualenv-py3.10.json new file mode 100644 index 0000000000..c7f9815742 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/c57e1f50-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "c57e1f508af1f042d2777e876f816ea157d7a61b", "env_name": "virtualenv-py3.10", "date": 1639307388000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.714491110860278e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928275224, 0.46519, [1.6975e-07], [1.7782e-07], [1.7058e-07], [1.7461e-07], [63727], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7027461841066378e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928275455, 0.45707, [1.6965e-07], [1.7078e-07], [1.7007e-07], [1.7057e-07], [62443], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7047429717748822e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928275680, 0.46068, [1.7004e-07], [1.7291e-07], [1.7032e-07], [1.7098e-07], [64837], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.705617274106604e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928275913, 0.45993, [1.6866e-07], [1.7297e-07], [1.7016e-07], [1.7149e-07], [63189], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7014491459324859e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928276142, 0.46474, [1.6942e-07], [1.7261e-07], [1.7001e-07], [1.7036e-07], [64538], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.705598281303084e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928276374, 0.46213, [1.6889e-07], [1.7162e-07], [1.7008e-07], [1.7119e-07], [64092], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011053917012759486], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928276603, 0.45395, [0.0011023], [0.0011085], [0.0011035], [0.0011061], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0015186042146524414], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928276827, 0.44997, [0.001513], [0.0015302], [0.0015157], [0.0015235], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013958828130853362], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928277056, 0.45084, [0.0013943], [0.0014059], [0.0013949], [0.001399], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1401847489424796e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928277281, 0.4627, [1.1363e-07], [1.1512e-07], [1.1394e-07], [1.1464e-07], [96374], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1481137513064852e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928277512, 0.46027, [1.1415e-07], [1.1598e-07], [1.1452e-07], [1.1504e-07], [95059], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.140413100898655e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928277742, 0.45958, [1.136e-07], [1.16e-07], [1.1388e-07], [1.1426e-07], [95957], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928271654, 0.065342], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928271719, 0.066024], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928271785, 0.064959], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023448374995496124], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928277973, 0.45709, [0.0023331], [0.0023602], [0.0023406], [0.0023541], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0013974921876069857], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928278206, 0.44946, [0.0013936], [0.0014034], [0.0013958], [0.0014017], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003741364825741741], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928278432, 0.46066, [0.000369], [0.00038045], [0.00036943], [0.00037896], [29], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034241532229052315], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928278663, 0.45381, [0.0003407], [0.00035204], [0.00034202], [0.00034336], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5390467207891914e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928278888, 0.45856, [2.5255e-05], [2.568e-05], [2.5282e-05], [2.5539e-05], [427], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018445797455970639], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928279117, 0.46, [0.00018362], [0.00018496], [0.00018435], [0.0001846], [59], [10]], "benchmarks.TextSuite.time_fit": [[4.347264431880757e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928279348, 0.44885, [4.3402e-05], [4.3656e-05], [4.3436e-05], [4.3501e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032379906418012275], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928279576, 0.4351, [0.00032263], [0.00032447], [0.00032352], [0.00032402], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035621048300527036], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928279792, 0.44442, [0.00035502], [0.00035665], [0.00035504], [0.0003566], [29], [10]], "benchmarks.TextSuite.time_render": [[4.671231239570824e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928280013, 0.45329, [4.6533e-06], [4.6965e-06], [4.6678e-06], [4.6748e-06], [2346], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.538590623174969e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928280243, 0.45959, [8.4735e-05], [8.6171e-05], [8.5306e-05], [8.5535e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5272602937671236e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928280476, 0.44679, [3.5083e-05], [3.5344e-05], [3.5106e-05], [3.531e-05], [306], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002739221446589861], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928280703, 0.44555, [0.00027302], [0.00027744], [0.00027323], [0.00027422], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013621380621771095], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928280925, 0.45765, [0.0013549], [0.001371], [0.0013578], [0.0013672], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014483660738083667], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928281159, 0.44349, [0.0014459], [0.0014557], [0.0014471], [0.0014504], [7], [10]]}, "durations": {"": 1.9935321807861328}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/c9afafdd-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/c9afafdd-virtualenv-py3.10.json new file mode 100644 index 0000000000..52701b62c6 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/c9afafdd-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "c9afafdd680831a43956906d56c78d9933aaf232", "env_name": "virtualenv-py3.10", "date": 1625495729000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.700951248298525e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928390301, 0.46203, [1.692e-07], [1.7076e-07], [1.6981e-07], [1.7039e-07], [64673], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7103683205663688e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928390531, 0.462, [1.683e-07], [1.7483e-07], [1.6997e-07], [1.7239e-07], [64414], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7375540579457413e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928390762, 0.43928, [1.6874e-07], [1.7934e-07], [1.7107e-07], [1.758e-07], [59196], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7372322871830168e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928390981, 0.43919, [1.7049e-07], [1.7453e-07], [1.7212e-07], [1.7393e-07], [59336], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7035417031611407e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928391200, 0.4613, [1.687e-07], [1.7084e-07], [1.6993e-07], [1.7056e-07], [64469], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.701952531167399e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928391431, 0.46118, [1.6973e-07], [1.7061e-07], [1.7008e-07], [1.7036e-07], [64314], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010273750522173941], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928391661, 0.44843, [0.0010248], [0.001031], [0.0010255], [0.0010299], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014186172502377303], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928391883, 0.4628, [0.001411], [0.0014373], [0.001416], [0.0014213], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.001297231812714017], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928392109, 0.45365, [0.0012922], [0.001326], [0.0012951], [0.0013006], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1546282518142483e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928392333, 0.46398, [1.14e-07], [1.1648e-07], [1.1425e-07], [1.1642e-07], [95818], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1437953690125767e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928392568, 0.46205, [1.1409e-07], [1.147e-07], [1.1429e-07], [1.1449e-07], [95992], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1490000416168787e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928392800, 0.46388, [1.143e-07], [1.1556e-07], [1.1441e-07], [1.155e-07], [96149], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928386753, 0.06613], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928386819, 0.064369], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928386884, 0.064504], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002137574899825268], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928393033, 0.45026, [0.0021276], [0.0021517], [0.0021333], [0.0021422], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012787266241502948], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928393262, 0.44791, [0.0012705], [0.0012855], [0.0012753], [0.0012815], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003780699283067536], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928393484, 0.4525, [0.00037484], [0.00038091], [0.00037521], [0.00038024], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034083669344263693], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928393709, 0.45134, [0.0003398], [0.00034938], [0.0003404], [0.00034116], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.531682168668687e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928393933, 0.4475, [2.5219e-05], [2.5365e-05], [2.5284e-05], [2.5325e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018503125014329524], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928394161, 0.45479, [0.00018447], [0.00018654], [0.00018474], [0.00018603], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3872542661800224e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928394389, 0.44692, [4.3791e-05], [4.4066e-05], [4.3839e-05], [4.3886e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003276344031027909], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928394616, 0.43749, [0.00032441], [0.00033087], [0.00032534], [0.00033033], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00035691442878617503], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928394835, 0.44344, [0.00035542], [0.00035958], [0.0003557], [0.00035843], [28], [10]], "benchmarks.TextSuite.time_render": [[4.687330839564741e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928395059, 0.45145, [4.6747e-06], [4.6983e-06], [4.6786e-06], [4.6903e-06], [2338], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.5333331981019e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928395289, 0.45674, [8.4427e-05], [8.5609e-05], [8.5265e-05], [8.545e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.517887054552237e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928395519, 0.4495, [3.5094e-05], [3.5259e-05], [3.5129e-05], [3.5212e-05], [309], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002791748813347352], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928395748, 0.44997, [0.00027761], [0.00028055], [0.0002783], [0.00028033], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011034083494450898], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928395973, 0.44412, [0.0010975], [0.0011086], [0.0010995], [0.0011054], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013684375007869676], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928396194, 0.45484, [0.0013634], [0.0013746], [0.0013648], [0.0013725], [8], [10]]}, "durations": {"": 1.994858980178833}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/cefafdc1-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/cefafdc1-virtualenv-py3.10.json new file mode 100644 index 0000000000..ea6a85917c --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/cefafdc1-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "cefafdc12e0220d139c704522979a0dc9b3f889b", "env_name": "virtualenv-py3.10", "date": 1595773790000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.704546528382287e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928765765, 0.45389, [1.6863e-07], [1.7948e-07], [1.6997e-07], [1.7364e-07], [64326], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7278454081920666e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928765990, 0.43019, [1.6968e-07], [1.7344e-07], [1.7138e-07], [1.7316e-07], [58735], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7354584728929763e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928766205, 0.43256, [1.7096e-07], [1.75e-07], [1.7327e-07], [1.7398e-07], [59055], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7354764783853303e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928766420, 0.42931, [1.7297e-07], [1.7402e-07], [1.7342e-07], [1.7381e-07], [58649], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7511662148215553e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928766633, 0.43929, [1.7234e-07], [1.7811e-07], [1.7353e-07], [1.7605e-07], [62064], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.738140176266751e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928766855, 0.44373, [1.7239e-07], [1.7487e-07], [1.7334e-07], [1.7415e-07], [61194], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022470708005130294], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928767076, 0.44218, [0.0021923], [0.002369], [0.0022364], [0.0022503], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928761692, 0.059072], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928761752, 0.05875], "benchmarks.StyleSuite.time_parse_ansi": [[1.1584348784741335e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928767295, 0.42598, [1.1424e-07], [1.1626e-07], [1.1515e-07], [1.1588e-07], [87613], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1584836758195661e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928767507, 0.43357, [1.1391e-07], [1.1645e-07], [1.1478e-07], [1.162e-07], [95814], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1609665945508573e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928767725, 0.42709, [1.1548e-07], [1.1703e-07], [1.1575e-07], [1.1634e-07], [87886], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928762454, 0.060686], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928762515, 0.059674], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928762575, 0.059784], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002139574999455362], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928767939, 0.44351, [0.0021099], [0.0021543], [0.0021336], [0.0021481], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0015003720722493847], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928768162, 0.43513, [0.0014939], [0.0015075], [0.0014978], [0.0015047], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006745013660596063], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928768381, 0.43049, [0.00067283], [0.00067888], [0.00067418], [0.00067516], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005579756947958635], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928768593, 0.42798, [0.00054923], [0.00056491], [0.0005558], [0.00055862], [18], [10]], "benchmarks.TextSuite.time_divide": [[2.8091112257214872e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928768803, 0.43339, [2.778e-05], [2.833e-05], [2.786e-05], [2.8305e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001871991844382137], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928769022, 0.44169, [0.00018646], [0.00018784], [0.00018714], [0.00018736], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.206184386837079e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928769242, 0.44227, [4.1933e-05], [4.2324e-05], [4.2018e-05], [4.2199e-05], [253], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033646909709674335], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928769461, 0.43658, [0.00033509], [0.00033761], [0.00033552], [0.00033735], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928764389, 0.06003], "benchmarks.TextSuite.time_render": [[4.717766528633372e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928769678, 0.44127, [4.6823e-06], [4.7261e-06], [4.6856e-06], [4.7187e-06], [2330], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.631900777800183e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928769903, 0.43641, [8.5338e-05], [8.7457e-05], [8.5719e-05], [8.7006e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.408707212097047e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928770118, 0.4406, [3.3545e-05], [3.4724e-05], [3.3566e-05], [3.4635e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028407601387919605], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928770340, 0.43471, [0.0002795], [0.00028527], [0.0002829], [0.00028475], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011582684997443317], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928770558, 0.43952, [0.0011575], [0.0011616], [0.0011578], [0.0011598], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001546357140926245], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928770775, 0.4414, [0.0015254], [0.0015481], [0.0015438], [0.001547], [7], [10]]}, "durations": {"": 2.086954116821289}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/cf606f0a-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/cf606f0a-virtualenv-py3.10.json new file mode 100644 index 0000000000..9153416c3b --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/cf606f0a-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "cf606f0a3cab3dbe8f9fdaa2ccc4882c594ce2af", "env_name": "virtualenv-py3.10", "date": 1633525640000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7008481431105879e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928188222, 0.46544, [1.6954e-07], [1.7061e-07], [1.6969e-07], [1.7028e-07], [64594], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6977103967130265e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928188453, 0.46493, [1.6885e-07], [1.7035e-07], [1.6916e-07], [1.6995e-07], [64640], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7019219427270743e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928188685, 0.44697, [1.6873e-07], [1.7048e-07], [1.6992e-07], [1.7025e-07], [60777], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.6952995534974653e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928188908, 0.45652, [1.6879e-07], [1.7055e-07], [1.6931e-07], [1.7014e-07], [62610], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7031425859421503e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928189136, 0.43789, [1.6929e-07], [1.7098e-07], [1.6983e-07], [1.7054e-07], [59023], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6987605637107828e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928189355, 0.46462, [1.6944e-07], [1.7074e-07], [1.6956e-07], [1.7009e-07], [64388], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010299416491761802], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928189587, 0.45289, [0.0010285], [0.0010327], [0.0010294], [0.0010307], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014262708118621958], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928189812, 0.46211, [0.0014191], [0.0014354], [0.0014247], [0.0014304], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.001303890689086984], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928190042, 0.44367, [0.0012991], [0.0013081], [0.0013012], [0.0013058], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1436060985643663e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928190267, 0.45499, [1.1394e-07], [1.1448e-07], [1.1412e-07], [1.1444e-07], [93493], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1419639107421115e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928190495, 0.45868, [1.1401e-07], [1.1455e-07], [1.1413e-07], [1.1433e-07], [96430], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1430237181679641e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928190728, 0.43607, [1.1373e-07], [1.1653e-07], [1.1406e-07], [1.1632e-07], [87905], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928184640, 0.06603], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928184706, 0.065403], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928184771, 0.065643], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002137375099118799], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928190946, 0.45268, [0.0021232], [0.0021537], [0.0021326], [0.0021444], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012819921867048834], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928191175, 0.45076, [0.0012766], [0.0012911], [0.0012804], [0.0012873], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0003731116074569789], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928191399, 0.4503, [0.00036905], [0.00037584], [0.00037004], [0.00037552], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0003418051126045025], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928191624, 0.45421, [0.00033996], [0.0003531], [0.00034031], [0.0003438], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.5420383814757277e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928191851, 0.45966, [2.5403e-05], [2.5511e-05], [2.5412e-05], [2.5462e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001843121525302719], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928192080, 0.45971, [0.0001837], [0.0001845], [0.00018417], [0.00018439], [59], [10]], "benchmarks.TextSuite.time_fit": [[4.359663006749261e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928192310, 0.44846, [4.3466e-05], [4.3834e-05], [4.3497e-05], [4.3732e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003243705758712057], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928192539, 0.45606, [0.00032357], [0.00032569], [0.00032394], [0.00032473], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003578462763408456], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928192766, 0.44675, [0.00035635], [0.00035953], [0.00035684], [0.00035852], [29], [10]], "benchmarks.TextSuite.time_render": [[4.663015471995789e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928192988, 0.45183, [4.657e-06], [4.6789e-06], [4.6602e-06], [4.6676e-06], [2328], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.517106255112594e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928193218, 0.45805, [8.4403e-05], [8.5247e-05], [8.5058e-05], [8.5219e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5236133115106055e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928193448, 0.45048, [3.5006e-05], [3.541e-05], [3.505e-05], [3.5343e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027417105248835137], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928193678, 0.44627, [0.00027297], [0.00027504], [0.00027352], [0.00027446], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.001099810349114705], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928193900, 0.44558, [0.0010964], [0.0011023], [0.001098], [0.0011009], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0013641328132507624], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928194122, 0.45588, [0.0013606], [0.0013688], [0.0013625], [0.0013656], [8], [10]]}, "durations": {"": 1.987940788269043}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/d1ea01d0-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/d1ea01d0-virtualenv-py3.10.json new file mode 100644 index 0000000000..ee142a6597 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/d1ea01d0-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "d1ea01d0a35ef1509ab98251227d6bf995b245a4", "env_name": "virtualenv-py3.10", "date": 1593352189000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7275511303374947e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928593878, 0.42685, [1.7156e-07], [1.7375e-07], [1.7224e-07], [1.7341e-07], [58817], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7343822759676602e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928594091, 0.43221, [1.7264e-07], [1.7385e-07], [1.7288e-07], [1.7372e-07], [64430], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7113201561862943e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928594307, 0.42831, [1.6899e-07], [1.7382e-07], [1.706e-07], [1.7237e-07], [64534], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7378755242519641e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928594522, 0.45416, [1.7285e-07], [1.7485e-07], [1.7343e-07], [1.7402e-07], [64350], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7333784869853573e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928594748, 0.45035, [1.722e-07], [1.7422e-07], [1.7318e-07], [1.7352e-07], [64372], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.740670683276435e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928594973, 0.4309, [1.7081e-07], [1.7449e-07], [1.7253e-07], [1.7434e-07], [64166], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002210033303708769], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928595189, 0.43765, [0.0022042], [0.0022327], [0.0022077], [0.0022118], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928590154, 0.058498], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928590213, 0.057913], "benchmarks.StyleSuite.time_parse_ansi": [[1.1428107393122285e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928595404, 0.44495, [1.1373e-07], [1.1449e-07], [1.1404e-07], [1.1433e-07], [95530], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1542248528245094e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928595627, 0.43917, [1.1413e-07], [1.1676e-07], [1.1431e-07], [1.1633e-07], [95943], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1608432618778828e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928595851, 0.44075, [1.1578e-07], [1.1647e-07], [1.1595e-07], [1.1632e-07], [95777], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928590923, 0.057854], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928590981, 0.057866], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928591038, 0.057476], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0020284958998672666], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928596078, 0.42371, [0.0020248], [0.0020344], [0.002027], [0.0020318], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014361726415310322], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928596293, 0.42172, [0.0014307], [0.0014433], [0.0014329], [0.0014408], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928591514, 0.058258], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928591572, 0.058273], "benchmarks.TextSuite.time_divide": [[2.8322780685372865e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928596506, 0.44533, [2.8226e-05], [2.8376e-05], [2.8307e-05], [2.833e-05], [383], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018953253477280797], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928596729, 0.44308, [0.00018654], [0.00019173], [0.00018753], [0.00019155], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.235208203317598e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928596948, 0.44025, [4.2095e-05], [4.3059e-05], [4.2247e-05], [4.2794e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003361021452057626], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928597168, 0.43071, [0.00033251], [0.00033843], [0.00033487], [0.00033783], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928592516, 0.058444], "benchmarks.TextSuite.time_render": [[4.687418159703545e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928597382, 0.4324, [4.6471e-06], [4.6982e-06], [4.6604e-06], [4.6959e-06], [2291], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.583528904182458e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928597601, 0.44525, [8.5363e-05], [8.6883e-05], [8.5395e-05], [8.6789e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.391068551741961e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928597826, 0.43549, [3.3659e-05], [3.4238e-05], [3.3828e-05], [3.4162e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028314977031629026], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928598042, 0.43206, [0.00027929], [0.00028619], [0.00027984], [0.00028522], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.00116348844474285], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928598257, 0.4364, [0.001144], [0.0011747], [0.0011457], [0.0011729], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015192588554262848], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928598475, 0.434, [0.0015163], [0.0015243], [0.0015173], [0.0015207], [7], [10]]}, "durations": {"": 1.9580459594726562}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/d6e6a762-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/d6e6a762-virtualenv-py3.10.json new file mode 100644 index 0000000000..10e6dc1245 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/d6e6a762-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "d6e6a7627e41b8177d5824848a33fe78a52defbf", "env_name": "virtualenv-py3.10", "date": 1638115361000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7044148018081613e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929382285, 0.45442, [1.6941e-07], [1.7235e-07], [1.7e-07], [1.7091e-07], [64534], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7100720142793016e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929382517, 0.46749, [1.6983e-07], [1.7229e-07], [1.7064e-07], [1.7127e-07], [64153], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7058500679039374e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929382752, 0.45793, [1.6951e-07], [1.7103e-07], [1.7018e-07], [1.7089e-07], [64648], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.70275577801008e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929382985, 0.46411, [1.6964e-07], [1.7086e-07], [1.6981e-07], [1.7062e-07], [64089], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.700077842064008e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929383217, 0.46804, [1.6932e-07], [1.7854e-07], [1.6988e-07], [1.7042e-07], [64618], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6995302828139584e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929383451, 0.45754, [1.691e-07], [1.7185e-07], [1.6985e-07], [1.7062e-07], [64528], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0011057438008720056], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929383685, 0.4556, [0.0011021], [0.0011127], [0.0011046], [0.0011064], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.001518651784863323], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929383910, 0.45139, [0.0015132], [0.0015288], [0.0015168], [0.0015217], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013965208745503332], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929384138, 0.45272, [0.0013928], [0.0014081], [0.0013936], [0.0013997], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.14279963534634e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929384364, 0.46515, [1.1383e-07], [1.1513e-07], [1.1425e-07], [1.1466e-07], [96041], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1550767465349522e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929384596, 0.46102, [1.1392e-07], [1.1693e-07], [1.1405e-07], [1.1682e-07], [94076], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1419077714234279e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929384825, 0.46473, [1.1388e-07], [1.1544e-07], [1.1406e-07], [1.1429e-07], [96272], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929378667, 0.06719], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929378734, 0.065859], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929378800, 0.065964], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0023521165974671023], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929385057, 0.46008, [0.0023354], [0.0023596], [0.0023481], [0.002354], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001415294249454746], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929385291, 0.4546, [0.0014002], [0.0015066], [0.0014028], [0.0014178], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037431696390350614], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929385519, 0.46925, [0.00037036], [0.00037745], [0.00037118], [0.00037714], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034069825825656973], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929385742, 0.45394, [0.00033797], [0.00035258], [0.0003388], [0.00034201], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.535485209975864e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929385969, 0.45971, [2.5221e-05], [2.5434e-05], [2.5315e-05], [2.5404e-05], [426], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018451293977579615], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929386198, 0.45778, [0.00018335], [0.00018545], [0.00018437], [0.00018511], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.351439636637934e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929386425, 0.44973, [4.3437e-05], [4.3568e-05], [4.3482e-05], [4.3547e-05], [246], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032582512137719965], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929386653, 0.4586, [0.00032488], [0.00032697], [0.00032528], [0.00032649], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003563821890816927], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929386881, 0.4471, [0.00035563], [0.00036099], [0.00035596], [0.0003567], [29], [10]], "benchmarks.TextSuite.time_render": [[4.675005164754989e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929387104, 0.45307, [4.6596e-06], [4.6868e-06], [4.6692e-06], [4.6829e-06], [2321], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.51159763163117e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929387334, 0.45551, [8.4379e-05], [8.5608e-05], [8.4655e-05], [8.5219e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.5167884774424445e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929387563, 0.45005, [3.5061e-05], [3.5247e-05], [3.5088e-05], [3.5228e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027289102600218775], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929387792, 0.45467, [0.00027132], [0.00027378], [0.00027258], [0.00027315], [39], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0013594817501143552], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929388018, 0.45641, [0.0013561], [0.0013673], [0.0013586], [0.0013646], [8], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014479047864110076], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929388249, 0.44442, [0.0014435], [0.0014508], [0.0014444], [0.0014503], [7], [10]]}, "durations": {"": 1.9784090518951416}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/d9d59c6e-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/d9d59c6e-virtualenv-py3.10.json new file mode 100644 index 0000000000..9a50d0517c --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/d9d59c6e-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "d9d59c6eda6d21f4515e9a8fe9496fa5e68f9500", "env_name": "virtualenv-py3.10", "date": 1601731540000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7007272862010314e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928948881, 0.44769, [1.691e-07], [1.7067e-07], [1.6979e-07], [1.7041e-07], [64713], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7230254365760394e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928949104, 0.44046, [1.6906e-07], [1.7397e-07], [1.6958e-07], [1.7329e-07], [64394], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.700615323578596e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928949330, 0.44909, [1.6912e-07], [1.7315e-07], [1.6998e-07], [1.7077e-07], [64454], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7185753185443347e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928949554, 0.43388, [1.6937e-07], [1.74e-07], [1.7027e-07], [1.7356e-07], [58729], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.6980957393884359e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928949774, 0.4481, [1.6901e-07], [1.7029e-07], [1.6955e-07], [1.7004e-07], [64550], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7070400929737442e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928949998, 0.45027, [1.6981e-07], [1.7197e-07], [1.7021e-07], [1.7133e-07], [64502], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0009214204540264539], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928950224, 0.43133, [0.00091927], [0.00092614], [0.00092008], [0.00092345], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928944661, 0.057795], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0013074791258986806], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928950440, 0.42931, [0.0013042], [0.0013097], [0.0013051], [0.0013093], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1475910215925814e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928950658, 0.44674, [1.1367e-07], [1.1608e-07], [1.1398e-07], [1.1526e-07], [95416], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1526058413923107e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928950882, 0.45265, [1.1417e-07], [1.1624e-07], [1.1435e-07], [1.1575e-07], [94977], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1425953489652303e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928951111, 0.44765, [1.1396e-07], [1.1495e-07], [1.1408e-07], [1.1436e-07], [96382], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928945601, 0.05744], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928945658, 0.057925], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928945716, 0.057371], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0027217134993406944], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928951335, 0.42588, [0.0027174], [0.0027449], [0.0027199], [0.0027228], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0018379097503687567], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928951549, 0.44105, [0.0018355], [0.0018497], [0.0018371], [0.0018465], [6], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006745612190570682], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928951767, 0.4356, [0.00066229], [0.00067891], [0.00066486], [0.0006778], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005468925527039621], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928951990, 0.43292, [0.00054298], [0.00055628], [0.0005446], [0.00055198], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.7947836365042762e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928952204, 0.44141, [2.7888e-05], [2.8018e-05], [2.7904e-05], [2.7985e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018688398292930476], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928952424, 0.44236, [0.00018663], [0.00018762], [0.00018668], [0.00018727], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.223215535646712e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928952645, 0.43804, [4.2053e-05], [4.2538e-05], [4.2177e-05], [4.225e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032950469364051617], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928952863, 0.427, [0.00032902], [0.00033125], [0.0003292], [0.00032978], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928947520, 0.058016], "benchmarks.TextSuite.time_render": [[4.690418560544151e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928953076, 0.4365, [4.6716e-06], [4.7213e-06], [4.6755e-06], [4.7052e-06], [2327], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.534996516735459e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928953298, 0.4446, [8.4571e-05], [8.5513e-05], [8.5258e-05], [8.5447e-05], [129], [10]], "benchmarks.TextSuite.time_split": [[3.383466821851937e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928953522, 0.43553, [3.3784e-05], [3.3888e-05], [3.3819e-05], [3.3857e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002794617160091277], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928953739, 0.42829, [0.00027875], [0.00028134], [0.00027922], [0.00027985], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011428379447251144], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928953952, 0.43093, [0.0011403], [0.0011446], [0.0011426], [0.0011432], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015310773576077607], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928954165, 0.43585, [0.0015279], [0.0015349], [0.0015302], [0.0015327], [7], [10]]}, "durations": {"": 2.036357879638672}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/e0a1fd30-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/e0a1fd30-virtualenv-py3.10.json new file mode 100644 index 0000000000..e9ceb16440 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/e0a1fd30-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "e0a1fd3052a54144f54a20eb97bfc3f397658675", "env_name": "virtualenv-py3.10", "date": 1594310534000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7310468765644094e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928664281, 0.42707, [1.7202e-07], [1.7348e-07], [1.7287e-07], [1.7327e-07], [59157], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7140150026302792e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928664493, 0.44259, [1.6964e-07], [1.7335e-07], [1.6999e-07], [1.7295e-07], [64447], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7120258556264482e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928664717, 0.44445, [1.6984e-07], [1.7711e-07], [1.7032e-07], [1.7301e-07], [64274], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.739078501037466e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928664940, 0.42331, [1.7275e-07], [1.75e-07], [1.7376e-07], [1.7434e-07], [58318], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7400155762376018e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928665151, 0.44134, [1.7121e-07], [1.7447e-07], [1.7324e-07], [1.742e-07], [64208], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7380606893906802e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928665377, 0.43557, [1.6943e-07], [1.771e-07], [1.724e-07], [1.7451e-07], [64755], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0022525667038280515], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928665593, 0.44188, [0.0022446], [0.0022692], [0.0022481], [0.0022578], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928660547, 0.058901], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928660606, 0.058328], "benchmarks.StyleSuite.time_parse_ansi": [[1.1611185828598203e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928665811, 0.42395, [1.1578e-07], [1.1775e-07], [1.1595e-07], [1.1639e-07], [87441], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.170790392565746e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928666022, 0.42512, [1.1625e-07], [1.1786e-07], [1.1668e-07], [1.1741e-07], [87450], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1539420545928226e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928666234, 0.43805, [1.138e-07], [1.1688e-07], [1.143e-07], [1.1666e-07], [95936], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928661313, 0.058048], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928661371, 0.05784], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928661429, 0.057652], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021038542006863283], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928666450, 0.43374, [0.0020827], [0.0021521], [0.0020909], [0.0021359], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014810833568584972], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928666668, 0.42867, [0.0014557], [0.0015049], [0.0014606], [0.0014982], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928661915, 0.058367], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928661974, 0.058171], "benchmarks.TextSuite.time_divide": [[2.8066775329144937e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928666884, 0.44528, [2.7753e-05], [2.8493e-05], [2.7785e-05], [2.838e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019063486813632934], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928667108, 0.44545, [0.00018949], [0.00019101], [0.00019018], [0.00019082], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.291398792965226e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928667331, 0.44101, [4.2623e-05], [4.3151e-05], [4.2759e-05], [4.3032e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003357896616028982], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928667550, 0.43211, [0.00033434], [0.00033657], [0.00033526], [0.00033627], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928662916, 0.058343], "benchmarks.TextSuite.time_render": [[4.695363762934517e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928667765, 0.44042, [4.6861e-06], [4.7038e-06], [4.6888e-06], [4.6987e-06], [2334], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.681542965405242e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928667990, 0.44792, [8.5205e-05], [8.7409e-05], [8.6381e-05], [8.6843e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.372648716088193e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928668216, 0.43541, [3.3659e-05], [3.3812e-05], [3.3705e-05], [3.3766e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028238456729308675], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928668433, 0.43206, [0.00028014], [0.00028621], [0.00028076], [0.00028362], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011480787199818427], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928668649, 0.43319, [0.0011355], [0.0011605], [0.001136], [0.0011575], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015361339277920447], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928668864, 0.43689, [0.001519], [0.0015511], [0.0015207], [0.0015504], [7], [10]]}, "durations": {"": 1.9530549049377441}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/e338ab14-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/e338ab14-virtualenv-py3.10.json new file mode 100644 index 0000000000..a492154f8a --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/e338ab14-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "e338ab145797e57a5db73f37b3883a30592f0643", "env_name": "virtualenv-py3.10", "date": 1596045245000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7237765726891362e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928791445, 0.44188, [1.6968e-07], [1.7551e-07], [1.7051e-07], [1.7508e-07], [64397], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7026478922479047e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928791662, 0.45003, [1.6824e-07], [1.725e-07], [1.685e-07], [1.7062e-07], [64455], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.718668772833788e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928791887, 0.44284, [1.6938e-07], [1.7492e-07], [1.7058e-07], [1.728e-07], [64741], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.741799941720092e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928792113, 0.42647, [1.7288e-07], [1.7543e-07], [1.735e-07], [1.7487e-07], [58313], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7065924860881734e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928792325, 0.45101, [1.6917e-07], [1.7312e-07], [1.6989e-07], [1.7253e-07], [64145], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7367138249440384e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928792551, 0.42737, [1.7333e-07], [1.7426e-07], [1.7359e-07], [1.7383e-07], [58416], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002228712401119992], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928792763, 0.44, [0.0022051], [0.0022493], [0.0022103], [0.0022462], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928787372, 0.05935], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928787431, 0.058882], "benchmarks.StyleSuite.time_parse_ansi": [[1.1642484415812025e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928792979, 0.44304, [1.1595e-07], [1.1701e-07], [1.1626e-07], [1.1688e-07], [96473], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1618160435974029e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928793196, 0.42542, [1.1589e-07], [1.1639e-07], [1.1607e-07], [1.1631e-07], [87575], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1601246714630609e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928793408, 0.43079, [1.1548e-07], [1.1651e-07], [1.1576e-07], [1.1625e-07], [96052], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928788146, 0.064197], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928788210, 0.061157], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928788271, 0.060177], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002149124999414198], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928793624, 0.44144, [0.0021426], [0.0021548], [0.0021465], [0.0021511], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014850386443348335], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928793847, 0.43148, [0.0014663], [0.0015021], [0.0014691], [0.0015009], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006758190311302315], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928794067, 0.43666, [0.00067329], [0.00067763], [0.00067488], [0.00067693], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005571765259925374], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928794287, 0.4416, [0.0005541], [0.00056586], [0.00055588], [0.00056347], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8368723374646302e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928794506, 0.44804, [2.8251e-05], [2.8635e-05], [2.8266e-05], [2.8468e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018895545684339093], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928794731, 0.43705, [0.00018618], [0.00019059], [0.00018704], [0.00019034], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.2167335354075975e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928794953, 0.43757, [4.196e-05], [4.2288e-05], [4.2114e-05], [4.2238e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003304905802642386], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928795171, 0.42855, [0.00032949], [0.00033101], [0.00033005], [0.00033082], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928790076, 0.059104], "benchmarks.TextSuite.time_render": [[4.6839064024984716e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928795384, 0.43598, [4.6644e-06], [4.7044e-06], [4.6657e-06], [4.6875e-06], [2313], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.61083985910227e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928795606, 0.44712, [8.496e-05], [8.687e-05], [8.5796e-05], [8.6759e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.3972478264562766e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928795832, 0.42753, [3.363e-05], [3.4464e-05], [3.3653e-05], [3.4306e-05], [299], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002844459459821165], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928796043, 0.43604, [0.00028389], [0.00028542], [0.00028433], [0.0002849], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011586804984189156], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928796260, 0.43906, [0.0011456], [0.0011665], [0.0011465], [0.001166], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001550122002039903], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928796480, 0.44303, [0.0015462], [0.001553], [0.0015496], [0.001552], [7], [10]]}, "durations": {"": 1.9766087532043457}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/e34eadb3-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/e34eadb3-virtualenv-py3.10.json new file mode 100644 index 0000000000..882eccb15c --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/e34eadb3-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "e34eadb3a9354c2469fa2112400ce2690f2663ba", "env_name": "virtualenv-py3.10", "date": 1617443480000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.696712790099806e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928144840, 0.45463, [1.6843e-07], [1.7049e-07], [1.6953e-07], [1.6998e-07], [64103], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7027267398097965e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928145066, 0.45781, [1.6987e-07], [1.7109e-07], [1.6993e-07], [1.706e-07], [64678], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7049283188862985e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928145295, 0.44791, [1.6919e-07], [1.708e-07], [1.6948e-07], [1.7059e-07], [64452], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.705121943921845e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928145524, 0.45681, [1.6982e-07], [1.7131e-07], [1.7027e-07], [1.7101e-07], [64496], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.702775916823948e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928145754, 0.45544, [1.6886e-07], [1.7083e-07], [1.7001e-07], [1.7047e-07], [64186], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6998984571588156e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928145981, 0.45874, [1.6864e-07], [1.7059e-07], [1.6966e-07], [1.7014e-07], [64553], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001011210400611162], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928146210, 0.43803, [0.001009], [0.0010129], [0.0010103], [0.0010116], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014061588135518832], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928146428, 0.44757, [0.0014009], [0.0014131], [0.0014045], [0.0014091], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014056692507438129], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928146651, 0.44633, [0.0014033], [0.0014173], [0.0014049], [0.0014074], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1435738375325794e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928146873, 0.4552, [1.1406e-07], [1.1462e-07], [1.142e-07], [1.1449e-07], [96076], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1418502917649992e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928147101, 0.4558, [1.1393e-07], [1.1441e-07], [1.1408e-07], [1.1423e-07], [95693], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1394088208804275e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928147330, 0.45397, [1.1368e-07], [1.1425e-07], [1.1384e-07], [1.1411e-07], [95986], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928141354, 0.062237], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928141416, 0.061926], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928141478, 0.061969], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002072625001892448], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928147558, 0.43503, [0.0020589], [0.0020926], [0.0020642], [0.0020782], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012561796866066288], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928147779, 0.43518, [0.0012465], [0.0012609], [0.0012487], [0.0012601], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006597473739020643], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928147995, 0.43776, [0.00065713], [0.00066447], [0.00065827], [0.00066178], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005476217101156515], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928148216, 0.43322, [0.00054434], [0.00055494], [0.0005472], [0.00054804], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5546180958848535e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928148434, 0.44931, [2.5203e-05], [2.5867e-05], [2.5285e-05], [2.5816e-05], [420], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018499138793137308], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928148656, 0.44848, [0.00018347], [0.00018566], [0.00018476], [0.00018512], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.3639797973921715e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928148881, 0.44002, [4.3581e-05], [4.3722e-05], [4.3606e-05], [4.3684e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003260978635146537], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928149104, 0.45085, [0.00032518], [0.00032767], [0.00032528], [0.00032741], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.000359940362174931], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928149329, 0.44151, [0.00035865], [0.00036075], [0.00035891], [0.00036044], [29], [10]], "benchmarks.TextSuite.time_render": [[4.6775250730475595e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928149549, 0.44493, [4.6489e-06], [4.7241e-06], [4.65e-06], [4.7058e-06], [2333], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.522135544808407e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928149775, 0.45028, [8.4664e-05], [8.5461e-05], [8.501e-05], [8.5415e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5257034106542926e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928150002, 0.44363, [3.518e-05], [3.5338e-05], [3.5206e-05], [3.5272e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002739347630842148], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928150228, 0.43988, [0.00027353], [0.0002753], [0.0002737], [0.00027438], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010990895490976982], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928150448, 0.44813, [0.001093], [0.0011074], [0.0010948], [0.0011054], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0014903362836256357], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928150676, 0.4363, [0.0014875], [0.0014996], [0.0014885], [0.0014932], [7], [10]]}, "durations": {"": 1.9847049713134766}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/e5246436-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/e5246436-virtualenv-py3.10.json new file mode 100644 index 0000000000..8cb2804955 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/e5246436-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "e5246436cd75de32f3436cc88d6e4fdebe13bd8d", "env_name": "virtualenv-py3.10", "date": 1624045427000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7121876383992076e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928375942, 0.45699, [1.6972e-07], [1.7385e-07], [1.7045e-07], [1.7316e-07], [64549], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7140758442246742e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928376173, 0.45585, [1.6994e-07], [1.7409e-07], [1.7087e-07], [1.7208e-07], [63604], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7555230280790102e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928376400, 0.45414, [1.7091e-07], [1.7958e-07], [1.7178e-07], [1.7913e-07], [64050], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7444178637067224e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928376625, 0.44307, [1.6957e-07], [1.7989e-07], [1.7037e-07], [1.7971e-07], [57684], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7027203980746368e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928376846, 0.43123, [1.692e-07], [1.7118e-07], [1.7021e-07], [1.7061e-07], [59142], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7416664249620003e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928377060, 0.44769, [1.7065e-07], [1.7953e-07], [1.7095e-07], [1.7918e-07], [61578], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0010265853998134844], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928377284, 0.44568, [0.0010241], [0.0010299], [0.0010264], [0.0010274], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014202526235749247], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928377506, 0.45577, [0.0014176], [0.001425], [0.0014186], [0.0014223], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0012978619397472357], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928377732, 0.44848, [0.0012918], [0.0013056], [0.0012969], [0.0012993], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1537922092642804e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928377956, 0.45884, [1.1374e-07], [1.1682e-07], [1.141e-07], [1.1658e-07], [95596], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1562117250055742e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928378185, 0.45754, [1.1431e-07], [1.1604e-07], [1.1445e-07], [1.1595e-07], [94939], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1666161339593778e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928378414, 0.44748, [1.1392e-07], [1.1803e-07], [1.1428e-07], [1.177e-07], [96409], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928372422, 0.063342], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928372485, 0.063096], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928372549, 0.062772], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021321667009033263], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928378638, 0.44575, [0.0021211], [0.0021441], [0.0021242], [0.0021377], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0012759244382323232], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928378864, 0.44247, [0.0012695], [0.001283], [0.0012729], [0.0012805], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.00037540624959677056], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928379084, 0.4371, [0.00037151], [0.00038821], [0.00037181], [0.00038666], [28], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.00034207595144248297], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928379304, 0.44882, [0.00034136], [0.00035348], [0.00034155], [0.0003426], [31], [10]], "benchmarks.TextSuite.time_divide": [[2.536586947665313e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928379528, 0.45538, [2.5203e-05], [2.5458e-05], [2.5243e-05], [2.5434e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.0001846677410428348], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928379755, 0.44978, [0.00018411], [0.00018508], [0.00018436], [0.00018488], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.364762043019719e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928379980, 0.44107, [4.3402e-05], [4.3756e-05], [4.3483e-05], [4.3667e-05], [245], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032506787101738155], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928380204, 0.43222, [0.00032414], [0.00032574], [0.00032463], [0.00032542], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003573304651393395], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928380419, 0.4409, [0.00035635], [0.00035834], [0.00035689], [0.00035791], [29], [10]], "benchmarks.TextSuite.time_render": [[4.691495508280876e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928380638, 0.44744, [4.6776e-06], [4.7016e-06], [4.6895e-06], [4.6965e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.530924219485314e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928380866, 0.45274, [8.4673e-05], [8.5853e-05], [8.5133e-05], [8.567e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5445277587444117e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928381094, 0.44686, [3.5215e-05], [3.5504e-05], [3.5315e-05], [3.5482e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027470559220283146], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928381321, 0.44608, [0.00027409], [0.00027789], [0.00027428], [0.00027512], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0010961708016111516], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928381543, 0.45057, [0.0010949], [0.0011069], [0.0010956], [0.0010981], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001370231688269996], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928381771, 0.44155, [0.0013624], [0.0013824], [0.0013637], [0.0013763], [8], [10]]}, "durations": {"": 1.9848251342773438}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/e7849495-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/e7849495-virtualenv-py3.10.json new file mode 100644 index 0000000000..a569bcb376 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/e7849495-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "e7849495bba31d9320e17c23f24d50f6e3447486", "env_name": "virtualenv-py3.10", "date": 1595520125000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7148217870415353e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928752792, 0.444, [1.6818e-07], [1.7513e-07], [1.7023e-07], [1.7386e-07], [64557], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.717760784730424e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928753009, 0.44202, [1.6824e-07], [1.7425e-07], [1.6944e-07], [1.7385e-07], [64440], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7394742863716818e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928753226, 0.42645, [1.7242e-07], [1.7453e-07], [1.7311e-07], [1.7422e-07], [58682], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.738570892575407e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928753437, 0.42594, [1.7302e-07], [1.7498e-07], [1.7372e-07], [1.7442e-07], [58498], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7395242587634876e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928753649, 0.42775, [1.7351e-07], [1.7469e-07], [1.7381e-07], [1.7399e-07], [58456], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7219868784628356e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928753860, 0.43147, [1.7117e-07], [1.7401e-07], [1.7132e-07], [1.7295e-07], [58602], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002241970898467116], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928754071, 0.44207, [0.0022266], [0.0022534], [0.0022288], [0.0022469], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928748754, 0.058708], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928748813, 0.058418], "benchmarks.StyleSuite.time_parse_ansi": [[1.1589902303258713e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928754290, 0.42601, [1.1557e-07], [1.1612e-07], [1.158e-07], [1.1592e-07], [87921], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1435150056040357e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928754503, 0.44939, [1.1368e-07], [1.1473e-07], [1.1404e-07], [1.1441e-07], [96199], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.151733038312782e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928754728, 0.44075, [1.1392e-07], [1.1708e-07], [1.1418e-07], [1.163e-07], [96703], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928749526, 0.058835], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928749585, 0.058365], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928749643, 0.058179], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002147645902005024], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928754953, 0.44036, [0.0021381], [0.0021603], [0.0021456], [0.0021526], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001480997001635842], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928755177, 0.4327, [0.0014611], [0.0014968], [0.0014654], [0.0014952], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.00067317184402782], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928755396, 0.43643, [0.00067152], [0.00067656], [0.00067246], [0.00067436], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005569835522788038], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928755618, 0.4352, [0.00054821], [0.00055829], [0.00055497], [0.00055743], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.814016095545455e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928755840, 0.44388, [2.7886e-05], [2.8309e-05], [2.7949e-05], [2.8281e-05], [382], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019082979256296003], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928756060, 0.42581, [0.00018821], [0.00019268], [0.00018988], [0.00019128], [53], [10]], "benchmarks.TextSuite.time_fit": [[4.294921291513316e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928756273, 0.43253, [4.2466e-05], [4.3271e-05], [4.2744e-05], [4.2999e-05], [249], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003302567258229359], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928756493, 0.43148, [0.00032924], [0.00033487], [0.00032959], [0.0003326], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928751425, 0.059965], "benchmarks.TextSuite.time_render": [[4.696148469404577e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928756710, 0.44171, [4.6716e-06], [4.7853e-06], [4.6868e-06], [4.7318e-06], [2327], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.574868889257869e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928756935, 0.44548, [8.4753e-05], [8.8755e-05], [8.5435e-05], [8.6309e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.4033222558314095e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928757160, 0.43487, [3.3872e-05], [3.4551e-05], [3.3902e-05], [3.4423e-05], [301], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002822291756495582], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928757375, 0.43743, [0.00027952], [0.00028869], [0.00027998], [0.00028449], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011652338337929298], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928757595, 0.43324, [0.0011616], [0.0011693], [0.001163], [0.001167], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015330178555034634], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928757816, 0.44158, [0.0015247], [0.001553], [0.0015261], [0.0015458], [7], [10]]}, "durations": {"": 1.9744257926940918}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/e9e72000-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/e9e72000-virtualenv-py3.10.json new file mode 100644 index 0000000000..ec804be10b --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/e9e72000-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "e9e72000c50f56654c89e119ff882e322e51ecf3", "env_name": "virtualenv-py3.10", "date": 1594757621000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7304169585631847e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928714152, 0.42423, [1.7196e-07], [1.7392e-07], [1.7257e-07], [1.7341e-07], [58699], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7125368267902652e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928714363, 0.43145, [1.6882e-07], [1.735e-07], [1.6998e-07], [1.7302e-07], [58721], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7101817868163705e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928714581, 0.43901, [1.6945e-07], [1.7245e-07], [1.705e-07], [1.7123e-07], [64829], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.732246945458925e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928714805, 0.42978, [1.7229e-07], [1.7422e-07], [1.7291e-07], [1.7373e-07], [57992], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.717644183078106e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928715023, 0.44824, [1.698e-07], [1.7285e-07], [1.7041e-07], [1.7259e-07], [64432], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.721922586441147e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928715249, 0.42244, [1.6925e-07], [1.7376e-07], [1.7043e-07], [1.7344e-07], [59100], [10]], "benchmarks.PrettySuite.time_pretty": [[0.0021911416988587007], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928715461, 0.43276, [0.0021847], [0.0022], [0.002187], [0.0021966], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928710109, 0.058049], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928710168, 0.057828], "benchmarks.StyleSuite.time_parse_ansi": [[1.1611352647949346e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928715675, 0.44343, [1.1562e-07], [1.1813e-07], [1.1588e-07], [1.1706e-07], [93956], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1625654809648257e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928715895, 0.4449, [1.1588e-07], [1.1765e-07], [1.1622e-07], [1.1633e-07], [94647], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1621984081693307e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928716118, 0.4218, [1.1599e-07], [1.1699e-07], [1.1606e-07], [1.1641e-07], [87693], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928710884, 0.057714], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928710941, 0.057198], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928710999, 0.057344], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0021389750036178157], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928716328, 0.43712, [0.0021263], [0.002152], [0.0021338], [0.0021426], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.001480624998553789], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928716549, 0.42858, [0.0014654], [0.0015014], [0.0014703], [0.0014919], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006738208331322918], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928716766, 0.4257, [0.00067146], [0.00067512], [0.00067242], [0.00067498], [15], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005575383938297531], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928716976, 0.43998, [0.0005558], [0.00056747], [0.00055683], [0.00055774], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8062498696319954e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928717195, 0.43825, [2.7727e-05], [2.8481e-05], [2.7746e-05], [2.8329e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018722989459587423], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928717415, 0.43764, [0.00018621], [0.00018781], [0.000187], [0.00018742], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.257493278079781e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928717633, 0.44288, [4.193e-05], [4.3198e-05], [4.204e-05], [4.3016e-05], [253], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00033001745149733555], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928717855, 0.42619, [0.00032897], [0.00033136], [0.00032948], [0.00033029], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928712796, 0.057893], "benchmarks.TextSuite.time_render": [[4.699889219279239e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928718067, 0.43703, [4.6654e-06], [4.7379e-06], [4.6769e-06], [4.7221e-06], [2329], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.690103879479435e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928718289, 0.42866, [8.6244e-05], [8.7206e-05], [8.6697e-05], [8.7149e-05], [116], [10]], "benchmarks.TextSuite.time_split": [[3.437333175381168e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928718509, 0.44056, [3.4274e-05], [3.4489e-05], [3.4332e-05], [3.4457e-05], [312], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028171171623005256], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928718728, 0.43094, [0.00027874], [0.00028472], [0.00027907], [0.00028437], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011581967232309075], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928718944, 0.43562, [0.0011551], [0.0011627], [0.0011563], [0.0011595], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015381249998297009], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928719160, 0.43655, [0.0015173], [0.0015526], [0.0015184], [0.0015516], [7], [10]]}, "durations": {"": 1.946124792098999}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/ea049ffc-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/ea049ffc-virtualenv-py3.10.json new file mode 100644 index 0000000000..95acb4fce7 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/ea049ffc-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "ea049ffc148998ad3190faaf66992c9704e7d36a", "env_name": "virtualenv-py3.10", "date": 1609342393000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7059619594426984e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929189851, 0.45742, [1.6965e-07], [1.7127e-07], [1.7041e-07], [1.7097e-07], [64379], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7037798300825593e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929190079, 0.43113, [1.688e-07], [1.7134e-07], [1.6943e-07], [1.7059e-07], [59250], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.708548590689205e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929190293, 0.43051, [1.6998e-07], [1.7131e-07], [1.7059e-07], [1.7108e-07], [58836], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7071138782911116e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929190506, 0.45583, [1.6986e-07], [1.7116e-07], [1.7035e-07], [1.7092e-07], [64235], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7050682667895332e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929190734, 0.45732, [1.6947e-07], [1.7732e-07], [1.6992e-07], [1.7091e-07], [64163], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7009128098477326e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929190961, 0.43117, [1.6962e-07], [1.7049e-07], [1.6989e-07], [1.7027e-07], [59295], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001028991698694881], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929191175, 0.44413, [0.0010263], [0.0010344], [0.0010272], [0.0010305], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014355952132193905], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929191396, 0.43674, [0.0014324], [0.0014414], [0.001434], [0.0014389], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014122656248218846], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929191613, 0.4448, [0.0014101], [0.0014149], [0.0014113], [0.0014134], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1422091261864285e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929191838, 0.45627, [1.1399e-07], [1.146e-07], [1.1416e-07], [1.1437e-07], [95884], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1400060083075363e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929192066, 0.45621, [1.1367e-07], [1.1424e-07], [1.1381e-07], [1.1403e-07], [95706], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1452134145600497e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929192295, 0.45558, [1.1416e-07], [1.1504e-07], [1.1431e-07], [1.1468e-07], [95448], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929186329, 0.062459], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929186391, 0.062113], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929186453, 0.06242], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0032206458745349664], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929192524, 0.46723, [0.003216], [0.0032354], [0.0032187], [0.0032301], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0021276916988426818], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929192758, 0.44464, [0.0021175], [0.0021386], [0.0021259], [0.0021292], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006589817812709953], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929192984, 0.4381, [0.00065813], [0.0006609], [0.00065854], [0.00065946], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005480756578770908], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929193206, 0.44425, [0.00054296], [0.00055451], [0.00054674], [0.00055224], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.8107492053482504e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929193426, 0.44575, [2.7782e-05], [2.8388e-05], [2.7822e-05], [2.8382e-05], [376], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018721856988696873], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929193647, 0.44671, [0.00018603], [0.00018742], [0.00018675], [0.00018735], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2081507958520006e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929193869, 0.44626, [4.1961e-05], [4.2181e-05], [4.2054e-05], [4.2108e-05], [251], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003292923220508401], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929194092, 0.4345, [0.00032839], [0.00033001], [0.00032915], [0.0003295], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003938862114759664], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929194307, 0.43585, [0.00039303], [0.00039502], [0.00039349], [0.00039444], [26], [10]], "benchmarks.TextSuite.time_render": [[4.67366803080411e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929194524, 0.44448, [4.6629e-06], [4.6981e-06], [4.6695e-06], [4.6824e-06], [2324], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.52147363837603e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929194750, 0.44851, [8.4509e-05], [8.5671e-05], [8.4673e-05], [8.5466e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.3982782978399795e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929194976, 0.44814, [3.3718e-05], [3.4366e-05], [3.3793e-05], [3.4176e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028071735121901274], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929195201, 0.43931, [0.00027824], [0.0002819], [0.00027954], [0.00028166], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011520439438754693], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929195420, 0.44244, [0.0011413], [0.0011579], [0.0011428], [0.0011558], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015352291416742706], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929195640, 0.44684, [0.0015279], [0.0015493], [0.0015285], [0.001543], [7], [10]]}, "durations": {"": 1.9785568714141846}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/ea2ed337-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/ea2ed337-virtualenv-py3.10.json new file mode 100644 index 0000000000..6bc0b29086 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/ea2ed337-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "ea2ed337f20cc629a1754cf9bd5add1cce963aa6", "env_name": "virtualenv-py3.10", "date": 1614508821000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.699270445001639e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929075471, 0.45734, [1.6926e-07], [1.7112e-07], [1.6963e-07], [1.7036e-07], [64416], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.699839773562212e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929075698, 0.43261, [1.6948e-07], [1.7058e-07], [1.698e-07], [1.703e-07], [59354], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7042278704198481e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929075913, 0.443, [1.6889e-07], [1.8068e-07], [1.6978e-07], [1.7055e-07], [58643], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.705763073721423e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929076138, 0.45874, [1.7019e-07], [1.7101e-07], [1.7042e-07], [1.7085e-07], [64568], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.702604839791603e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929076368, 0.45921, [1.7003e-07], [1.7078e-07], [1.7014e-07], [1.7058e-07], [64480], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.7072115838546423e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929076598, 0.46008, [1.6907e-07], [1.7113e-07], [1.6997e-07], [1.7103e-07], [64594], [10]], "benchmarks.PrettySuite.time_pretty": [[0.000998844680990177], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929076828, 0.44798, [0.00099627], [0.0010007], [0.00099794], [0.0010004], [11], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014016875647939742], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929077049, 0.4507, [0.0013957], [0.0014115], [0.0013986], [0.0014056], [8], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.0014096432496444322], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929077275, 0.46141, [0.0013854], [0.0015002], [0.0013882], [0.0014767], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1421153209424056e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929077515, 0.45656, [1.1403e-07], [1.1434e-07], [1.1418e-07], [1.1429e-07], [95482], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1433014258269549e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929077745, 0.45743, [1.1383e-07], [1.1521e-07], [1.141e-07], [1.1513e-07], [95901], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1435027755203576e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929077975, 0.45838, [1.1408e-07], [1.1583e-07], [1.1425e-07], [1.1451e-07], [96188], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929071941, 0.06308], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929072005, 0.062548], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929072067, 0.062575], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002230391599005088], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929078204, 0.44757, [0.0022172], [0.0022376], [0.0022198], [0.0022335], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0013334635004866868], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929078424, 0.44529, [0.0013239], [0.0013418], [0.0013251], [0.0013393], [8], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006635794061367051], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929078652, 0.44234, [0.0006602], [0.0006677], [0.00066226], [0.00066413], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005476820002322232], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929078875, 0.4454, [0.00054475], [0.00055686], [0.00054718], [0.000549], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.5383448699057223e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929079097, 0.4544, [2.5288e-05], [2.5499e-05], [2.5327e-05], [2.5436e-05], [429], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018485990535580264], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929079324, 0.45031, [0.00018401], [0.0001883], [0.00018456], [0.00018533], [58], [10]], "benchmarks.TextSuite.time_fit": [[4.356627158749726e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929079550, 0.44868, [4.3497e-05], [4.3774e-05], [4.3551e-05], [4.3639e-05], [243], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.00032465213646928805], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929079773, 0.45029, [0.0003232], [0.00032532], [0.000324], [0.00032501], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.0003899706848810807], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929079997, 0.45063, [0.00038814], [0.00039324], [0.0003887], [0.00039139], [27], [10]], "benchmarks.TextSuite.time_render": [[4.688892462637974e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929080225, 0.44956, [4.6587e-06], [4.7619e-06], [4.6832e-06], [4.6925e-06], [2334], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.54899062687764e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929080454, 0.45461, [8.5025e-05], [8.625e-05], [8.5269e-05], [8.5618e-05], [128], [10]], "benchmarks.TextSuite.time_split": [[3.5189732112815946e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929080683, 0.44465, [3.5029e-05], [3.5386e-05], [3.5073e-05], [3.5325e-05], [308], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002749506709637659], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929080911, 0.44276, [0.00027375], [0.00027818], [0.00027477], [0.00027516], [38], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011060354008805007], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929081133, 0.44245, [0.001102], [0.0011275], [0.0011046], [0.0011078], [10], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.001495095215172374], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929081354, 0.44021, [0.0014861], [0.0015397], [0.0014886], [0.0015306], [7], [10]]}, "durations": {"": 2.011971950531006}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/ecf3d7f1-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/ecf3d7f1-virtualenv-py3.10.json new file mode 100644 index 0000000000..d595b1fcbf --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/ecf3d7f1-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "ecf3d7f1ca2b2a5ea9c36ce2b23ae576e0421b6c", "env_name": "virtualenv-py3.10", "date": 1610210649000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7077999653168063e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646929232564, 0.458, [1.7012e-07], [1.7158e-07], [1.7068e-07], [1.7101e-07], [64374], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.6982937646676327e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646929232792, 0.45662, [1.6942e-07], [1.7084e-07], [1.6969e-07], [1.7026e-07], [64528], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7052654030470147e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646929233021, 0.44838, [1.6924e-07], [1.7441e-07], [1.7033e-07], [1.7123e-07], [64769], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7015041488254633e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646929233250, 0.43117, [1.6926e-07], [1.7139e-07], [1.7011e-07], [1.7062e-07], [59060], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.697587509480688e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646929233463, 0.4559, [1.6815e-07], [1.7107e-07], [1.6936e-07], [1.7015e-07], [64506], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.6991487564124173e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646929233690, 0.45553, [1.6835e-07], [1.7012e-07], [1.6961e-07], [1.7007e-07], [64388], [10]], "benchmarks.PrettySuite.time_pretty": [[0.001027235398942139], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646929233918, 0.44392, [0.0010237], [0.0010528], [0.0010245], [0.0010322], [10], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [[0.0014370237851315843], [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646929234140, 0.43944, [0.0014294], [0.001443], [0.0014335], [0.0014399], [7], [10]], "benchmarks.PrettySuite.time_pretty_justify_center": [[0.001413072935974924], [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646929234361, 0.44625, [0.0014102], [0.0014161], [0.0014126], [0.0014138], [8], [10]], "benchmarks.StyleSuite.time_parse_ansi": [[1.1426199489369653e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646929234584, 0.45567, [1.1395e-07], [1.1463e-07], [1.1411e-07], [1.1435e-07], [96082], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1404432550273319e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646929234812, 0.45332, [1.1366e-07], [1.1486e-07], [1.1374e-07], [1.1425e-07], [95430], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1468818071279227e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646929235039, 0.45144, [1.1433e-07], [1.1506e-07], [1.1449e-07], [1.1491e-07], [94481], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646929229043, 0.061706], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646929229105, 0.061324], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646929229166, 0.06131], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.00323098437365843], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646929235266, 0.47115, [0.0032173], [0.0032577], [0.0032226], [0.0032412], [4], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0021215916989604008], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646929235501, 0.44386, [0.0021095], [0.002137], [0.0021168], [0.002129], [5], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006635260624534567], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646929235728, 0.43906, [0.00066063], [0.0006681], [0.00066311], [0.00066378], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005477850783407982], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646929235950, 0.44418, [0.00054434], [0.00055449], [0.00054663], [0.00055233], [19], [10]], "benchmarks.TextSuite.time_divide": [[2.801200657574411e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646929236172, 0.44711, [2.7945e-05], [2.8138e-05], [2.7973e-05], [2.8079e-05], [380], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018690168457269145], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646929236395, 0.44602, [0.00018657], [0.00018746], [0.00018683], [0.00018709], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.236125003080815e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646929236619, 0.44515, [4.1896e-05], [4.2414e-05], [4.2156e-05], [4.2394e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003301585966255516], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646929236841, 0.4353, [0.0003288], [0.00033281], [0.00033], [0.00033109], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [[0.00039432613490274747], [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646929237057, 0.43632, [0.00039179], [0.00039679], [0.00039239], [0.00039479], [26], [10]], "benchmarks.TextSuite.time_render": [[4.6828673070957585e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646929237274, 0.44713, [4.661e-06], [4.7966e-06], [4.6677e-06], [4.7109e-06], [2325], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.527165350749884e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646929237500, 0.44899, [8.4478e-05], [8.581e-05], [8.4744e-05], [8.5611e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.387963712861341e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646929237727, 0.4434, [3.3643e-05], [3.4116e-05], [3.3667e-05], [3.4045e-05], [310], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00027967287845771154], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646929237947, 0.43841, [0.00027815], [0.00028148], [0.00027903], [0.00028058], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011510138897897883], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646929238165, 0.44243, [0.0011488], [0.0011523], [0.0011499], [0.0011518], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015299910696090332], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646929238384, 0.44516, [0.001525], [0.0015332], [0.0015289], [0.0015324], [7], [10]]}, "durations": {"": 1.9623157978057861}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/ef80460f-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/ef80460f-virtualenv-py3.10.json new file mode 100644 index 0000000000..9c858e5154 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/ef80460f-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "ef80460f7fe69ae3342acdd04bf1d7c6154905cb", "env_name": "virtualenv-py3.10", "date": 1592140940000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [null, [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928515406, 0.059341], "benchmarks.ColorSuite.time_downgrade_to_standard": [null, [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928515466, 0.059205], "benchmarks.ColorSuite.time_downgrade_to_windows": [null, [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928515525, 0.057818], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [null, [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928515583, 0.058271], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [null, [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928515641, 0.0582], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [null, [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928515699, 0.058722], "benchmarks.PrettySuite.time_pretty": [null, [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928515758, 0.057699], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928515816, 0.05776], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928515874, 0.058446], "benchmarks.StyleSuite.time_parse_ansi": [null, [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928515932, 0.060185], "benchmarks.StyleSuite.time_parse_hex": [null, [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928515993, 0.059158], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [null, [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928516052, 0.060717], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928516113, 0.060003], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928516173, 0.058038], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928516231, 0.058081], "benchmarks.TableSuite.time_table_heavy_wrapping": [null, [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928516289, 0.058367], "benchmarks.TableSuite.time_table_no_wrapping": [null, [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928516347, 0.058493], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928516406, 0.058488], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928516464, 0.058101], "benchmarks.TextSuite.time_divide": [null, [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928516523, 0.057833], "benchmarks.TextSuite.time_divide_unicode_heavy": [null, [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928516581, 0.057799], "benchmarks.TextSuite.time_fit": [null, [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928516638, 0.058149], "benchmarks.TextSuite.time_fit_unicode_heavy": [null, [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928516697, 0.057886], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928516755, 0.05764], "benchmarks.TextSuite.time_render": [null, [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928516812, 0.057862], "benchmarks.TextSuite.time_render_unicode_heavy": [null, [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928516870, 0.058314], "benchmarks.TextSuite.time_split": [null, [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928516929, 0.058227], "benchmarks.TextSuite.time_split_unicode_heavy": [null, [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928516987, 0.057643], "benchmarks.TextSuite.time_wrapping": [null, [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928517045, 0.057652], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [null, [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928517102, 0.058088]}, "durations": {"": 1.9598910808563232}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/f2af8c9d-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/f2af8c9d-virtualenv-py3.10.json new file mode 100644 index 0000000000..b347b64ee5 --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/f2af8c9d-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "f2af8c9d54e9ebc14b32fe68ddaefd01b7e5a801", "env_name": "virtualenv-py3.10", "date": 1593189870000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7090032611931194e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928581804, 0.45125, [1.6925e-07], [1.737e-07], [1.7003e-07], [1.7229e-07], [64370], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7179477414374248e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928582031, 0.42397, [1.692e-07], [1.7388e-07], [1.7029e-07], [1.7347e-07], [59074], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.7208939259779103e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928582243, 0.44191, [1.7011e-07], [1.7798e-07], [1.7066e-07], [1.7366e-07], [64474], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7239909444505348e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928582459, 0.45005, [1.7032e-07], [1.7427e-07], [1.7127e-07], [1.7388e-07], [64149], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.70657668752433e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928582684, 0.43995, [1.695e-07], [1.7556e-07], [1.7003e-07], [1.7379e-07], [64588], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.734254661392709e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928582908, 0.42643, [1.723e-07], [1.7588e-07], [1.7309e-07], [1.7398e-07], [58470], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002222458299365826], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928583119, 0.43708, [0.0021951], [0.0022573], [0.0021987], [0.0022453], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928578060, 0.058079], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928578118, 0.057923], "benchmarks.StyleSuite.time_parse_ansi": [[1.1513858785141599e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928583333, 0.43617, [1.1404e-07], [1.1633e-07], [1.1435e-07], [1.1599e-07], [95564], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.1389109408082052e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928583555, 0.44783, [1.1341e-07], [1.1419e-07], [1.137e-07], [1.1401e-07], [96441], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.1519537423832971e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928583779, 0.45007, [1.1382e-07], [1.1617e-07], [1.1453e-07], [1.16e-07], [96177], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928578838, 0.057826], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928578896, 0.057477], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928578954, 0.057369], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.0020461542007979006], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928584006, 0.42367, [0.0020262], [0.0020663], [0.0020273], [0.0020609], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0014474494299585266], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928584221, 0.42346, [0.0014278], [0.0014642], [0.0014312], [0.0014614], [7], [10]], "benchmarks.TextSuite.time_align_center": [null, [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928579431, 0.058086], "benchmarks.TextSuite.time_align_center_unicode_heavy": [null, [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928579489, 0.058209], "benchmarks.TextSuite.time_divide": [[2.8270778226057495e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928584434, 0.44278, [2.8239e-05], [2.8318e-05], [2.8254e-05], [2.8294e-05], [381], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00019030226317945083], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928584655, 0.44236, [0.00018943], [0.00019048], [0.00019006], [0.0001904], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.197533399565145e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928584876, 0.43825, [4.1857e-05], [4.2052e-05], [4.1951e-05], [4.202e-05], [250], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003304659242558321], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928585094, 0.44625, [0.00032819], [0.00033206], [0.00032901], [0.0003318], [33], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928580435, 0.058736], "benchmarks.TextSuite.time_render": [[4.689809716245229e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928585317, 0.44093, [4.6839e-06], [4.7022e-06], [4.6889e-06], [4.6939e-06], [2336], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.54896653744238e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928585542, 0.44084, [8.4727e-05], [8.5865e-05], [8.5157e-05], [8.5817e-05], [127], [10]], "benchmarks.TextSuite.time_split": [[3.415601445179301e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928585763, 0.43741, [3.377e-05], [3.4525e-05], [3.3842e-05], [3.4403e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.0002846767971720043], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928585980, 0.4332, [0.00027899], [0.00029414], [0.00028309], [0.00028554], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011558448911980828], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928586195, 0.43605, [0.001148], [0.0011654], [0.0011495], [0.0011592], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015459464297496845], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928586412, 0.4395, [0.0015209], [0.001555], [0.0015443], [0.0015473], [7], [10]]}, "durations": {"": 1.9649710655212402}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/f84d5dee-virtualenv-py3.10.json b/benchmarks/results/darrenburns-2022-mbp/f84d5dee-virtualenv-py3.10.json new file mode 100644 index 0000000000..9a764ff25f --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/f84d5dee-virtualenv-py3.10.json @@ -0,0 +1 @@ +{"commit_hash": "f84d5dee6ad9bc57a8c67ded51c1ecd03677e65f", "env_name": "virtualenv-py3.10", "date": 1594567562000, "params": {"arch": "arm64", "cpu": "Apple M1 Pro", "machine": "darrenburns-2022-mbp", "num_cpu": "10", "os": "Darwin 21.2.0", "ram": "17179869184", "python": "3.10"}, "python": "3.10", "requirements": {}, "env_vars": {}, "result_columns": ["result", "params", "version", "started_at", "duration", "stats_ci_99_a", "stats_ci_99_b", "stats_q_25", "stats_q_75", "stats_number", "stats_repeat", "samples", "profile"], "results": {"benchmarks.ColorSuite.time_downgrade_to_eight_bit": [[1.7308245811986438e-07], [], "019b972f782c6291df9a6a4dea9bb3c6268a69b177e71383d6e19a608e84920d", 1646928688709, 0.42495, [1.7163e-07], [1.7365e-07], [1.7253e-07], [1.736e-07], [58836], [10]], "benchmarks.ColorSuite.time_downgrade_to_standard": [[1.7283182735333509e-07], [], "f5e8556491c977450fff6ebfd9fff4fc8f12d74829aa5b8570bd27ea7a1c9d28", 1646928688920, 0.42508, [1.7195e-07], [1.7396e-07], [1.7243e-07], [1.736e-07], [58984], [10]], "benchmarks.ColorSuite.time_downgrade_to_windows": [[1.736048608512918e-07], [], "373eb97dd7ce2823e080972249235f528e8b3a47210911981cf432ecf0eef5fb", 1646928689131, 0.4312, [1.7268e-07], [1.745e-07], [1.7343e-07], [1.7372e-07], [64495], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_eight_bit": [[1.7323692227504577e-07], [], "716ff06a471a5d90af3730f6d4470eba3577432d781e0210dff1fd156b8c549c", 1646928689346, 0.42883, [1.7185e-07], [1.7397e-07], [1.7286e-07], [1.7349e-07], [59222], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_standard": [[1.7355385467604052e-07], [], "3a752a7884e99e095c31b2a28cfefdf916cb2033c06afae1ea146a72f3ba650c", 1646928689560, 0.42434, [1.7258e-07], [1.7408e-07], [1.7319e-07], [1.7371e-07], [58463], [10]], "benchmarks.ColorSuiteCached.time_downgrade_to_windows": [[1.715436641188842e-07], [], "1732bbd18ada49eb7b054fc18b40d6acfb533023463366f37203dab6fbb0cc20", 1646928689771, 0.43156, [1.6853e-07], [1.7437e-07], [1.6926e-07], [1.7389e-07], [58160], [10]], "benchmarks.PrettySuite.time_pretty": [[0.002244716600398533], [], "9bb0e6d8a29aad21b3d1b550a160fa5f1e9030c69d16bad500c0dcc77bff6d01", 1646928689989, 0.44204, [0.0022307], [0.0022562], [0.002235], [0.0022495], [5], [10]], "benchmarks.PrettySuite.time_pretty_indent_guides": [null, [], "8d71bf19dfe999b0fba95d009986bfd6911c53c7a0c455466725f553005c3bc7", 1646928684657, 0.058707], "benchmarks.PrettySuite.time_pretty_justify_center": [null, [], "54cbf71bacab14ccbe1d063847c0b89198ed1bbe06edc89c14d2e3c7b1986c41", 1646928684715, 0.058484], "benchmarks.StyleSuite.time_parse_ansi": [[1.1733243976283779e-07], [], "a003aaa8017585efeb1cd9c43351282df4df6249bf28a4c447b1304d984aa753", 1646928690208, 0.42793, [1.1623e-07], [1.1849e-07], [1.1628e-07], [1.1839e-07], [87661], [10]], "benchmarks.StyleSuite.time_parse_hex": [[1.156367285738817e-07], [], "cf5a3f0def435d3da5bc3a6e7549c44c0a02e9cce6c00ecde8dd7f527556f8ca", 1646928690423, 0.42339, [1.1408e-07], [1.1679e-07], [1.1448e-07], [1.158e-07], [87703], [10]], "benchmarks.StyleSuite.time_parse_mixed_complex_style": [[1.140869263406167e-07], [], "01c9e12ae829b1984e55a5aeef1a9ae6f1461577adaf5ae59f06358c8b52802f", 1646928690636, 0.44843, [1.1369e-07], [1.1458e-07], [1.1383e-07], [1.1421e-07], [96087], [10]], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_heavy_wrapping": [null, [], "1ed4d74ea424990cfb40c96f07635f9bcf7b8bacc7ade5204aaf96363e1622ee", 1646928685422, 0.05832], "benchmarks.SyntaxWrappingSuite.time_text_thin_terminal_medium_wrapping": [null, [], "0880e162a4907ee025cef8ac3380502554fde27fd0c90a4c15cebc9c27f3e333", 1646928685480, 0.057904], "benchmarks.SyntaxWrappingSuite.time_text_wide_terminal_no_wrapping": [null, [], "feb11e94ae6a75de2dee899fb93db098b55cde232710660d7d66f9e2b288d9c0", 1646928685538, 0.058164], "benchmarks.TableSuite.time_table_heavy_wrapping": [[0.002110837498912588], [], "ca515a9739c1e0f8eb922420f9f9caf27321fb13c8bd0bc49b207a0588b370de", 1646928690861, 0.43483, [0.0020988], [0.0021232], [0.0021039], [0.0021191], [5], [10]], "benchmarks.TableSuite.time_table_no_wrapping": [[0.0015061160707513668], [], "8842a5f141d8208ba2bab66e4973e978cb5d0615f326af5d70385ff8fa44b3b9", 1646928691080, 0.4351, [0.0014983], [0.0015589], [0.0015026], [0.001546], [7], [10]], "benchmarks.TextSuite.time_align_center": [[0.0006713476559525589], [], "1ceeeef2de43fcb3d0dfec409972d8f0eb791e9615fa9f9c959e0423725b089b", 1646928691301, 0.43813, [0.00066814], [0.00067522], [0.00067029], [0.00067237], [16], [10]], "benchmarks.TextSuite.time_align_center_unicode_heavy": [[0.0005598946946621356], [], "a83ff79614dd2ae17e8b68f45981fcaa0d9833c59a7a14f171b896cf970f54ce", 1646928691524, 0.427, [0.00055817], [0.00056303], [0.0005592], [0.00056025], [18], [10]], "benchmarks.TextSuite.time_divide": [[2.8021105220420404e-05], [], "dcc120b921cb2ec77632f8fe2f6f4150d479cb49ef2608f8e86b569a937756e9", 1646928691735, 0.44378, [2.7666e-05], [2.8357e-05], [2.7709e-05], [2.8332e-05], [385], [10]], "benchmarks.TextSuite.time_divide_unicode_heavy": [[0.00018865752632304895], [], "ea53e662c0553324f90ac3336dcee77f733bb33638888e1f84bf71945a2f3f8e", 1646928691958, 0.44155, [0.00018633], [0.0001911], [0.00018676], [0.00019085], [57], [10]], "benchmarks.TextSuite.time_fit": [[4.2210779327669215e-05], [], "ec77b412db357b1e1c1e7bc620b941dddfc36dc76d2a66a0417feae4f21fe1d3", 1646928692180, 0.43567, [4.2056e-05], [4.247e-05], [4.211e-05], [4.2259e-05], [247], [10]], "benchmarks.TextSuite.time_fit_unicode_heavy": [[0.0003338414028422126], [], "d1574b4af2ef8b80b95b4dbeeb13e5de67b66783f76f9968834776239dd0dc66", 1646928692397, 0.43078, [0.00032913], [0.00033781], [0.00033063], [0.00033694], [31], [10]], "benchmarks.TextSuite.time_indent_guides": [null, [], "18da036dcfc15ec5e3c11e72be7c8f0c22fba695a5f19c95836be36952376cf2", 1646928687337, 0.058208], "benchmarks.TextSuite.time_render": [[4.675831319804382e-06], [], "907d30581cfdc7bb2c4d302b7e3cb474aaefd8b84821365fe105af7d82be3b09", 1646928692609, 0.44535, [4.6576e-06], [4.6958e-06], [4.671e-06], [4.6811e-06], [2321], [10]], "benchmarks.TextSuite.time_render_unicode_heavy": [[8.689120084019456e-05], [], "b3f1c09dfd06f412a20dacfe378c3b446727c7d4f9a975336eab3daa8543e1cb", 1646928692832, 0.42073, [8.621e-05], [8.7267e-05], [8.6719e-05], [8.6998e-05], [117], [10]], "benchmarks.TextSuite.time_split": [[3.4412112531710386e-05], [], "9c165854130cb95fea5491ffcd8b580a5bd373149da2ef8aace0e9480f649854", 1646928693042, 0.44146, [3.4288e-05], [3.4483e-05], [3.4334e-05], [3.4456e-05], [311], [10]], "benchmarks.TextSuite.time_split_unicode_heavy": [[0.00028140595964646926], [], "d55b02f6d06f478d70635bac3409f3a9899137d9cee87a70a293b8ccf5a6afa4", 1646928693261, 0.4316, [0.00027816], [0.00028493], [0.00027863], [0.00028367], [37], [10]], "benchmarks.TextSuite.time_wrapping": [[0.0011629745551747167], [], "8c821eba13d043f228fd902d8f678c397741855db05d02abe9b82f3d65cdf03d", 1646928693475, 0.43828, [0.0011575], [0.0011677], [0.0011586], [0.001166], [9], [10]], "benchmarks.TextSuite.time_wrapping_unicode_heavy": [[0.0015502648581917], [], "ec6e2ef08b6cdee182fef4e26c0043f8c365984f9a31be07dbd792e1aed862d8", 1646928693693, 0.44103, [0.0015466], [0.0015531], [0.0015491], [0.0015513], [7], [10]]}, "durations": {"": 1.960265874862671}, "version": 2} diff --git a/benchmarks/results/darrenburns-2022-mbp/machine.json b/benchmarks/results/darrenburns-2022-mbp/machine.json new file mode 100644 index 0000000000..f507dfb9db --- /dev/null +++ b/benchmarks/results/darrenburns-2022-mbp/machine.json @@ -0,0 +1,9 @@ +{ + "arch": "arm64", + "cpu": "Apple M1 Pro", + "machine": "darrenburns-2022-mbp", + "num_cpu": "10", + "os": "Darwin 21.2.0", + "ram": "17179869184", + "version": 1 +} diff --git a/benchmarks/snippets.py b/benchmarks/snippets.py new file mode 100644 index 0000000000..ef72dbcff9 --- /dev/null +++ b/benchmarks/snippets.py @@ -0,0 +1,173 @@ +PYTHON_SNIPPET = ''' +def layout_resolve(total: int, edges: Sequence[EdgeProtocol]) -> List[int]: + """Divide total space to satisfy size, fraction, and min_size, constraints. + + The returned list of integers should add up to total in most cases, unless it is + impossible to satisfy all the constraints. For instance, if there are two edges + with a minimum size of 20 each and `total` is 30 then the returned list will be + greater than total. In practice, this would mean that a Layout object would + clip the rows that would overflow the screen height. + + Args: + total (int): Total number of characters. + edges (Sequence[Edge]): Edges within total space. + + Returns: + list[int]: Number of characters for each edge. + """ + # Size of edge or None for yet to be determined + sizes = [(edge.size or None) for edge in edges] + + if None not in sizes: + # No flexible edges + return cast("list[int]", sizes) + + # Get flexible edges and index to map these back on to sizes list + flexible_edges = [ + (index, edge) + for index, (size, edge) in enumerate(zip(sizes, edges)) + if size is None + ] + # Remaining space in total + remaining = total - sum([size or 0 for size in sizes]) + if remaining <= 0: + # No room for flexible edges + return [ + ((edge.min_size or 1) if size is None else size) + for size, edge in zip(sizes, edges) + ] + + # Get the total fraction value for all flexible edges + total_flexible = sum([(edge.fraction or 1) for _, edge in flexible_edges]) + while flexible_edges: + # Calculate number of characters in a ratio portion + portion = Fraction(remaining, total_flexible) + + # If any edges will be less than their minimum, replace size with the minimum + for flexible_index, (index, edge) in enumerate(flexible_edges): + if portion * edge.fraction < edge.min_size: + # This flexible edge will be smaller than its minimum size + # We need to fix the size and redistribute the outstanding space + sizes[index] = edge.min_size + remaining -= edge.min_size + total_flexible -= edge.fraction or 1 + del flexible_edges[flexible_index] + # New fixed size will invalidate calculations, so we need to repeat the process + break + else: + # Distribute flexible space and compensate for rounding error + # Since edge sizes can only be integers we need to add the remainder + # to the following line + remainder = Fraction(0) + for index, edge in flexible_edges: + sizes[index], remainder = divmod(portion * edge.fraction + remainder, 1) + break + + # Sizes now contains integers only + return cast("list[int]", sizes) +''' + +PYTHON_DICT = { + "glossary": { + "title": "example glossary", + "GlossDiv": { + "title": "S", + "GlossList": { + "GlossEntry": { + "ID": "SGML", + "SortAs": "SGML", + "GlossTerm": "Standard Generalized Markup Language", + "Acronym": "SGML", + "Abbrev": "ISO 8879:1986", + "GlossDef": { + "para": "A meta-markup language, used to create markup languages such as DocBook.", + "GlossSeeAlso": ["GML", "XML"], + }, + "GlossSee": "markup", + } + }, + }, + } +} + +LOREM_IPSUM = """ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Laoreet id donec ultrices tincidunt arcu. Eu facilisis sed odio morbi quis commodo odio aenean sed. Amet cursus sit amet dictum. Gravida rutrum quisque non tellus. Semper auctor neque vitae tempus quam pellentesque nec nam. Mauris sit amet massa vitae tortor condimentum lacinia quis. Adipiscing elit ut aliquam purus sit amet luctus venenatis lectus. Consectetur adipiscing elit ut aliquam purus sit amet. Sit amet mauris commodo quis imperdiet massa tincidunt nunc pulvinar. Dui faucibus in ornare quam viverra. Et netus et malesuada fames ac turpis. A lacus vestibulum sed arcu non odio euismod. In massa tempor nec feugiat nisl pretium fusce. + +Tellus in hac habitasse platea dictumst vestibulum. Feugiat nibh sed pulvinar proin. In cursus turpis massa tincidunt dui ut. Fermentum posuere urna nec tincidunt praesent semper feugiat. Interdum consectetur libero id faucibus. Habitant morbi tristique senectus et netus et malesuada fames ac. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Aliquam faucibus purus in massa tempor. Tellus pellentesque eu tincidunt tortor aliquam nulla. Sem et tortor consequat id porta nibh. Massa id neque aliquam vestibulum morbi blandit cursus risus. Ut placerat orci nulla pellentesque dignissim enim. Nibh tellus molestie nunc non blandit massa enim nec dui. Ipsum a arcu cursus vitae congue mauris rhoncus aenean vel. Egestas congue quisque egestas diam in. + +Pulvinar mattis nunc sed blandit libero volutpat sed. Accumsan in nisl nisi scelerisque eu. Eget aliquet nibh praesent tristique. Ipsum suspendisse ultrices gravida dictum fusce ut. Non sodales neque sodales ut etiam sit amet. Velit egestas dui id ornare. Massa ultricies mi quis hendrerit dolor magna. Id volutpat lacus laoreet non curabitur gravida arcu. Nulla facilisi cras fermentum odio eu feugiat pretium. Sed vulputate odio ut enim blandit volutpat. Amet massa vitae tortor condimentum lacinia. Tellus integer feugiat scelerisque varius. Quam nulla porttitor massa id. Facilisi cras fermentum odio eu feugiat pretium nibh ipsum. Eget nunc scelerisque viverra mauris in aliquam sem fringilla. Amet nulla facilisi morbi tempus iaculis urna id volutpat lacus. Facilisi etiam dignissim diam quis enim lobortis. + +Nullam vehicula ipsum a arcu cursus vitae congue mauris rhoncus. Ullamcorper a lacus vestibulum sed arcu non. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Integer feugiat scelerisque varius morbi enim. Posuere urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Lobortis feugiat vivamus at augue eget. Rhoncus dolor purus non enim praesent. Mi in nulla posuere sollicitudin aliquam ultrices sagittis orci. Mollis aliquam ut porttitor leo. Id cursus metus aliquam eleifend mi in nulla. Integer eget aliquet nibh praesent tristique magna sit amet. Egestas maecenas pharetra convallis posuere morbi. + +Blandit massa enim nec dui. Suscipit tellus mauris a diam maecenas. Sed id semper risus in. Purus faucibus ornare suspendisse sed nisi lacus. At in tellus integer feugiat. Egestas diam in arcu cursus euismod quis viverra nibh cras. Enim tortor at auctor urna nunc id. Tristique nulla aliquet enim tortor at auctor urna nunc id. Purus gravida quis blandit turpis cursus in hac habitasse platea. Ac turpis egestas integer eget. Tortor at auctor urna nunc. Neque aliquam vestibulum morbi blandit cursus. Massa tempor nec feugiat nisl pretium fusce id velit. Interdum consectetur libero id faucibus nisl tincidunt. Adipiscing diam donec adipiscing tristique risus nec feugiat in. Egestas integer eget aliquet nibh praesent tristique magna sit. +""" + +UNICODE_HEAVY_TEXT = """ +Richは、 _リッチ_ なテキストや美しい書式設定をターミナルで行うためのPythonライブラリです。 + +[Rich API](https://rich.readthedocs.io/en/latest/)を使用すると、ターミナルの出力に色やスタイルを簡単に追加することができます。 Richはきれいなテーブル、プログレスバー、マークダウン、シンタックスハイライトされたソースコード、トレースバックなどをすぐに生成・表示することもできます。 + +![機能](https://github.com/willmcgugan/rich/raw/master/imgs/features.png) + +Richの紹介動画はこちらをご覧ください。 [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88). + +[Richについての人々の感想を見る。](https://www.willmcgugan.com/blog/pages/post/rich-tweets/) + +## 互換性 + +RichはLinux、OSX、Windowsに対応しています。True colorと絵文字は新しい Windows ターミナルで動作しますが、古いターミナルでは8色に制限されています。Richを使用するにはPythonのバージョンは3.6.3以降が必要です。 + +Richは追加の設定を行わずとも、[Jupyter notebooks](https://jupyter.org/)で動作します。 + +## インストール + +`pip` や、あなたのお気に入りのPyPIパッケージマネージャを使ってインストールしてください。 + +```sh +python -m pip install rich +``` + +以下のコマンドを実行して、ターミナルでリッチの出力をテストできます: + +```sh +python -m rich +``` + +## Richのprint関数 + +簡単にリッチな出力をアプリケーションに追加するには、Pythonの組み込み関数と同じ名前を持つ [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) メソッドをインポートすることで実現できます。こちらを試してみてください: + +```python +from rich import print + +print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) +``` + +![Hello World](https://github.com/willmcgugan/rich/raw/master/imgs/print.png) + +## Rich REPL + +RichはPythonのREPLでインストールすることができ、データ構造がきれいに表示され、ハイライトされます。 + +```python +>>> from rich import pretty +>>> pretty.install() +``` + +![REPL](https://github.com/willmcgugan/rich/raw/master/imgs/repl.png) + +## Rich Inspect + +RichにはPythonオブジェクトやクラス、インスタンス、組み込み関数などに関するレポートを作成することができる、[inspect関数](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect)があります。 + +の使い方 + +リッチなターミナルコンテンツをより制御していくには、[Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) オブジェクトをインポートして構築していきます。 + +Console オブジェクトには `print` メソッドがあり、これは組み込み関数の `print` と意図的に似たインターフェイスを持っています。 +以下に使用例を示します: + +あなたが予想した通り、これは `"Hello World!"` をターミナルに表示します。組み込み関数の `print` とは異なり、Rich はターミナルの幅に合わせてテキストをワードラップすることに注意してください。 + +出力結果に色やスタイルを追加する方法はいくつかあります。キーワード引数に `style` を追加することで、出力結果全体のスタイルを設定することができます。以下に例を示します: +""" diff --git a/docs/images/svg_export.svg b/docs/images/svg_export.svg new file mode 100644 index 0000000000..152187ba1a --- /dev/null +++ b/docs/images/svg_export.svg @@ -0,0 +1,545 @@ + + + Rich + + + + + + +                                                         Rich features                                                          +                                                                                                                               +    Colors    ✓ 4-bit color                   +              ✓ 8-bit color                   +              ✓ Truecolor (16.7 million)      +              ✓ Dumb terminals                +              ✓ Automatic color conversion    +                                                                                                                               +    Styles    All ansi styles: bolddimitalicunderlinestrikethroughreverse, and even blink.                           +                                                                                                                               +     Text     Word wrap text. Justify leftcenterright or full.                                                             +                                                                                                                               +              Lorem ipsum dolor sit amet, Lorem ipsum dolor sit amet,      Lorem ipsum dolor sit Lorem ipsum dolor sit  amet,  +              consectetur adipiscing        consectetur adipiscing             amet, consectetur consectetur adipiscing elit.  +              elit. Quisque in metus sed  elit. Quisque in metus sed    adipiscing elit. Quisque Quisque in metus sed  sapien  +              sapien ultricies pretium a  sapien ultricies pretium a         in metus sed sapien ultricies   pretium   a   at  +              at justo. Maecenas luctus    at justo. Maecenas luctus      ultricies pretium a at justo. Maecenas luctus velit  +              velit et auctor maximus.     velit et auctor maximus.       justo. Maecenas luctus et auctor maximus.            +                                                                        velit et auctor maximus.                               +                                                                                                                               +    Asian     🇨🇳  该库支持中文,日文和韩文文本!                                                                               +   language   🇯🇵  ライブラリは中国語、日本語、韓国語のテキストをサポートしています                                             +   support    🇰🇷  이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다                                                 +                                                                                                                               +    Markup    Rich supports a simple bbcode-like markup for colorstyle, and emoji! 👍 🍎 🐜 🐻 🥖 🚌                         +                                                                                                                               +    Tables     Date           Title                                 Production Budget       Box Office                         +              ─────────────────────────────────────────────────────────────────────────────────────────                        +               Dec 20, 2019   Star Wars: The Rise of Skywalker           $275,000,000     $375,126,118                         +               May 25, 2018   Solo: A Star Wars Story                    $275,000,000     $393,151,347                         +               Dec 15, 2017   Star Wars Ep. VIII: The Last Jedi          $262,000,000   $1,332,539,889                         +               May 19, 1999   Star Wars Ep. IThe phantom Menace        $115,000,000   $1,027,044,677                         +                                                                                                                               +    Syntax       1 def iter_last(values: Iterable[T]) -> Iterable[Tup  {                                                       + highlighting    2 │   """Iterate and generate a tuple with a flag fo  │   'foo'[                                            +      &          3 │   iter_values = iter(values)                      │   │   3.1427,                                         +    pretty       4 │   try:                                            │   │   (                                               +   printing      5 │   │   previous_value = next(iter_values)          │   │   │   'Paul Atreides',                            +                 6 │   except StopIteration:                           │   │   │   'Vladimir Harkonnen',                       +                 7 │   │   return                                      │   │   │   'Thufir Hawat'                              +                 8 │   for value in iter_values:                       │   │   )                                               +                 9 │   │   yield False, previous_value                 │   ],                                                  +                10 │   │   previous_value = value                      │   'atomic'(FalseTrueNone)                       +                11 │   yield True, previous_value                      }                                                       +                                                                                                                               +   Markdown   # Markdown                                               ╔════════════════════════════════════════════════════╗  +                                                                       ║                      Markdown                      ║  +              Supports much of the *markdown* __syntax__!              ╚════════════════════════════════════════════════════╝  +                                                                                                                               +              - Headers                                                Supports much of the markdown syntax!                   +              - Basic formatting: **bold**, *italic*, `code`                                                                   +              - Block quotes                                            • Headers                                              +              - Lists, and more...                                      • Basic formatting: bolditaliccode                 +                                                                        • Block quotes                                         +                                                                        • Lists, and more...                                   +                                                                                                                               +    +more!    Progress bars, columns, styled logging handler, tracebacks, etc...                                               +                                                                                                                               + + + diff --git a/docs/requirements.txt b/docs/requirements.txt index a5572ca254..6688094b2e 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ alabaster==0.7.12 -Sphinx==3.3.1 -sphinx-rtd-theme==0.5.0 +Sphinx==4.5.0 +sphinx-rtd-theme==1.0.0 +sphinx-copybutton==0.5.0 diff --git a/docs/source/conf.py b/docs/source/conf.py index 928b4d9d2b..472d695e38 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -19,7 +19,6 @@ import pkg_resources - import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" @@ -43,7 +42,9 @@ "sphinx.ext.autodoc", "sphinx.ext.viewcode", "sphinx.ext.napoleon", + "sphinx.ext.intersphinx", "sphinx.ext.autosectionlabel", + "sphinx_copybutton", ] # Add any paths that contain templates here, relative to this directory. @@ -68,3 +69,9 @@ html_static_path = ["_static"] intersphinx_mapping = {"python": ("http://docs.python.org/3", None)} + +autodoc_typehints = "description" + +html_css_files = [ + "https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/fira_code.min.css" +] diff --git a/docs/source/console.rst b/docs/source/console.rst index c7bd3f0b90..d3df2828ba 100644 --- a/docs/source/console.rst +++ b/docs/source/console.rst @@ -1,7 +1,7 @@ Console API =========== -For complete control over terminal formatting, Rich offers a :class:`~rich.console.Console` class. Most applications will require a single Console instance, so you may want to create one at the module level or as an attribute of your top-level object. For example, you could add a file called "console.py" to your project:: +For complete control over terminal formatting, Rich offers a :class:`~rich.console.Console` class. Most applications will require a single Console instance, so you may want to create one at the module level or as an attribute of your top-level object. For example, you could add a file called "console.py" to your project:: from rich.console import Console console = Console() @@ -52,7 +52,7 @@ To write rich content to the terminal use the :meth:`~rich.console.Console.print console.print(locals()) console.print("FOO", style="white on blue") -You can also use :meth:`~rich.console.Console.print` to render objects that support the :ref:`protocol`, which includes Rich's built in objects such as :class:`~rich.text.Text`, :class:`~rich.table.Table`, and :class:`~rich.syntax.Syntax` -- or other custom objects. +You can also use :meth:`~rich.console.Console.print` to render objects that support the :ref:`protocol`, which includes Rich's built-in objects such as :class:`~rich.text.Text`, :class:`~rich.table.Table`, and :class:`~rich.syntax.Syntax` -- or other custom objects. Logging @@ -69,6 +69,28 @@ The :meth:`~rich.console.Console.log` methods offers the same capabilities as pr To help with debugging, the log() method has a ``log_locals`` parameter. If you set this to ``True``, Rich will display a table of local variables where the method was called. + +Printing JSON +------------- + +The :meth:`~rich.console.Console.print_json` method will pretty print (format and style) a string containing JSON. Here's a short example:: + + console.print_json('[false, true, null, "foo"]') + +You can also *log* json by logging a :class:`~rich.json.JSON` object:: + + from rich.json import JSON + console.log(JSON('["foo", "bar"]')) + +Because printing JSON is a common requirement, you may import ``print_json`` from the main namespace:: + + from rich import print_json + +You can also pretty print JSON via the command line with the following:: + + python -m rich.json cats.json + + Low level output ---------------- @@ -79,10 +101,46 @@ Here's an example:: >>> console.out("Locals", locals()) +Rules +----- + +The :meth:`~rich.console.Console.rule` method will draw a horizontal line with an optional title, which is a good way of dividing your terminal output in to sections. + + >>> console.rule("[bold red]Chapter 2") + +.. raw:: html + +

─────────────────────────────── Chapter 2 ───────────────────────────────
+ +The rule method also accepts a ``style`` parameter to set the style of the line, and an ``align`` parameter to align the title ("left", "center", or "right"). + + +Status +------ + +Rich can display a status message with a 'spinner' animation that won't interfere with regular console output. Run the following command for a demo of this feature:: + + python -m rich.status + +To display a status message, call :meth:`~rich.console.Console.status` with the status message (which may be a string, Text, or other renderable). The result is a context manager which starts and stop the status display around a block of code. Here's an example:: + + with console.status("Working..."): + do_work() + +You can change the spinner animation via the ``spinner`` parameter:: + + with console.status("Monkeying around...", spinner="monkey"): + do_work() + +Run the following command to see the available choices for ``spinner``:: + + python -m rich.spinner + + Justify / Alignment ------------------- -Both print and log support a ``justify`` argument which if set must be one of "default", "left", "right", "center", or "full". If "left", any text printed (or logged) will be left aligned, if "right" text will be aligned to the right of the terminal, if "center" the text will be centered, and if "full" the text will be lined up with both the left and right edges of the terminal (like printed text in a book). +Both print and log support a ``justify`` argument which if set must be one of "default", "left", "right", "center", or "full". If "left", any text printed (or logged) will be left aligned, if "right" text will be aligned to the right of the terminal, if "center" the text will be centered, and if "full" the text will be lined up with both the left and right edges of the terminal (like printed text in a book). The default for ``justify`` is ``"default"`` which will generally look the same as ``"left"`` but with a subtle difference. Left justify will pad the right of the text with spaces, while a default justify will not. You will only notice the difference if you set a background color with the ``style`` argument. The following example demonstrates the difference:: @@ -103,7 +161,7 @@ This produces the following output:
Rich
     Rich                
-            Rich         
+            Rich        
                     Rich
     
@@ -112,7 +170,7 @@ Overflow Overflow is what happens when text you print is larger than the available space. Overflow may occur if you print long 'words' such as URLs for instance, or if you have text inside a panel or table cell with restricted space. -You can specify how Rich should handle overflow with the ``overflow`` argument to :meth:`~rich.console.Console.print` which should be one of the following strings: "fold", "crop", "ellipsis", or "ignore". The default is "fold" which will put any excess characters on the following line, creating as many new lines as required to fit the text. +You can specify how Rich should handle overflow with the ``overflow`` argument to :meth:`~rich.console.Console.print` which should be one of the following strings: "fold", "crop", "ellipsis", or "ignore". The default is "fold" which will put any excess characters on the following line, creating as many new lines as required to fit the text. The "crop" method truncates the text at the end of the line, discarding any characters that would overflow. @@ -152,10 +210,20 @@ This produces the following output: You can also set overflow to "ignore" which allows text to run on to the next line. In practice this will look the same as "crop" unless you also set ``crop=False`` when calling :meth:`~rich.console.Console.print`. +Console style +------------- + +The Console has a ``style`` attribute which you can use to apply a style to everything you print. By default ``style`` is None meaning no extra style is applied, but you can set it to any valid style. Here's an example of a Console with a style attribute set:: + + from rich.console import Console + blue_console = Console(style="white on blue") + blue_console.print("I'm blue. Da ba dee da ba di.") + + Soft Wrapping ------------- -Rich word wraps text you print by inserting line breaks. You can disable this behavior by setting ``soft_wrap=True`` when calling :meth:`~rich.console.Console.print`. With *soft wrapping* enabled any text that doesn't fit will run on to the following line(s), just like the builtin ``print``. +Rich word wraps text you print by inserting line breaks. You can disable this behavior by setting ``soft_wrap=True`` when calling :meth:`~rich.console.Console.print`. With *soft wrapping* enabled any text that doesn't fit will run on to the following line(s), just like the built-in ``print``. Cropping @@ -164,41 +232,83 @@ Cropping The :meth:`~rich.console.Console.print` method has a boolean ``crop`` argument. The default value for crop is True which tells Rich to crop any content that would otherwise run on to the next line. You generally don't need to think about cropping, as Rich will resize content to fit within the available width. .. note:: - Cropping is automatically disabled if you print with ``soft_wrap==True``. + Cropping is automatically disabled if you print with ``soft_wrap=True``. Input ----- -The console class has an :meth:`~rich.console.Console.input` which works in the same way as Python's builtin ``input()`` method, but can use anything that Rich can print as a prompt. For example, here's a colorful prompt with an emoji:: +The console class has an :meth:`~rich.console.Console.input` method which works in the same way as Python's built-in :func:`input` function, but can use anything that Rich can print as a prompt. For example, here's a colorful prompt with an emoji:: from rich.console import Console console = Console() console.input("What is [i]your[/i] [bold red]name[/]? :smiley: ") +If Python's builtin :mod:`readline` module is previously loaded, elaborate line editing and history features will be available. + Exporting --------- -The Console class can export anything written to it as either text or html. To enable exporting, first set ``record=True`` on the constructor. This tells Rich to save a copy of any data you ``print()`` or ``log()``. Here's an example:: +The Console class can export anything written to it as either text, svg, or html. To enable exporting, first set ``record=True`` on the constructor. This tells Rich to save a copy of any data you ``print()`` or ``log()``. Here's an example:: from rich.console import Console console = Console(record=True) -After you have written content, you can call :meth:`~rich.console.Console.export_text` or :meth:`~rich.console.Console.export_html` to get the console output as a string. You can also call :meth:`~rich.console.Console.save_text` or :meth:`~rich.console.Console.save_html` to write the contents directly to disk. +After you have written content, you can call :meth:`~rich.console.Console.export_text`, :meth:`~rich.console.Console.export_svg` or :meth:`~rich.console.Console.export_html` to get the console output as a string. You can also call :meth:`~rich.console.Console.save_text`, :meth:`~rich.console.Console.save_svg`, or :meth:`~rich.console.Console.save_html` to write the contents directly to disk. For examples of the html output generated by Rich Console, see :ref:`appendix-colors`. +Exporting SVGs +^^^^^^^^^^^^^^ + +When using :meth:`~rich.console.Console.export_svg` or :meth:`~rich.console.Console.save_svg`, the width of the SVG will match the width of your terminal window (in terms of characters), while the height will scale automatically to accommodate the console output. + +You can open the SVG in a web browser. You can also insert it in to a webpage with an ```` tag or by copying the markup in to your HTML. + +The image below shows an example of an SVG exported by Rich. + +.. image:: ../images/svg_export.svg + +You can customize the theme used during SVG export by importing the desired theme from the :mod:`rich.terminal_theme` module and passing it to :meth:`~rich.console.Console.export_svg` or :meth:`~rich.console.Console.save_svg` via the ``theme`` parameter:: + + + from rich.console import Console + from rich.terminal_theme import MONOKAI + + console = Console(record=True) + console.save_svg("example.svg", theme=MONOKAI) + +Alternatively, you can create a theme of your own by constructing a :class:`rich.terminal_theme.TerminalTheme` instance yourself and passing that in. + +.. note:: + The SVGs reference the Fira Code font. If you embed a Rich SVG in your page, you may also want to add a link to the `Fira Code CSS `_ + +Error console +------------- + +The Console object will write to ``sys.stdout`` by default (so that you see output in the terminal). If you construct the Console with ``stderr=True`` Rich will write to ``sys.stderr``. You may want to use this to create an *error console* so you can split error messages from regular output. Here's an example:: + + from rich.console import Console + error_console = Console(stderr=True) + +You might also want to set the ``style`` parameter on the Console to make error messages visually distinct. Here's how you might do that:: + + error_console = Console(stderr=True, style="bold red") File output ----------- -The Console object will write to standard output (i.e. the terminal). You can also tell the Console object to write to another file by setting the ``file`` argument on the constructor -- which should be a file-like object opened for writing text. One use of this capability is to create a Console for writing to standard error by setting file to ``sys.stderr``. Here's an example:: +You can tell the Console object to write to a file by setting the ``file`` argument on the constructor -- which should be a file-like object opened for writing text. You could use this to write to a file without the output ever appearing on the terminal. Here's an example:: import sys from rich.console import Console - error_console = Console(file=sys.stderr) - error_console.print("[bold red]This is an error!") + from datetime import datetime + + with open("report.txt", "wt") as report_file: + console = Console(file=report_file) + console.rule(f"Report Generated {datetime.now().ctime()}") +Note that when writing to a file you may want to explicitly set the ``width`` argument if you don't want to wrap the output to the current console width. Capturing output ---------------- @@ -222,9 +332,9 @@ An alternative way of capturing output is to set the Console file to a :py:class Paging ------ -If you have some long output to present to the user you can use a *pager* to display it. A pager is typically an application on by your operating system which will at least support pressing a key to scroll, but will often support scrolling up and down through the text and other features. +If you have some long output to present to the user you can use a *pager* to display it. A pager is typically an application on your operating system which will at least support pressing a key to scroll, but will often support scrolling up and down through the text and other features. -You can page output from a Console by calling :meth:`~rich.console.Console.pager` which returns a context manger. When the pager exits, anything that was printed will be sent to the pager. Here's an example:: +You can page output from a Console by calling :meth:`~rich.console.Console.pager` which returns a context manager. When the pager exits, anything that was printed will be sent to the pager. Here's an example:: from rich.__main__ import make_test_card from rich.console import Console @@ -236,8 +346,57 @@ You can page output from a Console by calling :meth:`~rich.console.Console.pager Since the default pager on most platforms don't support color, Rich will strip color from the output. If you know that your pager supports color, you can set ``styles=True`` when calling the :meth:`~rich.console.Console.pager` method. .. note:: - Rich will use the ``PAGER`` environment variable to get the pager command. On Linux and macOS you can set this to ``less -r`` to enable paging with ANSI styles. + Rich will look at ``MANPAGER`` then the ``PAGER`` environment variables (``MANPAGER`` takes priority) to get the pager command. On Linux and macOS you can set one of these to ``less -r`` to enable paging with ANSI styles. + +Alternate screen +---------------- + +.. warning:: + This feature is currently experimental. You might want to wait before using it in production. + +Terminals support an 'alternate screen' mode which is separate from the regular terminal and allows for full-screen applications that leave your stream of input and commands intact. Rich supports this mode via the :meth:`~rich.console.Console.set_alt_screen` method, although it is recommended that you use :meth:`~rich.console.Console.screen` which returns a context manager that disables alternate mode on exit. + +Here's an example of an alternate screen:: + from time import sleep + from rich.console import Console + + console = Console() + with console.screen(): + console.print(locals()) + sleep(5) + +The above code will display a pretty printed dictionary on the alternate screen before returning to the command prompt after 5 seconds. + +You can also provide a renderable to :meth:`~rich.console.Console.screen` which will be displayed in the alternate screen when you call :meth:`~rich.ScreenContext.update`. + +Here's an example:: + + from time import sleep + + from rich.console import Console + from rich.align import Align + from rich.text import Text + from rich.panel import Panel + + console = Console() + + with console.screen(style="bold white on red") as screen: + for count in range(5, 0, -1): + text = Align.center( + Text.from_markup(f"[blink]Don't Panic![/blink]\n{count}", justify="center"), + vertical="middle", + ) + screen.update(Panel(text)) + sleep(1) + +Updating the screen with a renderable allows Rich to crop the contents to fit the screen without scrolling. + +For a more powerful way of building full screen interfaces with Rich, see :ref:`live`. + + +.. note:: + If you ever find yourself stuck in alternate mode after exiting Python code, type ``reset`` in the terminal Terminal detection ------------------ @@ -246,6 +405,13 @@ If Rich detects that it is not writing to a terminal it will strip control codes Letting Rich auto-detect terminals is useful as it will write plain text when you pipe output to a file or other application. +Interactive mode +---------------- + +Rich will remove animations such as progress bars and status indicators when not writing to a terminal as you probably don't want to write these out to a text file (for example). You can override this behavior by setting the ``force_interactive`` argument on the constructor. Set it to True to enable animations or False to disable them. + +.. note:: + Some CI systems support ANSI color and style but not anything that moves the cursor or selectively refreshes parts of the terminal. For these you might want to set ``force_terminal`` to ``True`` and ``force_interactive`` to ``False``. Environment variables --------------------- diff --git a/docs/source/group.rst b/docs/source/group.rst index 799c0d18ca..22a30aa5c8 100644 --- a/docs/source/group.rst +++ b/docs/source/group.rst @@ -1,30 +1,30 @@ Render Groups ============= -The :class:`~rich.console.RenderGroup` class allows you to group several renderables together so they may be rendered in a context where only a single renderable may be supplied. For instance, you might want to display several renderables within a :class:`~rich.panel.Panel`. +The :class:`~rich.console.Group` class allows you to group several renderables together so they may be rendered in a context where only a single renderable may be supplied. For instance, you might want to display several renderables within a :class:`~rich.panel.Panel`. -To render two panels within a third panel, you would construct a RenderGroup with the *child* renderables as positional arguments then wrap the result in another Panel:: +To render two panels within a third panel, you would construct a Group with the *child* renderables as positional arguments then wrap the result in another Panel:: from rich import print - from rich.console import RenderGroup + from rich.console import Group from rich.panel import Panel - panel_group = RenderGroup( + panel_group = Group( Panel("Hello", style="on blue"), Panel("World", style="on red"), ) print(Panel(panel_group)) -This pattern is nice when you know in advance what renderables will be in a group, put can get awkward if you have a larger number of renderables, especially if they are dynamic. Rich provides a :func:`~rich.console.render_group` decorator to help with these situations. The decorator builds a render group from an iterator of renderables. The following is the equivalent of the previous example using the decorator:: +This pattern is nice when you know in advance what renderables will be in a group, but can get awkward if you have a larger number of renderables, especially if they are dynamic. Rich provides a :func:`~rich.console.group` decorator to help with these situations. The decorator builds a group from an iterator of renderables. The following is the equivalent of the previous example using the decorator:: from rich import print - from rich.console import render_group + from rich.console import group from rich.panel import Panel - @render_group() + @group() def get_panels(): yield Panel("Hello", style="on blue") yield Panel("World", style="on red") - print(Panel(get_panels())) \ No newline at end of file + print(Panel(get_panels())) diff --git a/docs/source/highlighting.rst b/docs/source/highlighting.rst index 260cfbeacd..34274d9774 100644 --- a/docs/source/highlighting.rst +++ b/docs/source/highlighting.rst @@ -1,3 +1,5 @@ +.. _highlighting: + Highlighting ============ @@ -12,8 +14,8 @@ If the default highlighting doesn't fit your needs, you can define a custom high Here's an example which highlights text that looks like an email address:: - from rich.console import Console - from rich.highlighter import RegexHighlighter + from rich.console import Console + from rich.highlighter import RegexHighlighter from rich.theme import Theme class EmailHighlighter(RegexHighlighter): diff --git a/docs/source/index.rst b/docs/source/index.rst index d7cf613426..bad2459e21 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -16,19 +16,23 @@ Welcome to Rich's documentation! markup.rst text.rst highlighting.rst + pretty.rst logging.rst traceback.rst prompt.rst - - tables.rst - padding.rst - panel.rst - group.rst + columns.rst - progress.rst + group.rst markdown.rst - syntax.rst - + padding.rst + panel.rst + progress.rst + syntax.rst + tables.rst + tree.rst + live.rst + layout.rst + protocol.rst reference.rst diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst index ace65bdbcb..f8067bf0c3 100644 --- a/docs/source/introduction.rst +++ b/docs/source/introduction.rst @@ -1,7 +1,7 @@ Introduction ============ -Rich is a Python library for writing *rich* text (with color and style) to the terminal, and for displaying advanced content such as tables, markdown, and syntax highlighted code. +Rich is a Python library for writing *rich* text (with color and style) to the terminal, and for displaying advanced content such as tables, markdown, and syntax highlighted code. Use Rich to make your command line applications visually appealing and present data in a more readable way. Rich can also be a useful debugging aid by pretty printing and syntax highlighting data structures. @@ -10,9 +10,9 @@ Requirements Rich works with OSX, Linux and Windows. -On Windows both the (ancient) cmd.exe terminal is supported and the new `Windows Terminal `_. The later has much improved support for color and style. +On Windows both the (ancient) cmd.exe terminal is supported and the new `Windows Terminal `_. The latter has much improved support for color and style. -Rich requires Python 3.6.1 and above. Note that Python 3.6.0 is *not* supported due to lack of support for methods on NamedTuples. +Rich requires Python 3.6.3 and above. Note that Python 3.6.0 is *not* supported due to lack of support for methods on NamedTuples. .. note:: PyCharm users will need to enable "emulate terminal" in output console option in run/debug configuration to see styled output. @@ -20,7 +20,7 @@ Rich requires Python 3.6.1 and above. Note that Python 3.6.0 is *not* supported Installation ------------ -You can install Rich with from PyPi with `pip` or your favorite package manager:: +You can install Rich from PyPI with `pip` or your favorite package manager:: pip install rich @@ -38,7 +38,7 @@ The quickest way to get up and running with Rich is to import the alternative `` from rich import print -You can then print strings or objects to the terminal in the usual way. Rich will do some basic syntax highlighting and format data structures to make them easier to read. +You can then print strings or objects to the terminal in the usual way. Rich will do some basic syntax :ref:`highlighting` and format data structures to make them easier to read. Strings may contain :ref:`console_markup` which can be used to insert color and styles in to the output. @@ -50,7 +50,7 @@ This writes the following output to the terminal (including all the colors and s .. raw:: html -
Hello World!                                                 
+    
Hello World!
     {
         '__annotations__': {},
         '__builtins__': <module 'builtins' (built-in)>,
@@ -63,19 +63,19 @@ This writes the following output to the terminal (including all the colors and s
     } 
-If you would rather not shadow Python's builtin print, you can import ``rich.print`` as ``rprint`` (for example):: +If you would rather not shadow Python's built-in print, you can import ``rich.print`` as ``rprint`` (for example):: from rich import print as rprint Continue reading to learn about the more advanced features of Rich. -Python in the REPL ------------------- +Rich in the REPL +---------------- Rich may be installed in the REPL so that Python data structures are automatically pretty printed with syntax highlighting. Here's how:: >>> from rich import pretty - >>> pretty.install() + >>> pretty.install() >>> ["Rich and pretty", True] You can also use this feature to try out Rich *renderables*. Here's an example:: @@ -85,13 +85,22 @@ You can also use this feature to try out Rich *renderables*. Here's an example:: Read on to learn more about Rich renderables. +IPython Extension +~~~~~~~~~~~~~~~~~ -Rich Inspector --------------- +Rich also includes an IPython extension that will do this same pretty install + pretty tracebacks. Here's how to load it:: + + In [1]: %load_ext rich + +You can also have it load by default by adding `"rich"` to the ``c.InteractiveShellApp.extension`` variable in +`IPython Configuration `_. + +Rich Inspect +------------ Rich has an :meth:`~rich.inspect` function which can generate a report on any Python object. It is a fantastic debug aid, and a good example of the output that Rich can generate. Here is a simple example:: >>> from rich import inspect >>> from rich.color import Color >>> color = Color.parse("red") - >>> inspect(color, methods=True) \ No newline at end of file + >>> inspect(color, methods=True) diff --git a/docs/source/layout.rst b/docs/source/layout.rst new file mode 100644 index 0000000000..480956311f --- /dev/null +++ b/docs/source/layout.rst @@ -0,0 +1,140 @@ +Layout +====== + +Rich offers a :class:`~rich.layout.Layout` class which can be used to divide the screen area in to parts, where each part may contain independent content. It can be used with :ref:`Live` to create full-screen "applications" but may be used standalone. + +To see an example of a Layout, run the following from the command line:: + + python -m rich.layout + +Creating layouts +---------------- + +To define a layout, construct a Layout object and print it:: + + from rich import print + from rich.layout import Layout + + layout = Layout() + print(layout) + +This will draw a box the size of the terminal with some information regarding the layout. The box is a "placeholder" because we have yet to add any content to it. Before we do that, let's create a more interesting layout by calling the :meth:`~rich.layout.Layout.split_column` method to divide the layout in to two sub-layouts:: + + layout.split_column( + Layout(name="upper"), + Layout(name="lower") + ) + print(layout) + +This will divide the terminal screen in to two equal sized portions, one on top of the other. The ``name`` attribute is an internal identifier we can use to look up the sub-layout later. Let's use that to create another split, this time we will call :meth:`~rich.layout.Layout.split_row` to split the lower layout in to a row of two sub-layouts:: + + layout["lower"].split_row( + Layout(name="left"), + Layout(name="right"), + ) + print(layout) + +You should now see the screen area divided in to 3 portions; an upper half and a lower half that is split in to two quarters. + +.. raw:: html + +
╭─────────────────────────────── 'upper' (84 x 13) ────────────────────────────────╮
+                                                                                      
+                                                                                      
+                                                                                      
+                                                                                      
+                                                                                      
+              {'size': None, 'minimum_size': 1, 'ratio': 1, 'name': 'upper'}          
+                                                                                      
+                                                                                      
+                                                                                      
+                                                                                      
+                                                                                      
+    ╰──────────────────────────────────────────────────────────────────────────────────╯
+    ╭─────────── 'left' (42 x 14) ───────────╮╭────────── 'right' (42 x 14) ───────────╮
+                                            ││                                        
+                                            ││                                        
+                                            ││                                        
+             {                              ││         {                              
+                 'size': None,              ││             'size': None,              
+                 'minimum_size': 1,         ││             'minimum_size': 1,         
+                 'ratio': 1,                ││             'ratio': 1,                
+                 'name': 'left'             ││             'name': 'right'            
+             }                              ││         }                              
+                                            ││                                        
+                                            ││                                        
+                                            ││                                        
+    ╰────────────────────────────────────────╯╰────────────────────────────────────────╯
+    
+ +You can continue to call split() in this way to create as many parts to the screen as you wish. + +Setting renderables +------------------- + +The first position argument to ``Layout`` can be any Rich renderable, which will be sized to fit within the layout's area. Here's how we might divide the "right" layout in to two panels:: + + layout["right"].split( + Layout(Panel("Hello")), + Layout(Panel("World!")) + ) + +You can also call :meth:`~rich.layout.Layout.update` to set or replace the current renderable:: + + layout["left"].update( + "The mystery of life isn't a problem to solve, but a reality to experience." + ) + print(layout) + +Fixed size +---------- + +You can set a layout to use a fixed size by setting the ``size`` argument on the Layout constructor or by setting the attribute. Here's an example:: + + layout["upper"].size = 10 + print(layout) + +This will set the upper portion to be exactly 10 rows, no matter the size of the terminal. If the parent layout is horizontal rather than vertical, then the size applies to the number of characters rather that rows. + +Ratio +----- + +In addition to a fixed size, you can also make a flexible layout setting the ``ratio`` argument on the constructor or by assigning to the attribute. The ratio defines how much of the screen the layout should occupy in relation to other layouts. For example, let's reset the size and set the ratio of the upper layout to 2:: + + layout["upper"].size = None + layout["upper"].ratio = 2 + print(layout) + +This makes the top layout take up two thirds of the space. This is because the default ratio is 1, giving the upper and lower layouts a combined total of 3. As the upper layout has a ratio of 2, it takes up two thirds of the space, leaving the remaining third for the lower layout. + +A layout with a ratio set may also have a minimum size to prevent it from getting too small. For instance, here's how we could set the minimum size of the lower sub-layout so that it won't shrink beyond 10 rows:: + + layout["lower"].minimum_size = 10 + +Visibility +---------- + +You can make a layout invisible by setting the ``visible`` attribute to False. Here's an example:: + + layout["upper"].visible = False + print(layout) + +The top layout is now invisible, and the "lower" layout will expand to fill the available space. Set ``visible`` to True to bring it back:: + + layout["upper"].visible = True + print(layout) + +You could use this to toggle parts of your interface based on your application's configuration. + +Tree +---- + +To help visualize complex layouts you can print the ``tree`` attribute which will display a summary of the layout as a tree:: + + print(layout.tree) + + +Example +------- + +See `fullscreen.py `_ for an example that combines :class:`~rich.layout.Layout` and :class:`~rich.live.Live` to create a fullscreen "application". diff --git a/docs/source/live.rst b/docs/source/live.rst new file mode 100644 index 0000000000..51dd115d18 --- /dev/null +++ b/docs/source/live.rst @@ -0,0 +1,165 @@ +.. _live: + +Live Display +============ + +Progress bars and status indicators use a *live* display to animate parts of the terminal. You can build custom live displays with the :class:`~rich.live.Live` class. + +For a demonstration of a live display, run the following command:: + + python -m rich.live + +.. note:: + + If you see ellipsis "...", this indicates that the terminal is not tall enough to show the full table. + +Basic usage +~~~~~~~~~~~ + +To create a live display, construct a :class:`~rich.live.Live` object with a renderable and use it as a context manager. The live display will persist for the duration of the context. You can update the renderable to update the display:: + + + import time + + from rich.live import Live + from rich.table import Table + + table = Table() + table.add_column("Row ID") + table.add_column("Description") + table.add_column("Level") + + with Live(table, refresh_per_second=4): # update 4 times a second to feel fluid + for row in range(12): + time.sleep(0.4) # arbitrary delay + # update the renderable internally + table.add_row(f"{row}", f"description {row}", "[red]ERROR") + + +Updating the renderable +~~~~~~~~~~~~~~~~~~~~~~~ + +You can also change the renderable on-the-fly by calling the :meth:`~rich.live.Live.update` method. This may be useful if the information you wish to display is too dynamic to generate by updating a single renderable. Here is an example:: + + import random + import time + + from rich.live import Live + from rich.table import Table + + + def generate_table() -> Table: + """Make a new table.""" + table = Table() + table.add_column("ID") + table.add_column("Value") + table.add_column("Status") + + for row in range(random.randint(2, 6)): + value = random.random() * 100 + table.add_row( + f"{row}", f"{value:3.2f}", "[red]ERROR" if value < 50 else "[green]SUCCESS" + ) + return table + + + with Live(generate_table(), refresh_per_second=4) as live: + for _ in range(40): + time.sleep(0.4) + live.update(generate_table()) + + +Alternate screen +~~~~~~~~~~~~~~~~ + +You can opt to show a Live display in the "alternate screen" by setting ``screen=True`` on the constructor. This will allow your live display to go full screen and restore the command prompt on exit. + +You can use this feature in combination with :ref:`Layout` to display sophisticated terminal "applications". + +Transient display +~~~~~~~~~~~~~~~~~ + +Normally when you exit live context manager (or call :meth:`~rich.live.Live.stop`) the last refreshed item remains in the terminal with the cursor on the following line. +You can also make the live display disappear on exit by setting ``transient=True`` on the Live constructor. + +Auto refresh +~~~~~~~~~~~~ + +By default, the live display will refresh 4 times a second. You can set the refresh rate with the ``refresh_per_second`` argument on the :class:`~rich.live.Live` constructor. +You should set this to something lower than 4 if you know your updates will not be that frequent or higher for a smoother feeling. + +You might want to disable auto-refresh entirely if your updates are not very frequent, which you can do by setting ``auto_refresh=False`` on the constructor. +If you disable auto-refresh you will need to call :meth:`~rich.live.Live.refresh` manually or :meth:`~rich.live.Live.update` with ``refresh=True``. + +Vertical overflow +~~~~~~~~~~~~~~~~~ + +By default, the live display will display ellipsis if the renderable is too large for the terminal. You can adjust this by setting the +``vertical_overflow`` argument on the :class:`~rich.live.Live` constructor. + +- "crop" Show renderable up to the terminal height. The rest is hidden. +- "ellipsis" Similar to crop except last line of the terminal is replaced with "...". This is the default behavior. +- "visible" Will allow the whole renderable to be shown. Note that the display cannot be properly cleared in this mode. + +.. note:: + + Once the live display stops on a non-transient renderable, the last frame will render as **visible** since it doesn't have to be cleared. + + +Print / log +~~~~~~~~~~~ + +The Live class will create an internal Console object which you can access via ``live.console``. If you print or log to this console, the output will be displayed *above* the live display. Here's an example:: + + import time + + from rich.live import Live + from rich.table import Table + + table = Table() + table.add_column("Row ID") + table.add_column("Description") + table.add_column("Level") + + with Live(table, refresh_per_second=4) as live: # update 4 times a second to feel fluid + for row in range(12): + live.console.print(f"Working on row #{row}") + time.sleep(0.4) + table.add_row(f"{row}", f"description {row}", "[red]ERROR") + + +If you have another Console object you want to use, pass it in to the :class:`~rich.live.Live` constructor. Here's an example:: + + from my_project import my_console + + with Live(console=my_console) as live: + my_console.print("[bold blue]Starting work!") + ... + +.. note:: + + If you are passing in a file console, the live display only show the last item once the live context is left. + +Redirecting stdout / stderr +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To avoid breaking the live display visuals, Rich will redirect ``stdout`` and ``stderr`` so that you can use the builtin ``print`` statement. +This feature is enabled by default, but you can disable by setting ``redirect_stdout`` or ``redirect_stderr`` to ``False``. + +Nesting Lives +------------- + +Note that only a single live context may be active at any one time. The following will raise a :class:`~rich.errors.LiveError` because status also uses Live:: + + with Live(table, console=console): + with console.status("working"): # Will not work + do_work() + +In practice this is rarely a problem because you can display any combination of renderables in a Live context. + +Examples +-------- + +See `table_movie.py `_ and +`top_lite_simulator.py `_ +for deeper examples of live displaying. diff --git a/docs/source/logging.rst b/docs/source/logging.rst index c5579679f9..67a999922b 100644 --- a/docs/source/logging.rst +++ b/docs/source/logging.rst @@ -16,15 +16,19 @@ Here's an example of how to set up a rich logger:: log = logging.getLogger("rich") log.info("Hello, World!") -Rich logs won't render :ref:`console_markup` in logging by default as most libraries won't be aware of the need to escape literal square brackets, but you can enable it by setting ``markup=True`` on the handler. Alternatively you can enable it per log message by supplying the ``extra`` argument as follows:: +Rich logs won't render :ref:`console_markup` in logging by default as most libraries won't be aware of the need to escape literal square brackets, but you can enable it by setting ``markup=True`` on the handler. Alternatively you can enable it per log message by supplying the ``extra`` argument as follows:: log.error("[bold red blink]Server is shutting down![/]", extra={"markup": True}) +Similarly, the highlighter may be overridden per log message:: + + log.error("123 will not be highlighted", extra={"highlighter": None}) + Handle exceptions ------------------- -The :class:`~rich.logging.RichHandler` class may be configured to ues Rich's :class:`~rich.traceback.Traceback` class to format exceptions, which provides more context than a builtin exception. To get beautiful exceptions in your logs set ``rich_tracebacks=True`` on the handler constructor:: +The :class:`~rich.logging.RichHandler` class may be configured to use Rich's :class:`~rich.traceback.Traceback` class to format exceptions, which provides more context than a built-in exception. To get beautiful exceptions in your logs set ``rich_tracebacks=True`` on the handler constructor:: import logging @@ -45,3 +49,23 @@ The :class:`~rich.logging.RichHandler` class may be configured to ues Rich's :cl There are a number of other options you can use to configure logging output, see the :class:`~rich.logging.RichHandler` reference for details. + +Suppressing Frames +------------------ + +If you are working with a framework (click, django etc), you may only be interested in seeing the code from your own application within the traceback. You can exclude framework code by setting the `suppress` argument on `Traceback`, `install`, and `Console.print_exception`, which should be a list of modules or str paths. + +Here's how you would exclude `click `_ from Rich exceptions:: + + import click + import logging + from rich.logging import RichHandler + + logging.basicConfig( + level="NOTSET", + format="%(message)s", + datefmt="[%X]", + handlers=[RichHandler(rich_tracebacks=True, tracebacks_suppress=[click])] + ) + +Suppressed frames will show the line and file only, without any code. \ No newline at end of file diff --git a/docs/source/markup.rst b/docs/source/markup.rst index 0cdc2f4016..7644bf8625 100644 --- a/docs/source/markup.rst +++ b/docs/source/markup.rst @@ -5,6 +5,9 @@ Console Markup Rich supports a simple markup which you can use to insert color and styles virtually everywhere Rich would accept a string (e.g. :meth:`~rich.console.Console.print` and :meth:`~rich.console.Console.log`). +Run the following command to see some examples:: + + python -m rich.markup Syntax ------ @@ -24,6 +27,18 @@ There is a shorthand for closing a style. If you omit the style name from the cl print("[bold red]Bold and red[/] not bold or red") +These markup tags may be use in combination with each other and don't need to be strictly nested. The following example demonstrates overlapping of markup tags:: + + print("[bold]Bold[italic] bold and italic [/bold]italic[/italic]") + +Errors +~~~~~~ + +Rich will raise :class:`~rich.errors.MarkupError` if the markup contains one of the following errors: + +- Mismatched tags, e.g. ``"[bold]Hello[/red]"`` +- No matching tag for implicit close, e.g. ``"no tags[/]"`` + Links ~~~~~ @@ -38,14 +53,50 @@ If your terminal software supports hyperlinks, you will be able to click the wor Escaping ~~~~~~~~ -Occasionally you may want to print something that Rich would interpret as markup. You can *escape* a tag by preceding it with backslash. Here's an example:: +Occasionally you may want to print something that Rich would interpret as markup. You can *escape* a tag by preceding it with a backslash. Here's an example:: >>> from rich import print - >>> print("foo\[bar]") + >>> print(r"foo\[bar]") foo[bar] +Without the backslash, Rich will assume that ``[bar]`` is a tag and remove it from the output if there is no "bar" style. + +.. note:: + If you want to prevent the backslash from escaping the tag and output a literal backslash before a tag you can enter two backslashes. + The function :func:`~rich.markup.escape` will handle escaping of text for you. +Escaping is important if you construct console markup dynamically, with ``str.format`` or f strings (for example). Without escaping it may be possible to inject tags where you don't want them. Consider the following function:: + + def greet(name): + console.print(f"Hello {name}!") + +Calling ``greet("Will")`` will print a greeting, but if you were to call ``greet("[blink]Gotcha![/blink]"])`` then you will also get blinking text, which may not be desirable. The solution is to escape the arguments:: + + from rich.markup import escape + def greet(name): + console.print(f"Hello {escape(name)}!") + +Emoji +~~~~~ + +If you add an *emoji code* to markup it will be replaced with the equivalent unicode character. An emoji code consists of the name of the emoji surrounded be colons (:). Here's an example:: + + >>> from rich import print + >>> print(":warning:") + ⚠️ + +Some emojis have two variants, the "emoji" variant displays in full color, and the "text" variant displays in monochrome (whatever your default colors are set to). You can specify the variant you want by adding either `"-emoji"` or `"-text"` to the emoji code. Here's an example: + + >>> from rich import print + >>> print(":red_heart-emoji:") + >>> print(":red_heart-text:") + +To see a list of all the emojis available, run the following command:: + + python -m rich.emoji + + Rendering Markup ---------------- diff --git a/docs/source/padding.rst b/docs/source/padding.rst index a72dcbf9d5..64505d4224 100644 --- a/docs/source/padding.rst +++ b/docs/source/padding.rst @@ -17,11 +17,11 @@ For example, the following displays 2 blank lines above and below the text, and test = Padding("Hello", (2, 4)) print(test) -The Padding class can also accept a ``style`` argument which applies a style to the padding and contents, and an ``expand`` switch which can be set to False to prevent the padding from extending to the full with of the terminal. Here's an example which demonstrates both these arguments:: +The Padding class can also accept a ``style`` argument which applies a style to the padding and contents, and an ``expand`` switch which can be set to False to prevent the padding from extending to the full width of the terminal. Here's an example which demonstrates both these arguments:: from rich import print from rich.padding import Padding test = Padding("Hello", (2, 4), style="on blue", expand=False) print(test) -Note that, as with all Rich renderables, you can use Padding any context. For instance, if you want to emphasize an item in a :class:`~rich.table.Table` you could add a Padding object to a row with a padding of 1 and a style of "on red". +Note that, as with all Rich renderables, you can use Padding in any context. For instance, if you want to emphasize an item in a :class:`~rich.table.Table` you could add a Padding object to a row with a padding of 1 and a style of "on red". diff --git a/docs/source/panel.rst b/docs/source/panel.rst index 422f0237ae..64651ce176 100644 --- a/docs/source/panel.rst +++ b/docs/source/panel.rst @@ -15,10 +15,10 @@ Panels will extend to the full width of the terminal. You can make panel *fit* t from rich.panel import Panel print(Panel.fit("Hello, [red]World!")) -The Panel constructor accepts a ``title`` argument which will draw a title within the panel:: +The Panel constructor accepts a ``title`` argument which will draw a title on the top of the panel, as well as a ``subtitle`` argument which will draw a subtitle on the bottom of the panel:: from rich import print from rich.panel import Panel - print(Panel("Hello, [red]World!", title="Welcome")) + print(Panel("Hello, [red]World!", title="Welcome", subtitle="Thank you")) See :class:`~rich.panel.Panel` for details how to customize Panels. diff --git a/docs/source/pretty.rst b/docs/source/pretty.rst new file mode 100644 index 0000000000..7a050b9433 --- /dev/null +++ b/docs/source/pretty.rst @@ -0,0 +1,240 @@ +Pretty Printing +=============== + +In addition to syntax highlighting, Rich will format (i.e. *pretty print*) containers such as lists, dicts, and sets. + +Run the following command to see an example of pretty printed output:: + + python -m rich.pretty + +Note how the output will change to fit within the terminal width. + +pprint method +------------- + +The :func:`~rich.pretty.pprint` method offers a few more arguments you can use to tweak how objects are pretty printed. Here's how you would import it:: + + >>> from rich.pretty import pprint + >>> pprint(locals()) + +Indent guides +~~~~~~~~~~~~~ + +Rich can draw *indent guides* to highlight the indent level of a data structure. These can make it easier to read more deeply nested output. The pprint method enables indent guides by default. You can set ``indent_guides=False`` to disable this feature. + +Expand all +~~~~~~~~~~ + +Rich is quite conservative about expanding data structures and will try to fit as much in each line as it can. If you prefer, you can tell Rich to fully expand all data structures by setting ``expand_all=True``. Here's an example:: + + >>> pprint(["eggs", "ham"], expand_all=True) + +Truncating pretty output +~~~~~~~~~~~~~~~~~~~~~~~~ + +Very long data structures can be difficult to read and you may find yourself scrolling through multiple pages in the terminal to find the data you are interested in. Rich can truncate containers and long strings to give you an overview without swamping your terminal. + + +If you set the ``max_length`` argument to an integer, Rich will truncate containers with more than the given number of elements. If data is truncated, Rich will display an ellipsis ``...`` and the number of elements not shown. + +Here's an example:: + + >>> pprint(locals(), max_length=2) + +If you set the ``max_string`` argument to an integer, Rich will truncate strings over that length. Truncated string will be appended with the number of characters that have not been shown. Here's an example:: + + >>> pprint("Where there is a Will, there is a Way", max_string=21) + +Pretty renderable +----------------- + +Rich offers a :class:`~rich.pretty.Pretty` class which you can use to insert pretty printed data in to another renderable. + +The following example displays pretty printed data within a simple panel:: + + from rich import print + from rich.pretty import Pretty + from rich.panel import Panel + + pretty = Pretty(locals()) + panel = Panel(pretty) + print(panel) + +There are a large number of options to tweak the pretty formatting, See the :class:`~rich.pretty.Pretty` reference for details. + +Rich Repr Protocol +------------------ + +Rich is able to syntax highlight any output, but the formatting is restricted to built-in containers, dataclasses, and other objects Rich knows about, such as objects generated by the `attrs `_ library. To add Rich formatting capabilities to custom objects, you can implement the *rich repr protocol*. + +Run the following command to see an example of what the Rich repr protocol can generate:: + + python -m rich.repr + +First, let's look at a class that might benefit from a Rich repr:: + + class Bird: + def __init__(self, name, eats=None, fly=True, extinct=False): + self.name = name + self.eats = list(eats) if eats else [] + self.fly = fly + self.extinct = extinct + + def __repr__(self): + return f"Bird({self.name!r}, eats={self.eats!r}, fly={self.fly!r}, extinct={self.extinct!r})" + + BIRDS = { + "gull": Bird("gull", eats=["fish", "chips", "ice cream", "sausage rolls"]), + "penguin": Bird("penguin", eats=["fish"], fly=False), + "dodo": Bird("dodo", eats=["fruit"], fly=False, extinct=True) + } + print(BIRDS) + +The result of this script would be:: + + {'gull': Bird('gull', eats=['fish', 'chips', 'ice cream', 'sausage rolls'], fly=True, extinct=False), 'penguin': Bird('penguin', eats=['fish'], fly=False, extinct=False), 'dodo': Bird('dodo', eats=['fruit'], fly=False, extinct=True)} + +The output is long enough to wrap on to the next line, which can make it hard to read. The repr strings are informative but a little verbose since they include default arguments. If we print this with Rich, things are improved somewhat:: + + { + 'gull': Bird('gull', eats=['fish', 'chips', 'ice cream', 'sausage rolls'], + fly=True, extinct=False), + 'penguin': Bird('penguin', eats=['fish'], fly=False, extinct=False), + 'dodo': Bird('dodo', eats=['fruit'], fly=False, extinct=True) + } + +Rich knows how to format the container dict, but the repr strings are still verbose, and there is some wrapping of the output (assumes an 80 character terminal). + +We can solve both these issues by adding the following ``__rich_repr__`` method:: + + def __rich_repr__(self): + yield self.name + yield "eats", self.eats + yield "fly", self.fly, True + yield "extinct", self.extinct, False + +Now if we print the same object with Rich we would see the following:: + + { + 'gull': Bird( + 'gull', + eats=['fish', 'chips', 'ice cream', 'sausage rolls'] + ), + 'penguin': Bird('penguin', eats=['fish'], fly=False), + 'dodo': Bird('dodo', eats=['fruit'], fly=False, extinct=True) + } + +The default arguments have been omitted, and the output has been formatted nicely. The output remains readable even if we have less room in the terminal, or our objects are part of a deeply nested data structure:: + + { + 'gull': Bird( + 'gull', + eats=[ + 'fish', + 'chips', + 'ice cream', + 'sausage rolls' + ] + ), + 'penguin': Bird( + 'penguin', + eats=['fish'], + fly=False + ), + 'dodo': Bird( + 'dodo', + eats=['fruit'], + fly=False, + extinct=True + ) + } + +You can add a ``__rich_repr__`` method to any class to enable the Rich formatting. This method should return an iterable of tuples. You could return a list of tuples, but it's easier to express with the ``yield`` keywords, making it a *generator*. + +Each tuple specifies an element in the output. + +- ``yield value`` will generate a positional argument. +- ``yield name, value`` will generate a keyword argument. +- ``yield name, value, default`` will generate a keyword argument *if* ``value`` is not equal to ``default``. + +You can also tell Rich to generate the *angular bracket* style of repr, which tend to be used where there is no easy way to recreate the object's constructor. To do this set the function attribute ``"angular"`` to ``True`` immediately after your ``__rich_repr__`` method. For example:: + + __rich_repr__.angular = True + +This will change the output of the Rich repr example to the following:: + + { + 'gull': , + 'penguin': , + 'dodo': + } + + +Note that you can add ``__rich_repr__`` methods to third-party libraries *without* including Rich as a dependency. If Rich is not installed, then nothing will break. Hopefully more third-party libraries will adopt Rich repr methods in the future. + +Typing +~~~~~~ + +If you want to type the Rich repr method you can import and return ``rich.repr.Result``, which will help catch logical errors:: + + + import rich.repr + + + class Bird: + def __init__(self, name, eats=None, fly=True, extinct=False): + self.name = name + self.eats = list(eats) if eats else [] + self.fly = fly + self.extinct = extinct + + def __rich_repr__(self) -> rich.repr.Result: + yield self.name + yield "eats", self.eats + yield "fly", self.fly, True + yield "extinct", self.extinct, False + + +Automatic Rich Repr +~~~~~~~~~~~~~~~~~~~ + +Rich can generate a rich repr automatically if the parameters are named the same as your attributes. + +To automatically build a rich repr, use the :meth:`~rich.repr.auto` class decorator. The Bird example above follows the above rule, so we don't strictly need to implement our own ``__rich_repr__``. The following code would generate the same repr:: + + import rich.repr + + @rich.repr.auto + class Bird: + def __init__(self, name, eats=None, fly=True, extinct=False): + self.name = name + self.eats = list(eats) if eats else [] + self.fly = fly + self.extinct = extinct + + + BIRDS = { + "gull": Bird("gull", eats=["fish", "chips", "ice cream", "sausage rolls"]), + "penguin": Bird("penguin", eats=["fish"], fly=False), + "dodo": Bird("dodo", eats=["fruit"], fly=False, extinct=True) + } + from rich import print + print(BIRDS) + +Note that the decorator will also create a `__repr__`, so you will get an auto-generated repr even if you don't print with Rich. + +If you want to auto-generate the angular type of repr, then set ``angular=True`` on the decorator:: + + @rich.repr.auto(angular=True) + class Bird: + def __init__(self, name, eats=None, fly=True, extinct=False): + self.name = name + self.eats = list(eats) if eats else [] + self.fly = fly + self.extinct = extinct + + +Example +------- + +See `repr.py `_ for the example code used in this page. diff --git a/docs/source/progress.rst b/docs/source/progress.rst index 812e1f4eee..afe459386b 100644 --- a/docs/source/progress.rst +++ b/docs/source/progress.rst @@ -35,6 +35,8 @@ The Progress class is designed to be used as a *context manager* which will star Here's a simple example:: + import time + from rich.progress import Progress with Progress() as progress: @@ -57,12 +59,12 @@ Updating tasks When you call :meth:`~rich.progress.Progress.add_task` you get back a `Task ID`. Use this ID to call :meth:`~rich.progress.Progress.update` whenever you have completed some work, or any information has changed. Typically you will need to update ``completed`` every time you have completed a step. You can do this by updated ``completed`` directly or by setting ``advance`` which will add to the current ``completed`` value. -The :meth:`~rich.progress.Progress.update` method collects keyword arguments which are also associated with the task. Use this to supply any additional information you would like to render in the progress display. The additional arguments are stored in ``task.fields`` and may be referenced in :ref:`Column classes`. +The :meth:`~rich.progress.Progress.update` method collects keyword arguments which are also associated with the task. Use this to supply any additional information you would like to render in the progress display. The additional arguments are stored in ``task.fields`` and may be referenced in :ref:`Column classes`. Hiding tasks ~~~~~~~~~~~~ -You can show or hide tasks by updating the tasks ``visible`` value. Tasks are visible by default, but you can also add a invisible task by calling :meth:`~rich.progress.Progress.add_task` with ``visible=False``. +You can show or hide tasks by updating the tasks ``visible`` value. Tasks are visible by default, but you can also add an invisible task by calling :meth:`~rich.progress.Progress.add_task` with ``visible=False``. Transient progress @@ -79,8 +81,7 @@ Transient progress displays are useful if you want more minimal output in the te Indeterminate progress ~~~~~~~~~~~~~~~~~~~~~~ -When you add a task it is automatically *started*, which means it will show a progress bar at 0% and the time remaining will be calculated from the current time. This may not work well if there is a long delay before you can start updating progress; you may need to wait for a response from a server or count files in a directory (for example). In these cases you can call :meth:`~rich.progress.Progress.add_task` with ``start=False`` which will display a pulsing animation that lets the user know something is working. This is know as an *indeterminate* progress bar. When you have the number of steps you can call :meth:`~rich.progress.Progress.start_task` which will display the progress bar at 0%, then :meth:`~rich.progress.Progress.update` as normal. - +When you add a task it is automatically *started*, which means it will show a progress bar at 0% and the time remaining will be calculated from the current time. This may not work well if there is a long delay before you can start updating progress; you may need to wait for a response from a server or count files in a directory (for example). In these cases you can call :meth:`~rich.progress.Progress.add_task` with ``start=False`` or ``total=None`` which will display a pulsing animation that lets the user know something is working. This is know as an *indeterminate* progress bar. When you have the number of steps you can call :meth:`~rich.progress.Progress.start_task` which will display the progress bar at 0%, then :meth:`~rich.progress.Progress.update` as normal. Auto refresh ~~~~~~~~~~~~ @@ -89,33 +90,74 @@ By default, the progress information will refresh 10 times a second. You can set You might want to disable auto-refresh entirely if your updates are not very frequent, which you can do by setting ``auto_refresh=False`` on the constructor. If you disable auto-refresh you will need to call :meth:`~rich.progress.Progress.refresh` manually after updating your task(s). + +Expand +~~~~~~ + +The progress bar(s) will use only as much of the width of the terminal as required to show the task information. If you set the ``expand`` argument on the Progress constructor, then Rich will stretch the progress display to the full available width. + + Columns ~~~~~~~ -You may customize the columns in the progress display with the positional arguments to the :class:`~rich.progress.Progress` constructor. The columns are specified as either a format string or a :class:`~rich.progress.ProgressColumn` object. +You may customize the columns in the progress display with the positional arguments to the :class:`~rich.progress.Progress` constructor. The columns are specified as either a *format string* or a :class:`~rich.progress.ProgressColumn` object. -Format strings will be rendered with a single value `"task"` which will be a :class:`~rich.progress.Task` instance. For example ``"{task.description}"`` would display the task description in the column, and ``"{task.completed} of {task.total}"`` would display how many of the total steps have been completed. +Format strings will be rendered with a single value `"task"` which will be a :class:`~rich.progress.Task` instance. For example ``"{task.description}"`` would display the task description in the column, and ``"{task.completed} of {task.total}"`` would display how many of the total steps have been completed. Additional fields passed via keyword arguments to `~rich.progress.Progress.update` are store in ``task.fields``. You can add them to a format string with the following syntax: ``"extra info: {task.fields[extra]}"``. -The defaults are roughly equivalent to the following:: +The default columns are equivalent to the following: progress = Progress( - "[progress.description]{task.description}", + TextColumn("[progress.description]{task.description}"), BarColumn(), - "[progress.percentage]{task.percentage:>3.0f}%", + TaskProgressColumn(), TimeRemainingColumn(), ) +To create a Progress with your own columns in addition to the defaults, use :meth:`~rich.progress.Progress.get_default_columns`:: + + progress = Progress( + SpinnerColumn(), + *Progress.get_default_columns(), + TimeElapsedColumn(), + ) + The following column objects are available: - :class:`~rich.progress.BarColumn` Displays the bar. - :class:`~rich.progress.TextColumn` Displays text. +- :class:`~rich.progress.TimeElapsedColumn` Displays the time elapsed. - :class:`~rich.progress.TimeRemainingColumn` Displays the estimated time remaining. +- :class:`~rich.progress.MofNCompleteColumn` Displays completion progress as ``"{task.completed}/{task.total}"`` (works best if completed and total are ints). - :class:`~rich.progress.FileSizeColumn` Displays progress as file size (assumes the steps are bytes). - :class:`~rich.progress.TotalFileSizeColumn` Displays total file size (assumes the steps are bytes). - :class:`~rich.progress.DownloadColumn` Displays download progress (assumes the steps are bytes). - :class:`~rich.progress.TransferSpeedColumn` Displays transfer speed (assumes the steps are bytes. +- :class:`~rich.progress.SpinnerColumn` Displays a "spinner" animation. +- :class:`~rich.progress.RenderableColumn` Displays an arbitrary Rich renderable in the column. + +To implement your own columns, extend the :class:`~rich.progress.ProgressColumn` class and use it as you would the other columns. + + +Table Columns +~~~~~~~~~~~~~ + +Rich builds a :class:`~rich.table.Table` for the tasks in the Progress instance. You can customize how the columns of this *tasks table* are created by specifying the ``table_column`` argument in the Column constructor, which should be a :class:`~rich.table.Column` instance. + +The following example demonstrates a progress bar where the description takes one third of the width of the terminal, and the bar takes up the remaining two thirds:: + + from time import sleep + + from rich.table import Column + from rich.progress import Progress, BarColumn, TextColumn + + text_column = TextColumn("{task.description}", table_column=Column(ratio=1)) + bar_column = BarColumn(bar_width=None, table_column=Column(ratio=2)) + progress = Progress(text_column, bar_column, expand=True) -To implement your own columns, extend the :class:`~rich.progress.Progress` and use it as you would the other columns. + with progress: + for n in progress.track(range(100)): + progress.print(n) + sleep(0.1) Print / log @@ -124,9 +166,9 @@ Print / log The Progress class will create an internal Console object which you can access via ``progress.console``. If you print or log to this console, the output will be displayed *above* the progress display. Here's an example:: with Progress() as progress: - task = progress.add_task(total=10) + task = progress.add_task("twiddling thumbs", total=10) for job in range(10): - progress.console.print("Working on job #{job}") + progress.console.print(f"Working on job #{job}") run_job(job) progress.advance(task) @@ -137,12 +179,12 @@ If you have another Console object you want to use, pass it in to the :class:`~r with Progress(console=my_console) as progress: my_console.print("[bold blue]Starting work!") do_work(progress) - + Redirecting stdout / stderr ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To avoid breaking the progress display visuals, Rich will redirect ``stdout`` and ``stderr`` so that you can use the builtin ``print`` statement. This feature is enabled by default, but you can disable by setting ``redirect_stdout`` or ``redirect_stderr`` to ``False`` +To avoid breaking the progress display visuals, Rich will redirect ``stdout`` and ``stderr`` so that you can use the built-in ``print`` statement. This feature is enabled by default, but you can disable by setting ``redirect_stdout`` or ``redirect_stderr`` to ``False`` Customizing @@ -155,7 +197,49 @@ If the :class:`~rich.progress.Progress` class doesn't offer exactly what you nee class MyProgress(Progress): def get_renderables(self): - yield Panel(self.make_tasks_table(self.tasks)) + yield Panel(self.make_tasks_table(self.tasks)) + +Reading from a file +~~~~~~~~~~~~~~~~~~~ + +Rich provides an easy way to generate a progress bar while reading a file. If you call :func:`~rich.progress.open` it will return a context manager which displays a progress bar while you read. This is particularly useful when you can't easily modify the code that does the reading. + +The following example demonstrates how we might show progress when reading a JSON file:: + + import json + import rich.progress + + with rich.progress.open("data.json", "rb") as file: + data = json.load(file) + print(data) + +If you already have a file object, you can call :func:`~rich.progress.wrap_file` which returns a context manager that wraps your file so that it displays a progress bar. If you use this function you will need to set the number of bytes or characters you expect to read. + +Here's an example that reads a url from the internet:: + + from time import sleep + from urllib.request import urlopen + + from rich.progress import wrap_file + + response = urlopen("https://www.textualize.io") + size = int(response.headers["Content-Length"]) + + with wrap_file(response, size) as file: + for line in file: + print(line.decode("utf-8"), end="") + sleep(0.1) + + +If you expect to be reading from multiple files, you can use :meth:`~rich.progress.Progress.open` or :meth:`~rich.progress.Progress.wrap_file` to add a file progress to an existing Progress instance. + +See `cp_progress.py ` for a minimal clone of the ``cp`` command which shows a progress bar as the file is copied. + + +Multiple Progress +----------------- + +You can't have different columns per task with a single Progress instance. However, you can have as many Progress instances as you like in a :ref:`live`. See `live_progress.py `_ and `dynamic_progress.py `_ for examples of using multiple Progress instances. Example ------- diff --git a/docs/source/prompt.rst b/docs/source/prompt.rst index 3ba219509d..088aa8e743 100644 --- a/docs/source/prompt.rst +++ b/docs/source/prompt.rst @@ -1,7 +1,7 @@ Prompt ====== -Rich has a number :class:`~rich.prompt.Prompt` classes which ask a user for input and loop until a valid response is received. Here's a simple example:: +Rich has a number of :class:`~rich.prompt.Prompt` classes which ask a user for input and loop until a valid response is received (they all use the :ref:`Console API` internally). Here's a simple example:: >>> from rich.prompt import Prompt >>> name = Prompt.ask("Enter your name") diff --git a/docs/source/protocol.rst b/docs/source/protocol.rst index e37450e7f6..cd8c03a4ab 100644 --- a/docs/source/protocol.rst +++ b/docs/source/protocol.rst @@ -4,7 +4,7 @@ Console Protocol ================ -Rich supports a simple protocol to add rich formatting capabilities to custom objects, so you can :meth:`~rich.console.Console.print` your object with color, styles and formatting. +Rich supports a simple protocol to add rich formatting capabilities to custom objects, so you can :meth:`~rich.console.Console.print` your object with color, styles and formatting. Use this for presentation or to display additional debugging information that might be hard to parse from a typical ``__repr__`` string. @@ -64,10 +64,10 @@ For complete control over how a custom object is rendered to the terminal, you c Measuring Renderables ~~~~~~~~~~~~~~~~~~~~~ -Sometimes Rich needs to know how many characters an object will take up when rendering. The :class:`~rich.table.Table` class, for instance, will use this information to calculate the optimal dimensions for the columns. If you aren't using one of the renderable objects in the Rich module, you will need to supply a ``__rich_measure__`` method which accepts a :class:`~rich.console.Console` and the maximum width and returns a :class:`~rich.measure.Measurement` object. The Measurement object should contain the *minimum* and *maximum* number of characters required to render. +Sometimes Rich needs to know how many characters an object will take up when rendering. The :class:`~rich.table.Table` class, for instance, will use this information to calculate the optimal dimensions for the columns. If you aren't using one of the renderable objects in the Rich module, you will need to supply a ``__rich_measure__`` method which accepts a :class:`~rich.console.Console` and :class:`~rich.console.ConsoleOptions` and returns a :class:`~rich.measure.Measurement` object. The Measurement object should contain the *minimum* and *maximum* number of characters required to render. For example, if we are rendering a chess board, it would require a minimum of 8 characters to render. The maximum can be left as the maximum available width (assuming a centered board):: class ChessBoard: - def __rich_measure__(self, console: Console, max_width: int) -> Measurement: - return Measurement(8, max_width) + def __rich_measure__(self, console: Console, options: ConsoleOptions) -> Measurement: + return Measurement(8, options.max_width) diff --git a/docs/source/reference.rst b/docs/source/reference.rst index fe87ad5c84..29e6d05fcf 100644 --- a/docs/source/reference.rst +++ b/docs/source/reference.rst @@ -3,15 +3,18 @@ Reference .. toctree:: :maxdepth: 3 - + reference/align.rst reference/bar.rst reference/color.rst reference/columns.rst reference/console.rst reference/emoji.rst - reference/highlighter.rst + reference/highlighter.rst reference/init.rst + reference/json.rst + reference/layout.rst + reference/live.rst reference/logging.rst reference/markdown.rst reference/markup.rst @@ -25,6 +28,8 @@ Reference reference/protocol.rst reference/rule.rst reference/segment.rst + reference/spinner.rst + reference/status.rst reference/style.rst reference/styled.rst reference/syntax.rst @@ -32,4 +37,5 @@ Reference reference/text.rst reference/theme.rst reference/traceback.rst - references/abc.rst + reference/tree.rst + reference/abc.rst diff --git a/docs/source/reference/json.rst b/docs/source/reference/json.rst new file mode 100644 index 0000000000..97bad0f860 --- /dev/null +++ b/docs/source/reference/json.rst @@ -0,0 +1,7 @@ +rich.json +========= + +.. automodule:: rich.json + :members: + + diff --git a/docs/source/reference/layout.rst b/docs/source/reference/layout.rst new file mode 100644 index 0000000000..f0b1e5aedc --- /dev/null +++ b/docs/source/reference/layout.rst @@ -0,0 +1,7 @@ +rich.layout +=========== + +.. automodule:: rich.layout + :members: + + diff --git a/docs/source/reference/live.rst b/docs/source/reference/live.rst new file mode 100644 index 0000000000..516ed8f24e --- /dev/null +++ b/docs/source/reference/live.rst @@ -0,0 +1,5 @@ +rich.live +========= + +.. automodule:: rich.live + :members: \ No newline at end of file diff --git a/docs/source/reference/spinner.rst b/docs/source/reference/spinner.rst new file mode 100644 index 0000000000..53315dc737 --- /dev/null +++ b/docs/source/reference/spinner.rst @@ -0,0 +1,5 @@ +rich.spinner +============ + +.. automodule:: rich.spinner + :members: diff --git a/docs/source/reference/status.rst b/docs/source/reference/status.rst new file mode 100644 index 0000000000..ac4704ec50 --- /dev/null +++ b/docs/source/reference/status.rst @@ -0,0 +1,5 @@ +rich.status +============ + +.. automodule:: rich.status + :members: diff --git a/docs/source/reference/tree.rst b/docs/source/reference/tree.rst new file mode 100644 index 0000000000..402404165a --- /dev/null +++ b/docs/source/reference/tree.rst @@ -0,0 +1,5 @@ +rich.tree +========= + +.. automodule:: rich.tree + :members: diff --git a/docs/source/style.rst b/docs/source/style.rst index 877cedd8fc..18d4bf16ba 100644 --- a/docs/source/style.rst +++ b/docs/source/style.rst @@ -4,7 +4,7 @@ Styles ====== -In various places in the Rich API you can set a "style" which defines the color of the text and various attributes such as bold, italic etc. A style may be given as a string containing a *style definition* or as in instance of a :class:`~rich.style.Style` class. +In various places in the Rich API you can set a "style" which defines the color of the text and various attributes such as bold, italic etc. A style may be given as a string containing a *style definition* or as an instance of a :class:`~rich.style.Style` class. Defining Styles @@ -16,11 +16,11 @@ To specify a foreground color use one of the 256 :ref:`appendix-colors`. For exa console.print("Hello", style="magenta") -You may also use the color's number (an integer between 0 and 255) with the syntax `"color()"`. The following will give the equivalent output:: +You may also use the color's number (an integer between 0 and 255) with the syntax ``"color()"``. The following will give the equivalent output:: console.print("Hello", style="color(5)") -Alteratively you can use a CSS-like syntax to specify a color with a "#" followed by three pairs of hex characters, or in RGB form with three decimal integers. The following two lines both print "Hello" in the same color (purple):: +Alternatively you can use a CSS-like syntax to specify a color with a "#" followed by three pairs of hex characters, or in RGB form with three decimal integers. The following two lines both print "Hello" in the same color (purple):: console.print("Hello", style="#af00ff") console.print("Hello", style="rgb(175,0,255)") @@ -106,7 +106,7 @@ You can parse a style definition explicitly with the :meth:`~rich.style.Style.pa Style Themes ------------ -If you re-use styles it can be a maintenance headache if you ever want to modify an attribute or color -- you would have to change every line where the style is used. Rich provides a :class:`~rich.theme.Theme` class which you can use to define custom styles that you can refer to by name. That way you only need update your styles in one place. +If you re-use styles it can be a maintenance headache if you ever want to modify an attribute or color -- you would have to change every line where the style is used. Rich provides a :class:`~rich.theme.Theme` class which you can use to define custom styles that you can refer to by name. That way you only need to update your styles in one place. Style themes can make your code more semantic, for instance a style called ``"warning"`` better expresses intent that ``"italic magenta underline"``. @@ -115,7 +115,7 @@ To use a style theme, construct a :class:`~rich.theme.Theme` instance and pass i from rich.console import Console from rich.theme import Theme custom_theme = Theme({ - "info" : "dim cyan", + "info": "dim cyan", "warning": "magenta", "danger": "bold red" }) @@ -132,7 +132,7 @@ To use a style theme, construct a :class:`~rich.theme.Theme` instance and pass i Customizing Defaults ~~~~~~~~~~~~~~~~~~~~ -The Theme class will inherit the default styles builtin to Rich. If your custom theme contains the name of an existing style, it will replace it. This allows you to customize the defaults as easily as you can create your own styles. For instance, here's how you can change how Rich highlights numbers:: +The Theme class will inherit the default styles built-in to Rich. If your custom theme contains the name of an existing style, it will replace it. This allows you to customize the defaults as easily as you can create your own styles. For instance, here's how you can change how Rich highlights numbers:: from rich.console import Console from rich.theme import Theme @@ -141,9 +141,10 @@ The Theme class will inherit the default styles builtin to Rich. If your custom You can disable inheriting the default theme by setting ``inherit=False`` on the :class:`rich.theme.Theme` constructor. -To see the default theme, run the following command:: +To see the default theme, run the following commands:: python -m rich.theme + python -m rich.default_styles Loading Themes diff --git a/docs/source/syntax.rst b/docs/source/syntax.rst index e0ea035573..4e55bf9967 100644 --- a/docs/source/syntax.rst +++ b/docs/source/syntax.rst @@ -9,8 +9,8 @@ To syntax highlight code, construct a :class:`~rich.syntax.Syntax` object and pr from rich.syntax import Syntax console = Console() - with open("syntax.py", "wt") as code_file: - syntax = Syntax(code_file.read(), "python") + with open("syntax.py", "rt") as code_file: + syntax = Syntax(code_file.read(), "python") console.print(syntax) You may also use the :meth:`~rich.syntax.Syntax.from_path` alternative constructor which will load the code from disk and auto-detect the file type. The example above could be re-written as follows:: diff --git a/docs/source/tables.rst b/docs/source/tables.rst index ec946e6e00..22236358f4 100644 --- a/docs/source/tables.rst +++ b/docs/source/tables.rst @@ -40,7 +40,44 @@ This produces the following output:
-Rich is quite smart about rendering the table. It will adjust the column widths to fit the contents and will wrap text if it doesn't fit. You can also add anything that Rich knows how to render as a title or row cell (even another table)! +Rich will calculate the optimal column sizes to fit your content, and will wrap text to fit if the terminal is not wide enough to fit the contents. + +.. note:: + You are not limited to adding text in the ``add_row`` method. You can add anything that Rich knows how to render (including another table). + +Table Options +~~~~~~~~~~~~~ + +There are a number of keyword arguments on the Table constructor you can use to define how a table should look. + +- ``title`` Sets the title of the table (text show above the table). +- ``caption`` Sets the table caption (text show below the table). +- ``width`` Sets the desired width of the table (disables automatic width calculation). +- ``min_width`` Sets a minimum width for the table. +- ``box`` Sets one of the :ref:`appendix_box` styles for the table grid, or ``None`` for no grid. +- ``safe_box`` Set to ``True`` to force the table to generate ASCII characters rather than unicode. +- ``padding`` A integer, or tuple of 1, 2, or 4 values to set the padding on cells. +- ``collapse_padding`` If True the padding of neighboring cells will be merged. +- ``pad_edge`` Set to False to remove padding around the edge of the table. +- ``expand`` Set to True to expand the table to the full available size. +- ``show_header`` Set to True to show a header, False to disable it. +- ``show_footer`` Set to True to show a footer, False to disable it. +- ``show_edge`` Set to False to disable the edge line around the table. +- ``show_lines`` Set to True to show lines between rows as well as header / footer. +- ``leading`` Additional space between rows. +- ``style`` A Style to apply to the entire table, e.g. "on blue" +- ``row_styles`` Set to a list of styles to style alternating rows. e.g. ``["dim", ""]`` to create *zebra stripes* +- ``header_style`` Set the default style for the header. +- ``footer_style`` Set the default style for the footer. +- ``border_style`` Set a style for border characters. +- ``title_style`` Set a style for the title. +- ``caption_style`` Set a style for the caption. +- ``title_justify`` Set the title justify method ("left", "right", "center", or "full") +- ``caption_justify`` Set the caption justify method ("left", "right", "center", or "full") +- ``highlight`` Set to True to enable automatic highlighting of cell contents. + +Border Styles +~~~~~~~~~~~~~ You can set the border style by importing one of the preset :class:`~rich.box.Box` objects and setting the ``box`` argument in the table constructor. Here's an example that modifies the look of the Star Wars table:: @@ -49,30 +86,68 @@ You can set the border style by importing one of the preset :class:`~rich.box.Bo See :ref:`appendix_box` for other box styles. +You can also set ``box=None`` to remove borders entirely. + The :class:`~rich.table.Table` class offers a number of configuration options to set the look and feel of the table, including how borders are rendered and the style and alignment of the columns. -Adding columns +Lines +~~~~~ + +By default, Tables will show a line under the header only. If you want to show lines between all rows add ``show_lines=True`` to the constructor. + + +Empty Tables +~~~~~~~~~~~~ + +Printing a table with no columns results in a blank line. If you are building a table dynamically and the data source has no columns, you might want to print something different. Here's how you might do that:: + + if table.columns: + print(table) + else: + print("[i]No data...[/i]") + + +Adding Columns ~~~~~~~~~~~~~~ -You may also add columns by specifying them in the positional arguments of the :class:`~rich.table.Table` constructor. For example, we could construct a table with three columns like this:: +You may also add columns by specifying them in the positional arguments of the :class:`~rich.table.Table` constructor. For example, we could construct a table with three columns like this:: - table = Table("Released", "Title", "Box Office", title="Star Wars Movies") + table = Table("Released", "Title", "Box Office", title="Star Wars Movies") -This allows you to specify the text of the column only. If you want to set other attributes, such as width and style, you can add an :class:`~rich.table.Column` class. Here's an example:: +This allows you to specify the text of the column only. If you want to set other attributes, such as width and style, you can add a :class:`~rich.table.Column` class. Here's an example:: from rich.table import Column table = Table( "Released", "Title", - Column(header="Box Office", align="right"), + Column(header="Box Office", justify="right"), title="Star Wars Movies" ) -Lines -~~~~~ +Column Options +~~~~~~~~~~~~~~ -By default, Tables will show a line under the header only. If you want to show lines between all rows add ``show_lines=True`` to the constructor. +There are a number of options you can set on a column to modify how it will look. + +- ``header_style`` Sets the style of the header, e.g. "bold magenta". +- ``footer_style`` Sets the style of the footer. +- ``style`` Sets a style that applies to the column. You could use this to highlight a column by setting the background with "on green" for example. +- ``justify`` Sets the text justify to one of "left", "center", "right", or "full". +- ``vertical`` Sets the vertical alignment of the cells in a column, to one of "top", "middle", or "bottom". +- ``width`` Explicitly set the width of a row to a given number of characters (disables automatic calculation). +- ``min_width`` When set to an integer will prevent the column from shrinking below this amount. +- ``max_width`` When set to an integer will prevent the column from growing beyond this amount. +- ``ratio`` Defines a ratio to set the column width. For instance, if there are 3 columns with a total of 6 ratio, and ``ratio=2`` then the column will be a third of the available size. +- ``no_wrap`` Set to True to prevent this column from wrapping. + +Vertical Alignment +~~~~~~~~~~~~~~~~~~ + +You can define the vertical alignment of a column by setting the ``vertical`` parameter of the column. You can also do this per-cell by wrapping your text or renderable with a :class:`~rich.align.Align` class:: + + + table.add_row(Align("Title", vertical="middle")) Grids ~~~~~ diff --git a/docs/source/text.rst b/docs/source/text.rst index ed5f06cbfe..fd6851fb4f 100644 --- a/docs/source/text.rst +++ b/docs/source/text.rst @@ -5,11 +5,14 @@ Rich Text Rich has a :class:`~rich.text.Text` class you can use to mark up strings with color and style attributes. You can use a Text instance anywhere a string is accepted, which gives you a lot of control over presentation. -You can consider this class to be like a string with marked up regions of text. Unlike a builtin ``str``, a Text instance is mutable, and most methods operate in-place rather than returning a new instance. +You can consider this class to be like a string with marked up regions of text. Unlike a built-in ``str``, a Text instance is mutable, and most methods operate in-place rather than returning a new instance. One way to add a style to Text is the :meth:`~rich.text.Text.stylize` method which applies a style to a start and end offset. Here is an example:: + from rich.console import Console from rich.text import Text + + console = Console() text = Text("Hello, World!") text.stylize("bold magenta", 0, 6) console.print(text) @@ -23,6 +26,11 @@ Alternatively, you can construct styled text by calling :meth:`~rich.text.Text.a text.append(" World!") console.print(text) +If you would like to use text that is already formatted with ANSI codes, call :meth:`~rich.text.Text.from_ansi` to convert it to a ``Text`` object:: + + text = Text.from_ansi("\033[1mHello, World!\033[0m") + console.print(text.spans) + Since building Text instances from parts is a common requirement, Rich offers :meth:`~rich.text.Text.assemble` which will combine strings or pairs of string and Style, and return a Text instance. The follow example is equivalent to the code above:: text = Text.assemble(("Hello", "bold magenta"), " World!") @@ -41,7 +49,7 @@ The Text class has a number of parameters you can set on the constructor to modi - ``no_wrap`` prevents wrapping if the text is longer then the available width. - ``tab_size`` Sets the number of characters in a tab. -A Text instance may be used in place of a plain string virtually everywhere in the Rich API, which gives you a lot of control in how text renders within other Rich renderables. For instance, the following example right aligns text within a :class:`rich.panel.Panel`:: +A Text instance may be used in place of a plain string virtually everywhere in the Rich API, which gives you a lot of control in how text renders within other Rich renderables. For instance, the following example right aligns text within a :class:`~rich.panel.Panel`:: from rich import print from rich.panel import Panel diff --git a/docs/source/traceback.rst b/docs/source/traceback.rst index f1d46e39c8..6c2893222d 100644 --- a/docs/source/traceback.rst +++ b/docs/source/traceback.rst @@ -1,7 +1,11 @@ Traceback ========= -Rich can render Python tracebacks with syntax highlighting and formatting. Rich tracebacks are easier to read, and show more code, than standard Python tracebacks. +Rich can render Python tracebacks with syntax highlighting and formatting. Rich tracebacks are easier to read and show more code than standard Python tracebacks. + +To see an example of a Rich traceback, running the following command:: + + python -m rich.traceback Printing tracebacks @@ -9,18 +13,86 @@ Printing tracebacks The :meth:`~rich.console.Console.print_exception` method will print a traceback for the current exception being handled. Here's an example:: + from rich.console import Console + console = Console() + try: do_something() - except: - console.print_exception() + except Exception: + console.print_exception(show_locals=True) +The ``show_locals=True`` parameter causes Rich to display the value of local variables for each frame of the traceback. + +See `exception.py `_ for a larger example. -Traceback handler + +Traceback Handler ----------------- Rich can be installed as the default traceback handler so that all uncaught exceptions will be rendered with highlighting. Here's how:: from rich.traceback import install - install() + install(show_locals=True) + +There are a few options to configure the traceback handler, see :func:`~rich.traceback.install` for details. + +Automatic Traceback Handler +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In some cases you may want to have the traceback handler installed automatically without having to worry about importing the code in your module. You can do that by modifying the `sitecustomize.py` in your virtual environment. Typically it would be located in your virtual environment path, underneath the `site-packages` folder, something like this:: + + ./.venv/lib/python3.9/site-packages/sitecustomize.py + +In most cases this file will not exist. If it doesn't exist, you can create it by:: + + $ touch .venv/lib/python3.9/site-packages/sitecustomize.py + +Add the following code to the file:: + + from rich.traceback import install + install(show_locals=True) + +At this point, the traceback will be installed for any code that is run within the virtual environment. + +.. note:: + If you plan on sharing your code, it is probably best to include the traceback install in your main entry point module. + + +Suppressing Frames +------------------ + +If you are working with a framework (click, django etc), you may only be interested in seeing the code from your own application within the traceback. You can exclude framework code by setting the `suppress` argument on `Traceback`, `install`, `Console.print_exception`, and `RichHandler`, which should be a list of modules or str paths. + +Here's how you would exclude `click `_ from Rich exceptions:: + + import click + from rich.traceback import install + install(suppress=[click]) + +Suppressed frames will show the line and file only, without any code. + +Max Frames +---------- + +A recursion error can generate very large tracebacks that take a while to render and contain a lot of repetitive frames. Rich guards against this with a `max_frames` argument, which defaults to 100. If a traceback contains more than 100 frames then only the first 50, and last 50 will be shown. You can disable this feature by setting `max_frames` to 0. + +Here's an example of printing a recursive error:: + + from rich.console import Console + + + def foo(n): + return bar(n) + + + def bar(n): + return foo(n) + + + console = Console() + + try: + foo(1) + except Exception: + console.print_exception(max_frames=20) -There are a few options to configure the traceback handler, see :func:`~rich.traceback.install` for details. \ No newline at end of file diff --git a/docs/source/tree.rst b/docs/source/tree.rst new file mode 100644 index 0000000000..334c31d9c8 --- /dev/null +++ b/docs/source/tree.rst @@ -0,0 +1,45 @@ +Tree +==== + +Rich has a :class:`~rich.tree.Tree` class which can generate a tree view in the terminal. A tree view is a great way of presenting the contents of a filesystem or any other hierarchical data. Each branch of the tree can have a label which may be text or any other Rich renderable. + +Run the following command to see a demonstration of a Rich tree:: + + python -m rich.tree + +The following code creates and prints a tree with a simple text label:: + + from rich.tree import Tree + from rich import print + + tree = Tree("Rich Tree") + print(tree) + +With only a single ``Tree`` instance this will output nothing more than the text "Rich Tree". Things get more interesting when we call :meth:`~rich.tree.Tree.add` to add more branches to the Tree. The following code adds two more branches:: + + tree.add("foo") + tree.add("bar") + print(tree) + +The tree will now have two branches connected to the original tree with guide lines. + +When you call :meth:`~rich.tree.Tree.add` a new Tree instance is returned. You can use this instance to add more branches to, and build up a more complex tree. Let's add a few more levels to the tree:: + + baz_tree = tree.add("baz") + baz_tree.add("[red]Red").add("[green]Green").add("[blue]Blue") + print(tree) + + +Tree Styles +~~~~~~~~~~~ + +The Tree constructor and :meth:`~rich.tree.Tree.add` method allows you to specify a ``style`` argument which sets a style for the entire branch, and ``guide_style`` which sets the style for the guide lines. These styles are inherited by the branches and will apply to any sub-trees as well. + +If you set ``guide_style`` to bold, Rich will select the thicker variations of unicode line characters. Similarly, if you select the "underline2" style you will get double line style of unicode characters. + + +Examples +~~~~~~~~ + +For a more practical demonstration, see `tree.py `_ which can generate a tree view of a directory in your hard drive. + diff --git a/examples/attrs.py b/examples/attrs.py new file mode 100644 index 0000000000..35746738a0 --- /dev/null +++ b/examples/attrs.py @@ -0,0 +1,53 @@ +from typing import List + +try: + import attr +except ImportError: + print("This example requires attrs library") + print("pip install attrs") + raise + + +@attr.define +class Point3D: + x: float + y: float + z: float = 0 + + +@attr.define +class Triangle: + point1: Point3D + point2: Point3D + point3: Point3D + + +@attr.define +class Model: + name: str + triangles: List[Triangle] = attr.Factory(list) + + +if __name__ == "__main__": + model = Model( + name="Alien#1", + triangles=[ + Triangle( + Point3D(x=20, y=50), + Point3D(x=50, y=15, z=-45.34), + Point3D(3.1426, 83.2323, -16), + ) + ], + ) + + from rich.console import Console + from rich.pretty import Pretty + from rich.table import Column, Table + from rich.text import Text + + console = Console() + + table = Table("attrs *with* Rich", Column(Text.from_markup("attrs *without* Rich"))) + + table.add_row(Pretty(model), repr(model)) + console.print(table) diff --git a/examples/cp_progress.py b/examples/cp_progress.py new file mode 100644 index 0000000000..b5cc4c8181 --- /dev/null +++ b/examples/cp_progress.py @@ -0,0 +1,19 @@ +""" +A very minimal `cp` clone that displays a progress bar. +""" +import os +import shutil +import sys + +from rich.progress import Progress + +if __name__ == "__main__": + if len(sys.argv) == 3: + with Progress() as progress: + desc = os.path.basename(sys.argv[1]) + with progress.open(sys.argv[1], "rb", description=desc) as src: + with open(sys.argv[2], "wb") as dst: + shutil.copyfileobj(src, dst) + else: + print("Copy a file with a progress bar.") + print("Usage:\n\tpython cp_progress.py SRC DST") diff --git a/examples/downloader.py b/examples/downloader.py index 33e431399f..919aa7348f 100644 --- a/examples/downloader.py +++ b/examples/downloader.py @@ -2,24 +2,25 @@ A rudimentary URL downloader (like wget or curl) to demonstrate Rich progress bars. """ -from concurrent.futures import ThreadPoolExecutor -from functools import partial import os.path import sys +from concurrent.futures import ThreadPoolExecutor +import signal +from functools import partial +from threading import Event from typing import Iterable from urllib.request import urlopen from rich.progress import ( BarColumn, DownloadColumn, - TextColumn, - TransferSpeedColumn, - TimeRemainingColumn, Progress, TaskID, + TextColumn, + TimeRemainingColumn, + TransferSpeedColumn, ) - progress = Progress( TextColumn("[bold blue]{task.fields[filename]}", justify="right"), BarColumn(bar_width=None), @@ -33,8 +34,19 @@ ) +done_event = Event() + + +def handle_sigint(signum, frame): + done_event.set() + + +signal.signal(signal.SIGINT, handle_sigint) + + def copy_url(task_id: TaskID, url: str, path: str) -> None: """Copy data from a url to a local file.""" + progress.console.log(f"Requesting {url}") response = urlopen(url) # This will break if the response doesn't contain content length progress.update(task_id, total=int(response.info()["Content-length"])) @@ -43,10 +55,14 @@ def copy_url(task_id: TaskID, url: str, path: str) -> None: for data in iter(partial(response.read, 32768), b""): dest_file.write(data) progress.update(task_id, advance=len(data)) + if done_event.is_set(): + return + progress.console.log(f"Downloaded {path}") def download(urls: Iterable[str], dest_dir: str): """Download multuple files to the given directory.""" + with progress: with ThreadPoolExecutor(max_workers=4) as pool: for url in urls: @@ -57,7 +73,7 @@ def download(urls: Iterable[str], dest_dir: str): if __name__ == "__main__": - # Try with https://releases.ubuntu.com/20.04/ubuntu-20.04-desktop-amd64.iso + # Try with https://releases.ubuntu.com/20.04/ubuntu-20.04.3-desktop-amd64.iso if sys.argv[1:]: download(sys.argv[1:], "./") else: diff --git a/examples/dynamic_progress.py b/examples/dynamic_progress.py new file mode 100644 index 0000000000..c38da2ebf0 --- /dev/null +++ b/examples/dynamic_progress.py @@ -0,0 +1,118 @@ +""" + +Demonstrates how to create a dynamic group of progress bars, +showing multi-level progress for multiple tasks (installing apps in the example), +each of which consisting of multiple steps. + +""" + +import time + +from rich.console import Group +from rich.panel import Panel +from rich.live import Live +from rich.progress import ( + BarColumn, + Progress, + SpinnerColumn, + TextColumn, + TimeElapsedColumn, +) + + +def run_steps(name, step_times, app_steps_task_id): + """Run steps for a single app, and update corresponding progress bars.""" + + for idx, step_time in enumerate(step_times): + # add progress bar for this step (time elapsed + spinner) + action = step_actions[idx] + step_task_id = step_progress.add_task("", action=action, name=name) + + # run steps, update progress + for _ in range(step_time): + time.sleep(0.5) + step_progress.update(step_task_id, advance=1) + + # stop and hide progress bar for this step when done + step_progress.stop_task(step_task_id) + step_progress.update(step_task_id, visible=False) + + # also update progress bar for current app when step is done + app_steps_progress.update(app_steps_task_id, advance=1) + + +# progress bar for current app showing only elapsed time, +# which will stay visible when app is installed +current_app_progress = Progress( + TimeElapsedColumn(), + TextColumn("{task.description}"), +) + +# progress bars for single app steps (will be hidden when step is done) +step_progress = Progress( + TextColumn(" "), + TimeElapsedColumn(), + TextColumn("[bold purple]{task.fields[action]}"), + SpinnerColumn("simpleDots"), +) +# progress bar for current app (progress in steps) +app_steps_progress = Progress( + TextColumn( + "[bold blue]Progress for app {task.fields[name]}: {task.percentage:.0f}%" + ), + BarColumn(), + TextColumn("({task.completed} of {task.total} steps done)"), +) +# overall progress bar +overall_progress = Progress( + TimeElapsedColumn(), BarColumn(), TextColumn("{task.description}") +) +# group of progress bars; +# some are always visible, others will disappear when progress is complete +progress_group = Group( + Panel(Group(current_app_progress, step_progress, app_steps_progress)), + overall_progress, +) + +# tuple specifies how long each step takes for that app +step_actions = ("downloading", "configuring", "building", "installing") +apps = [ + ("one", (2, 1, 4, 2)), + ("two", (1, 3, 8, 4)), + ("three", (2, 1, 3, 2)), +] + +# create overall progress bar +overall_task_id = overall_progress.add_task("", total=len(apps)) + +# use own live instance as context manager with group of progress bars, +# which allows for running multiple different progress bars in parallel, +# and dynamically showing/hiding them +with Live(progress_group): + + for idx, (name, step_times) in enumerate(apps): + # update message on overall progress bar + top_descr = "[bold #AAAAAA](%d out of %d apps installed)" % (idx, len(apps)) + overall_progress.update(overall_task_id, description=top_descr) + + # add progress bar for steps of this app, and run the steps + current_task_id = current_app_progress.add_task("Installing app %s" % name) + app_steps_task_id = app_steps_progress.add_task( + "", total=len(step_times), name=name + ) + run_steps(name, step_times, app_steps_task_id) + + # stop and hide steps progress bar for this specific app + app_steps_progress.update(app_steps_task_id, visible=False) + current_app_progress.stop_task(current_task_id) + current_app_progress.update( + current_task_id, description="[bold green]App %s installed!" % name + ) + + # increase overall progress now this task is done + overall_progress.update(overall_task_id, advance=1) + + # final update for message on overall progress bar + overall_progress.update( + overall_task_id, description="[bold green]%s apps installed, done!" % len(apps) + ) diff --git a/examples/exception.py b/examples/exception.py index 6bf2a1ebe9..39dbdf4244 100644 --- a/examples/exception.py +++ b/examples/exception.py @@ -2,6 +2,7 @@ Basic example to show how to print an traceback of an exception """ from typing import List, Tuple + from rich.console import Console console = Console() @@ -16,21 +17,25 @@ def divide_by(number: float, divisor: float) -> float: def divide_all(divides: List[Tuple[float, float]]) -> None: """Do something impossible every day.""" - try: - for number, divisor in divides: + + for number, divisor in divides: + console.print(f"dividing {number} by {divisor}") + try: result = divide_by(number, divisor) - console.print(f"{number} divided by {divisor} is {result}") - except Exception: - console.print_exception(extra_lines=5, show_locals=True) + except Exception: + console.print_exception(extra_lines=8, show_locals=True) + else: + console.print(f" = {result}") DIVIDES = [ (1000, 200), (10000, 500), + (1, 0), (0, 1000000), (3.1427, 2), - (2 ** 32, 2 ** 16), - (1, 0), + (888, 0), + (2**32, 2**16), ] divide_all(DIVIDES) diff --git a/examples/export.py b/examples/export.py new file mode 100644 index 0000000000..dada493d80 --- /dev/null +++ b/examples/export.py @@ -0,0 +1,56 @@ +""" +Demonstrates export console output +""" + +from rich.console import Console +from rich.table import Table + +console = Console(record=True) + + +def print_table(): + table = Table(title="Star Wars Movies") + + table.add_column("Released", style="cyan", no_wrap=True) + table.add_column("Title", style="magenta") + table.add_column("Box Office", justify="right", style="green") + + table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690") + table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") + table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889") + table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889") + + console.print(table) + + +# Prints table +print_table() + +# Get console output as text +file1 = "table_export_plaintext.txt" +text = console.export_text() +with open(file1, "w") as file: + file.write(text) +print(f"Exported console output as plain text to {file1}") + +# Calling print_table again because console output buffer +# is flushed once export function is called +print_table() + +# Get console output as html +# use clear=False so output is not flushed after export +file2 = "table_export_html.html" +html = console.export_html(clear=False) +with open(file2, "w") as file: + file.write(html) +print(f"Exported console output as html to {file2}") + +# Export text output to table_export.txt +file3 = "table_export_plaintext2.txt" +console.save_text(file3, clear=False) +print(f"Exported console output as plain text to {file3}") + +# Export html output to table_export.html +file4 = "table_export_html2.html" +console.save_html(file4) +print(f"Exported console output as html to {file4}") diff --git a/examples/file_progress.py b/examples/file_progress.py new file mode 100644 index 0000000000..fd18d75370 --- /dev/null +++ b/examples/file_progress.py @@ -0,0 +1,16 @@ +from time import sleep +from urllib.request import urlopen + +from rich.progress import wrap_file + +# Read a URL with urlopen +response = urlopen("https://www.textualize.io") +# Get the size from the headers +size = int(response.headers["Content-Length"]) + +# Wrap the response so that it update progress + +with wrap_file(response, size) as file: + for line in file: + print(line.decode("utf-8"), end="") + sleep(0.1) diff --git a/examples/fullscreen.py b/examples/fullscreen.py new file mode 100644 index 0000000000..5ccc6fb3fa --- /dev/null +++ b/examples/fullscreen.py @@ -0,0 +1,184 @@ +""" +Demonstrates a Rich "application" using the Layout and Live classes. + +""" + +from datetime import datetime + +from rich import box +from rich.align import Align +from rich.console import Console, Group +from rich.layout import Layout +from rich.panel import Panel +from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn +from rich.syntax import Syntax +from rich.table import Table +from rich.text import Text + +console = Console() + + +def make_layout() -> Layout: + """Define the layout.""" + layout = Layout(name="root") + + layout.split( + Layout(name="header", size=3), + Layout(name="main", ratio=1), + Layout(name="footer", size=7), + ) + layout["main"].split_row( + Layout(name="side"), + Layout(name="body", ratio=2, minimum_size=60), + ) + layout["side"].split(Layout(name="box1"), Layout(name="box2")) + return layout + + +def make_sponsor_message() -> Panel: + """Some example content.""" + sponsor_message = Table.grid(padding=1) + sponsor_message.add_column(style="green", justify="right") + sponsor_message.add_column(no_wrap=True) + sponsor_message.add_row( + "Sponsor me", + "[u blue link=https://github.com/sponsors/willmcgugan]https://github.com/sponsors/willmcgugan", + ) + sponsor_message.add_row( + "Buy me a :coffee:", + "[u blue link=https://ko-fi.com/willmcgugan]https://ko-fi.com/willmcgugan", + ) + sponsor_message.add_row( + "Twitter", + "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", + ) + sponsor_message.add_row( + "Blog", "[u blue link=https://www.willmcgugan.com]https://www.willmcgugan.com" + ) + + intro_message = Text.from_markup( + """Consider supporting my work via Github Sponsors (ask your company / organization), or buy me a coffee to say thanks. - Will McGugan""" + ) + + message = Table.grid(padding=1) + message.add_column() + message.add_column(no_wrap=True) + message.add_row(intro_message, sponsor_message) + + message_panel = Panel( + Align.center( + Group(intro_message, "\n", Align.center(sponsor_message)), + vertical="middle", + ), + box=box.ROUNDED, + padding=(1, 2), + title="[b red]Thanks for trying out Rich!", + border_style="bright_blue", + ) + return message_panel + + +class Header: + """Display header with clock.""" + + def __rich__(self) -> Panel: + grid = Table.grid(expand=True) + grid.add_column(justify="center", ratio=1) + grid.add_column(justify="right") + grid.add_row( + "[b]Rich[/b] Layout application", + datetime.now().ctime().replace(":", "[blink]:[/]"), + ) + return Panel(grid, style="white on blue") + + +def make_syntax() -> Syntax: + code = """\ +def ratio_resolve(total: int, edges: List[Edge]) -> List[int]: + sizes = [(edge.size or None) for edge in edges] + + # While any edges haven't been calculated + while any(size is None for size in sizes): + # Get flexible edges and index to map these back on to sizes list + flexible_edges = [ + (index, edge) + for index, (size, edge) in enumerate(zip(sizes, edges)) + if size is None + ] + # Remaining space in total + remaining = total - sum(size or 0 for size in sizes) + if remaining <= 0: + # No room for flexible edges + sizes[:] = [(size or 0) for size in sizes] + break + # Calculate number of characters in a ratio portion + portion = remaining / sum((edge.ratio or 1) for _, edge in flexible_edges) + + # If any edges will be less than their minimum, replace size with the minimum + for index, edge in flexible_edges: + if portion * edge.ratio <= edge.minimum_size: + sizes[index] = edge.minimum_size + break + else: + # Distribute flexible space and compensate for rounding error + # Since edge sizes can only be integers we need to add the remainder + # to the following line + _modf = modf + remainder = 0.0 + for index, edge in flexible_edges: + remainder, size = _modf(portion * edge.ratio + remainder) + sizes[index] = int(size) + break + # Sizes now contains integers only + return cast(List[int], sizes) + """ + syntax = Syntax(code, "python", line_numbers=True) + return syntax + + +job_progress = Progress( + "{task.description}", + SpinnerColumn(), + BarColumn(), + TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), +) +job_progress.add_task("[green]Cooking") +job_progress.add_task("[magenta]Baking", total=200) +job_progress.add_task("[cyan]Mixing", total=400) + +total = sum(task.total for task in job_progress.tasks) +overall_progress = Progress() +overall_task = overall_progress.add_task("All Jobs", total=int(total)) + +progress_table = Table.grid(expand=True) +progress_table.add_row( + Panel( + overall_progress, + title="Overall Progress", + border_style="green", + padding=(2, 2), + ), + Panel(job_progress, title="[b]Jobs", border_style="red", padding=(1, 2)), +) + + +layout = make_layout() +layout["header"].update(Header()) +layout["body"].update(make_sponsor_message()) +layout["box2"].update(Panel(make_syntax(), border_style="green")) +layout["box1"].update(Panel(layout.tree, border_style="red")) +layout["footer"].update(progress_table) + + +from rich.live import Live +from time import sleep + +with Live(layout, refresh_per_second=10, screen=True): + while not overall_progress.finished: + sleep(0.1) + for job in job_progress.tasks: + if not job.finished: + job_progress.advance(job.id) + + completed = sum(task.completed for task in job_progress.tasks) + overall_progress.update(overall_task, completed=completed) diff --git a/examples/group.py b/examples/group.py index a61f830ddb..598e4c39bf 100644 --- a/examples/group.py +++ b/examples/group.py @@ -1,8 +1,8 @@ from rich import print -from rich.console import RenderGroup +from rich.console import Group from rich.panel import Panel -panel_group = RenderGroup( +panel_group = Group( Panel("Hello", style="on blue"), Panel("World", style="on red"), ) diff --git a/examples/group2.py b/examples/group2.py index 13be0704fc..54c1bf7738 100644 --- a/examples/group2.py +++ b/examples/group2.py @@ -1,9 +1,9 @@ from rich import print -from rich.console import render_group +from rich.console import group from rich.panel import Panel -@render_group() +@group() def get_panels(): yield Panel("Hello", style="on blue") yield Panel("World", style="on red") diff --git a/examples/layout.py b/examples/layout.py new file mode 100644 index 0000000000..1e94dac008 --- /dev/null +++ b/examples/layout.py @@ -0,0 +1,55 @@ +""" + +Demonstrates a dynamic Layout + +""" + +from datetime import datetime + +from time import sleep + +from rich.align import Align +from rich.console import Console +from rich.layout import Layout +from rich.live import Live +from rich.text import Text + +console = Console() +layout = Layout() + +layout.split( + Layout(name="header", size=1), + Layout(ratio=1, name="main"), + Layout(size=10, name="footer"), +) + +layout["main"].split_row(Layout(name="side"), Layout(name="body", ratio=2)) + +layout["side"].split(Layout(), Layout()) + +layout["body"].update( + Align.center( + Text( + """This is a demonstration of rich.Layout\n\nHit Ctrl+C to exit""", + justify="center", + ), + vertical="middle", + ) +) + + +class Clock: + """Renders the time in the center of the screen.""" + + def __rich__(self) -> Text: + return Text(datetime.now().ctime(), style="bold magenta", justify="center") + + +layout["header"].update(Clock()) + +with Live(layout, screen=True, redirect_stderr=False) as live: + try: + while True: + sleep(1) + except KeyboardInterrupt: + pass diff --git a/examples/live_progress.py b/examples/live_progress.py new file mode 100644 index 0000000000..7ae1056733 --- /dev/null +++ b/examples/live_progress.py @@ -0,0 +1,45 @@ +""" + +Demonstrates the use of multiple Progress instances in a single Live display. + +""" + +from time import sleep + +from rich.live import Live +from rich.panel import Panel +from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn +from rich.table import Table + + +job_progress = Progress( + "{task.description}", + SpinnerColumn(), + BarColumn(), + TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), +) +job1 = job_progress.add_task("[green]Cooking") +job2 = job_progress.add_task("[magenta]Baking", total=200) +job3 = job_progress.add_task("[cyan]Mixing", total=400) + +total = sum(task.total for task in job_progress.tasks) +overall_progress = Progress() +overall_task = overall_progress.add_task("All Jobs", total=int(total)) + +progress_table = Table.grid() +progress_table.add_row( + Panel.fit( + overall_progress, title="Overall Progress", border_style="green", padding=(2, 2) + ), + Panel.fit(job_progress, title="[b]Jobs", border_style="red", padding=(1, 2)), +) + +with Live(progress_table, refresh_per_second=10): + while not overall_progress.finished: + sleep(0.1) + for job in job_progress.tasks: + if not job.finished: + job_progress.advance(job.id) + + completed = sum(task.completed for task in job_progress.tasks) + overall_progress.update(overall_task, completed=completed) diff --git a/examples/print_calendar.py b/examples/print_calendar.py new file mode 100644 index 0000000000..d9586aaa8a --- /dev/null +++ b/examples/print_calendar.py @@ -0,0 +1,70 @@ +""" +Builds calendar layout using Columns and Tables. +Usage: +python print_calendar.py [YEAR] +Example: +python print_calendar.py 2021 +""" +import argparse +import calendar +from datetime import datetime + +from rich.align import Align +from rich import box +from rich.columns import Columns +from rich.console import Console +from rich.table import Table +from rich.text import Text + + +def print_calendar(year): + """Print a calendar for a given year.""" + + today = datetime.today() + year = int(year) + cal = calendar.Calendar() + today_tuple = today.day, today.month, today.year + + tables = [] + + for month in range(1, 13): + table = Table( + title=f"{calendar.month_name[month]} {year}", + style="green", + box=box.SIMPLE_HEAVY, + padding=0, + ) + + for week_day in cal.iterweekdays(): + table.add_column( + "{:.3}".format(calendar.day_name[week_day]), justify="right" + ) + + month_days = cal.monthdayscalendar(year, month) + for weekdays in month_days: + days = [] + for index, day in enumerate(weekdays): + day_label = Text(str(day or ""), style="magenta") + if index in (5, 6): + day_label.stylize("blue") + if day and (day, month, year) == today_tuple: + day_label.stylize("white on dark_red") + days.append(day_label) + table.add_row(*days) + + tables.append(Align.center(table)) + + console = Console() + columns = Columns(tables, padding=1, expand=True) + console.rule(str(year)) + console.print() + console.print(columns) + console.rule(str(year)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Rich calendar") + parser.add_argument("year", metavar="year", type=int) + args = parser.parse_args() + + print_calendar(args.year) diff --git a/examples/recursive_error.py b/examples/recursive_error.py new file mode 100644 index 0000000000..12b06e6eb5 --- /dev/null +++ b/examples/recursive_error.py @@ -0,0 +1,25 @@ +""" + +Demonstrates Rich tracebacks for recursion errors. + +Rich can exclude frames in the middle to avoid huge tracebacks. + +""" + +from rich.console import Console + + +def foo(n): + return bar(n) + + +def bar(n): + return foo(n) + + +console = Console() + +try: + foo(1) +except Exception: + console.print_exception(max_frames=20) diff --git a/examples/repr.py b/examples/repr.py new file mode 100644 index 0000000000..1a3de46092 --- /dev/null +++ b/examples/repr.py @@ -0,0 +1,23 @@ +import rich.repr + + +@rich.repr.auto +class Bird: + def __init__(self, name, eats=None, fly=True, extinct=False): + self.name = name + self.eats = list(eats) if eats else [] + self.fly = fly + self.extinct = extinct + + +# Note that the repr is still generated without Rich +# Try commenting out the following line + +from rich import print + +BIRDS = { + "gull": Bird("gull", eats=["fish", "chips", "ice cream", "sausage rolls"]), + "penguin": Bird("penguin", eats=["fish"], fly=False), + "dodo": Bird("dodo", eats=["fruit"], fly=False, extinct=True), +} +print(BIRDS) diff --git a/examples/save_table_svg.py b/examples/save_table_svg.py new file mode 100644 index 0000000000..e22aee22b0 --- /dev/null +++ b/examples/save_table_svg.py @@ -0,0 +1,26 @@ +""" +Demonstrates how to export a SVG +""" + +from rich.console import Console +from rich.table import Table + +table = Table(title="Star Wars Movies") + +table.add_column("Released", style="cyan", no_wrap=True) +table.add_column("Title", style="magenta") +table.add_column("Box Office", justify="right", style="green") + +table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690") +table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") +table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889") +table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889") + +console = Console(record=True) +console.print(table, justify="center") +console.save_svg("table.svg", title="save_table_svg.py") + +import os +import webbrowser + +webbrowser.open(f"file://{os.path.abspath('table.svg')}") diff --git a/examples/screen.py b/examples/screen.py new file mode 100644 index 0000000000..eb429b1948 --- /dev/null +++ b/examples/screen.py @@ -0,0 +1,16 @@ +""" +Demonstration of Console.screen() +""" + +from time import sleep + +from rich.align import Align +from rich.console import Console +from rich.panel import Panel + +console = Console() + +with console.screen(style="bold white on red") as screen: + text = Align.center("[blink]Don't Panic![/blink]", vertical="middle") + screen.update(Panel(text)) + sleep(5) diff --git a/examples/spinners.py b/examples/spinners.py new file mode 100644 index 0000000000..9daf847cfb --- /dev/null +++ b/examples/spinners.py @@ -0,0 +1,23 @@ +from time import sleep + +from rich.columns import Columns +from rich.panel import Panel +from rich.live import Live +from rich.text import Text +from rich.spinner import Spinner, SPINNERS + +all_spinners = Columns( + [ + Spinner(spinner_name, text=Text(repr(spinner_name), style="green")) + for spinner_name in sorted(SPINNERS) + ], + column_first=True, + expand=True, +) + +with Live( + Panel(all_spinners, title="Spinners", border_style="blue"), + refresh_per_second=20, +) as live: + while True: + sleep(0.1) diff --git a/examples/status.py b/examples/status.py new file mode 100644 index 0000000000..88d1679edb --- /dev/null +++ b/examples/status.py @@ -0,0 +1,13 @@ +from time import sleep +from rich.console import Console + +console = Console() +console.print() + +tasks = [f"task {n}" for n in range(1, 11)] + +with console.status("[bold green]Working on tasks...") as status: + while tasks: + task = tasks.pop(0) + sleep(1) + console.log(f"{task} complete") diff --git a/examples/suppress.py b/examples/suppress.py new file mode 100644 index 0000000000..d0bfaf4ec2 --- /dev/null +++ b/examples/suppress.py @@ -0,0 +1,23 @@ +try: + import click +except ImportError: + print("Please install click for this example") + print(" pip install click") + exit() + +from rich.traceback import install + +install(suppress=[click]) + + +@click.command() +@click.option("--count", default=1, help="Number of greetings.") +def hello(count): + """Simple program that greets NAME for a total of COUNT times.""" + 1 / 0 + for x in range(count): + click.echo(f"Hello {name}!") + + +if __name__ == "__main__": + hello() diff --git a/examples/table_movie.py b/examples/table_movie.py index fe9c753bbd..811eb51b70 100644 --- a/examples/table_movie.py +++ b/examples/table_movie.py @@ -1,10 +1,12 @@ -from contextlib import contextmanager +"""Same as the table_movie.py but uses Live to update""" import time +from contextlib import contextmanager +from rich import box +from rich.align import Align from rich.console import Console +from rich.live import Live from rich.table import Table -from rich.measure import Measurement -from rich import box from rich.text import Text TABLE_DATA = [ @@ -59,177 +61,136 @@ @contextmanager def beat(length: int = 1) -> None: - with console: - console.clear() - yield + yield time.sleep(length * BEAT_TIME) table = Table(show_footer=False) - +table_centered = Align.center(table) console.clear() -console.show_cursor(False) -try: - table.add_column("Release Date", no_wrap=True) +with Live(table_centered, console=console, screen=False, refresh_per_second=20): with beat(10): - console.print(table, justify="center") + table.add_column("Release Date", no_wrap=True) - table.add_column("Title", Text.from_markup("[b]Total", justify="right")) with beat(10): - console.print(table, justify="center") + table.add_column("Title", Text.from_markup("[b]Total", justify="right")) - table.add_column("Budget", "[u]$412,000,000", no_wrap=True) with beat(10): - console.print(table, justify="center") + table.add_column("Budget", "[u]$412,000,000", no_wrap=True) - table.add_column("Opening Weekend", "[u]$577,703,455", no_wrap=True) with beat(10): - console.print(table, justify="center") + table.add_column("Opening Weekend", "[u]$577,703,455", no_wrap=True) - table.add_column("Box Office", "[u]$4,331,212,357", no_wrap=True) with beat(10): - console.print(table, justify="center") + table.add_column("Box Office", "[u]$4,331,212,357", no_wrap=True) - table.title = "Star Wars Box Office" with beat(10): - console.print(table, justify="center") + table.title = "Star Wars Box Office" - table.title = ( - "[not italic]:popcorn:[/] Star Wars Box Office [not italic]:popcorn:[/]" - ) with beat(10): - console.print(table, justify="center") + table.title = ( + "[not italic]:popcorn:[/] Star Wars Box Office [not italic]:popcorn:[/]" + ) - table.caption = "Made with Rich" with beat(10): - console.print(table, justify="center") + table.caption = "Made with Rich" - table.caption = "Made with [b]Rich[/b]" with beat(10): - console.print(table, justify="center") + table.caption = "Made with [b]Rich[/b]" - table.caption = "Made with [b magenta not dim]Rich[/]" with beat(10): - console.print(table, justify="center") + table.caption = "Made with [b magenta not dim]Rich[/]" for row in TABLE_DATA: - table.add_row(*row) with beat(10): - console.print(table, justify="center") + table.add_row(*row) - table.show_footer = True with beat(10): - console.print(table, justify="center") + table.show_footer = True - table_width = Measurement.get(console, table, console.width).maximum + table_width = console.measure(table).maximum - table.columns[2].justify = "right" with beat(10): - console.print(table, justify="center") + table.columns[2].justify = "right" - table.columns[3].justify = "right" with beat(10): - console.print(table, justify="center") + table.columns[3].justify = "right" - table.columns[4].justify = "right" with beat(10): - console.print(table, justify="center") + table.columns[4].justify = "right" - table.columns[2].header_style = "bold red" with beat(10): - console.print(table, justify="center") + table.columns[2].header_style = "bold red" - table.columns[3].header_style = "bold green" with beat(10): - console.print(table, justify="center") + table.columns[3].header_style = "bold green" - table.columns[4].header_style = "bold blue" with beat(10): - console.print(table, justify="center") + table.columns[4].header_style = "bold blue" - table.columns[2].style = "red" with beat(10): - console.print(table, justify="center") + table.columns[2].style = "red" - table.columns[3].style = "green" with beat(10): - console.print(table, justify="center") + table.columns[3].style = "green" - table.columns[4].style = "blue" with beat(10): - console.print(table, justify="center") + table.columns[4].style = "blue" - table.columns[0].style = "cyan" - table.columns[0].header_style = "bold cyan" with beat(10): - console.print(table, justify="center") + table.columns[0].style = "cyan" + table.columns[0].header_style = "bold cyan" - table.columns[1].style = "magenta" - table.columns[1].header_style = "bold magenta" with beat(10): - console.print(table, justify="center") + table.columns[1].style = "magenta" + table.columns[1].header_style = "bold magenta" - table.columns[2].footer_style = "bright_red" with beat(10): - console.print(table, justify="center") + table.columns[2].footer_style = "bright_red" - table.columns[3].footer_style = "bright_green" with beat(10): - console.print(table, justify="center") + table.columns[3].footer_style = "bright_green" - table.columns[4].footer_style = "bright_blue" with beat(10): - console.print(table, justify="center") + table.columns[4].footer_style = "bright_blue" - table.row_styles = ["none", "dim"] with beat(10): - console.print(table, justify="center") + table.row_styles = ["none", "dim"] - table.border_style = "bright_yellow" with beat(10): - console.print(table, justify="center") + table.border_style = "bright_yellow" - for box in [ + for box_style in [ box.SQUARE, box.MINIMAL, box.SIMPLE, box.SIMPLE_HEAD, ]: - table.box = box with beat(10): - console.print(table, justify="center") + table.box = box_style - table.pad_edge = False with beat(10): - console.print(table, justify="center") + table.pad_edge = False - original_width = Measurement.get(console, table).maximum + original_width = console.measure(table).maximum for width in range(original_width, console.width, 2): - table.width = width - with beat(2): - console.print(table, justify="center") + with beat(1): + table.width = width for width in range(console.width, original_width, -2): - table.width = width - with beat(2): - console.print(table, justify="center") + with beat(1): + table.width = width for width in range(original_width, 90, -2): - table.width = width - with beat(2): - console.print(table, justify="center") + with beat(1): + table.width = width for width in range(90, original_width + 1, 2): - table.width = width - with beat(2): - console.print(table, justify="center") + with beat(1): + table.width = width - table.width = None with beat(2): - console.print(table, justify="center") - -finally: - console.show_cursor(True) + table.width = None diff --git a/examples/top_lite_simulator.py b/examples/top_lite_simulator.py new file mode 100644 index 0000000000..4fecaaa8b8 --- /dev/null +++ b/examples/top_lite_simulator.py @@ -0,0 +1,85 @@ +"""Lite simulation of the top linux command.""" +import datetime +import random +import sys +import time +from dataclasses import dataclass + +from rich import box +from rich.console import Console +from rich.live import Live +from rich.table import Table + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal + + +@dataclass +class Process: + pid: int + command: str + cpu_percent: float + memory: int + start_time: datetime.datetime + thread_count: int + state: Literal["running", "sleeping"] + + @property + def memory_str(self) -> str: + if self.memory > 1e6: + return f"{int(self.memory/1e6)}M" + if self.memory > 1e3: + return f"{int(self.memory/1e3)}K" + return str(self.memory) + + @property + def time_str(self) -> str: + return str(datetime.datetime.now() - self.start_time) + + +def generate_process(pid: int) -> Process: + return Process( + pid=pid, + command=f"Process {pid}", + cpu_percent=random.random() * 20, + memory=random.randint(10, 200) ** 3, + start_time=datetime.datetime.now() + - datetime.timedelta(seconds=random.randint(0, 500) ** 2), + thread_count=random.randint(1, 32), + state="running" if random.randint(0, 10) < 8 else "sleeping", + ) + + +def create_process_table(height: int) -> Table: + + processes = sorted( + [generate_process(pid) for pid in range(height)], + key=lambda p: p.cpu_percent, + reverse=True, + ) + table = Table( + "PID", "Command", "CPU %", "Memory", "Time", "Thread #", "State", box=box.SIMPLE + ) + + for process in processes: + table.add_row( + str(process.pid), + process.command, + f"{process.cpu_percent:.1f}", + process.memory_str, + process.time_str, + str(process.thread_count), + process.state, + ) + + return table + + +console = Console() + +with Live(console=console, screen=True, auto_refresh=False) as live: + while True: + live.update(create_process_table(console.size.height - 4), refresh=True) + time.sleep(1) diff --git a/examples/tree.py b/examples/tree.py new file mode 100644 index 0000000000..99277192b3 --- /dev/null +++ b/examples/tree.py @@ -0,0 +1,55 @@ +""" +Demonstrates how to display a tree of files / directories with the Tree renderable. +""" + +import os +import pathlib +import sys + +from rich import print +from rich.filesize import decimal +from rich.markup import escape +from rich.text import Text +from rich.tree import Tree + + +def walk_directory(directory: pathlib.Path, tree: Tree) -> None: + """Recursively build a Tree with directory contents.""" + # Sort dirs first then by filename + paths = sorted( + pathlib.Path(directory).iterdir(), + key=lambda path: (path.is_file(), path.name.lower()), + ) + for path in paths: + # Remove hidden files + if path.name.startswith("."): + continue + if path.is_dir(): + style = "dim" if path.name.startswith("__") else "" + branch = tree.add( + f"[bold magenta]:open_file_folder: [link file://{path}]{escape(path.name)}", + style=style, + guide_style=style, + ) + walk_directory(path, branch) + else: + text_filename = Text(path.name, "green") + text_filename.highlight_regex(r"\..*$", "bold red") + text_filename.stylize(f"link file://{path}") + file_size = path.stat().st_size + text_filename.append(f" ({decimal(file_size)})", "blue") + icon = "🐍 " if path.suffix == ".py" else "📄 " + tree.add(Text(icon) + text_filename) + + +try: + directory = os.path.abspath(sys.argv[1]) +except IndexError: + print("[b]Usage:[/] python tree.py ") +else: + tree = Tree( + f":open_file_folder: [link file://{directory}]{directory}", + guide_style="bold bright_blue", + ) + walk_directory(pathlib.Path(directory), tree) + print(tree) diff --git a/imgs/downloader.gif b/imgs/downloader.gif index 2033d7b981..dad59f2588 100644 Binary files a/imgs/downloader.gif and b/imgs/downloader.gif differ diff --git a/imgs/features.png b/imgs/features.png index 12c941e182..5ba75f5dbb 100644 Binary files a/imgs/features.png and b/imgs/features.png differ diff --git a/imgs/inspect.png b/imgs/inspect.png new file mode 100644 index 0000000000..62e4f8b906 Binary files /dev/null and b/imgs/inspect.png differ diff --git a/imgs/logo.svg b/imgs/logo.svg new file mode 100644 index 0000000000..4842c4a8ef --- /dev/null +++ b/imgs/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/imgs/progress.gif b/imgs/progress.gif index e145478fa9..b4ccfa2f4b 100644 Binary files a/imgs/progress.gif and b/imgs/progress.gif differ diff --git a/imgs/spinners.gif b/imgs/spinners.gif new file mode 100644 index 0000000000..7d3445e104 Binary files /dev/null and b/imgs/spinners.gif differ diff --git a/imgs/status.gif b/imgs/status.gif new file mode 100644 index 0000000000..c930fc76ef Binary files /dev/null and b/imgs/status.gif differ diff --git a/imgs/traceback.png b/imgs/traceback.png index 55b2e79a0b..07a4a50076 100644 Binary files a/imgs/traceback.png and b/imgs/traceback.png differ diff --git a/imgs/tree.png b/imgs/tree.png new file mode 100644 index 0000000000..04a30a53e2 Binary files /dev/null and b/imgs/tree.png differ diff --git a/poetry.lock b/poetry.lock index 0f36a733e0..30edc19b15 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,24 +1,88 @@ [[package]] name = "appnope" -version = "0.1.0" -description = "Disable App Nap on OS X 10.9" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" category = "main" optional = true python-versions = "*" [[package]] -name = "attrs" -version = "19.3.0" -description = "Classes Without Boilerplate" +name = "argon2-cffi" +version = "21.3.0" +description = "The secure Argon2 password hashing algorithm." +category = "main" +optional = true +python-versions = ">=3.6" + +[package.dependencies] +argon2-cffi-bindings = "*" +dataclasses = {version = "*", markers = "python_version < \"3.7\""} +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] +docs = ["sphinx", "sphinx-notfound-page", "furo"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" category = "main" optional = true +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["pytest", "cogapp", "pre-commit", "wheel"] +tests = ["pytest"] + +[[package]] +name = "asv" +version = "0.5.1" +description = "Airspeed Velocity: A simple Python history benchmarking tool" +category = "dev" +optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[package.dependencies] +six = ">=1.4" + +[package.extras] +hg = ["python-hglib (>=1.5)"] +testing = ["virtualenv (>=1.7)", "filelock", "six", "pip", "setuptools", "wheel", "numpy", "scipy", "selenium", "pytest-xdist", "pytest-timeout", "feedparser", "python-hglib", "pytest (>=4.4.0)", "pytest-rerunfailures (>=8.0)", "pytest-faulthandler", "pytest (>=4.4.0,<5.0)", "pytest-rerunfailures (>=8.0,<9.0)", "pytest-faulthandler (<2.0)"] + +[[package]] +name = "async-generator" +version = "1.10" +description = "Async generators and context managers for Python 3.5+" +category = "main" +optional = true +python-versions = ">=3.5" + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + [package.extras] -azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] -dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] -docs = ["sphinx", "zope.interface"] -tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "backcall" @@ -28,19 +92,74 @@ category = "main" optional = true python-versions = "*" +[[package]] +name = "black" +version = "22.3.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "bleach" -version = "3.1.5" +version = "4.1.0" description = "An easy safelist-based HTML-sanitizing tool." category = "main" optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] packaging = "*" six = ">=1.9.0" webencodings = "*" +[[package]] +name = "cffi" +version = "1.15.0" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = true +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[[package]] +name = "click" +version = "8.0.4" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + [[package]] name = "colorama" version = "0.4.4" @@ -60,6 +179,20 @@ python-versions = "*" [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] +[[package]] +name = "coverage" +version = "6.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + [[package]] name = "dataclasses" version = "0.8" @@ -70,46 +203,102 @@ python-versions = ">=3.6, <3.7" [[package]] name = "decorator" -version = "4.4.2" +version = "5.1.1" description = "Decorators for Humans" category = "main" optional = true -python-versions = ">=2.6, !=3.0.*, !=3.1.*" +python-versions = ">=3.5" [[package]] name = "defusedxml" -version = "0.6.0" +version = "0.7.1" description = "XML bomb protection for Python stdlib modules" category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "distlib" +version = "0.3.4" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "entrypoints" -version = "0.3" +version = "0.4" description = "Discover and load entry points from installed packages." category = "main" optional = true -python-versions = ">=2.7" +python-versions = ">=3.6" + +[[package]] +name = "filelock" +version = "3.4.1" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] +testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] + +[[package]] +name = "identify" +version = "2.4.4" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.extras] +license = ["ukkonen"] [[package]] name = "importlib-metadata" -version = "1.7.0" +version = "4.8.3" description = "Read metadata from Python packages" category = "main" -optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +optional = false +python-versions = ">=3.6" [package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + +[[package]] +name = "importlib-resources" +version = "5.2.3" +description = "Read resources from Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" [[package]] name = "ipykernel" -version = "5.3.2" +version = "5.5.6" description = "IPython Kernel for Jupyter" category = "main" optional = true @@ -118,16 +307,17 @@ python-versions = ">=3.5" [package.dependencies] appnope = {version = "*", markers = "platform_system == \"Darwin\""} ipython = ">=5.0.0" +ipython-genutils = "*" jupyter-client = "*" tornado = ">=4.2" traitlets = ">=4.1.0" [package.extras] -test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose"] +test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "jedi (<=0.17.2)"] [[package]] name = "ipython" -version = "7.16.1" +version = "7.16.3" description = "IPython: Productive Interactive Computing" category = "main" optional = true @@ -138,7 +328,7 @@ appnope = {version = "*", markers = "sys_platform == \"darwin\""} backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" -jedi = ">=0.10" +jedi = ">=0.10,<=0.17.2" pexpect = {version = "*", markers = "sys_platform != \"win32\""} pickleshare = "*" prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" @@ -166,7 +356,7 @@ python-versions = "*" [[package]] name = "ipywidgets" -version = "7.5.1" +version = "7.7.0" description = "IPython HTML widgets for Jupyter" category = "main" optional = true @@ -175,16 +365,18 @@ python-versions = "*" [package.dependencies] ipykernel = ">=4.5.1" ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} +ipython-genutils = ">=0.2.0,<0.3.0" +jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} nbformat = ">=4.2.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=3.5.0,<3.6.0" +widgetsnbextension = ">=3.6.0,<3.7.0" [package.extras] test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] [[package]] name = "jedi" -version = "0.17.1" +version = "0.17.2" description = "An autocompletion tool for Python that can be used for text editors." category = "main" optional = true @@ -199,21 +391,21 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] [[package]] name = "jinja2" -version = "2.11.2" +version = "3.0.3" description = "A very fast and expressive template engine." category = "main" optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.0.0" description = "An implementation of JSON Schema validation for Python" category = "main" optional = true @@ -222,50 +414,71 @@ python-versions = "*" [package.dependencies] attrs = ">=17.4.0" importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -pyrsistent = ">=0.14.0" -six = ">=1.11.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" [package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] name = "jupyter-client" -version = "6.1.5" +version = "7.1.2" description = "Jupyter protocol implementation and client libraries" category = "main" optional = true -python-versions = ">=3.5" +python-versions = ">=3.6.1" [package.dependencies] +entrypoints = "*" jupyter-core = ">=4.6.0" +nest-asyncio = ">=1.5" python-dateutil = ">=2.1" pyzmq = ">=13" tornado = ">=4.1" traitlets = "*" [package.extras] -test = ["ipykernel", "ipython", "mock", "pytest"] +doc = ["myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +test = ["codecov", "coverage", "ipykernel", "ipython", "mock", "mypy", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "pytest-timeout", "jedi (<0.18)"] [[package]] name = "jupyter-core" -version = "4.6.3" +version = "4.9.2" description = "Jupyter core package. A base package on which Jupyter projects rely." category = "main" optional = true -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,>=2.7" +python-versions = ">=3.6" [package.dependencies] -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} traitlets = "*" +[[package]] +name = "jupyterlab-pygments" +version = "0.1.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "main" +optional = true +python-versions = "*" + +[package.dependencies] +pygments = ">=2.4.1,<3" + +[[package]] +name = "jupyterlab-widgets" +version = "1.1.0" +description = "A JupyterLab extension." +category = "main" +optional = true +python-versions = ">=3.6" + [[package]] name = "markupsafe" -version = "1.1.1" +version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.6" [[package]] name = "mistune" @@ -275,13 +488,60 @@ category = "main" optional = true python-versions = "*" +[[package]] +name = "mypy" +version = "0.950" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mypy-extensions = ">=0.4.3" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nbclient" +version = "0.5.9" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "main" +optional = true +python-versions = ">=3.6.1" + +[package.dependencies] +async-generator = {version = "*", markers = "python_version < \"3.7\""} +jupyter-client = ">=6.1.5" +nbformat = ">=5.0" +nest-asyncio = "*" +traitlets = ">=4.2" + +[package.extras] +dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] +sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] +test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] + [[package]] name = "nbconvert" -version = "5.6.1" +version = "6.0.7" description = "Converting Jupyter Notebooks" category = "main" optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] bleach = "*" @@ -289,23 +549,25 @@ defusedxml = "*" entrypoints = ">=0.2.2" jinja2 = ">=2.4" jupyter-core = "*" +jupyterlab-pygments = "*" mistune = ">=0.8.1,<2" +nbclient = ">=0.5.0,<0.6.0" nbformat = ">=4.4" pandocfilters = ">=1.4.1" -pygments = "*" +pygments = ">=2.4.1" testpath = "*" traitlets = ">=4.2" [package.extras] -all = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "mock"] -docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "jupyter-client (>=5.3.1)"] -execute = ["jupyter-client (>=5.3.1)"] +all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] serve = ["tornado (>=4.0)"] -test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "mock"] +test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"] +webpdf = ["pyppeteer (==0.2.2)"] [[package]] name = "nbformat" -version = "5.0.7" +version = "5.1.3" description = "The Jupyter Notebook format" category = "main" optional = true @@ -318,57 +580,77 @@ jupyter-core = "*" traitlets = ">=4.1" [package.extras] -test = ["pytest", "pytest-cov", "testpath"] +fast = ["fastjsonschema"] +test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] + +[[package]] +name = "nest-asyncio" +version = "1.5.5" +description = "Patch asyncio to allow nested event loops" +category = "main" +optional = true +python-versions = ">=3.5" + +[[package]] +name = "nodeenv" +version = "1.6.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = "*" [[package]] name = "notebook" -version = "6.0.3" +version = "6.4.10" description = "A web-based notebook environment for interactive computing" category = "main" optional = true -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] +argon2-cffi = "*" ipykernel = "*" ipython-genutils = "*" jinja2 = "*" jupyter-client = ">=5.3.4" jupyter-core = ">=4.6.1" -nbconvert = "*" +nbconvert = ">=5" nbformat = "*" +nest-asyncio = ">=1.5" prometheus-client = "*" pyzmq = ">=17" -Send2Trash = "*" -terminado = ">=0.8.1" -tornado = ">=5.0" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" traitlets = ">=4.2.1" [package.extras] -test = ["nose", "coverage", "requests", "nose-warnings-filters", "nbval", "nose-exclude", "selenium", "pytest", "pytest-cov", "nose-exclude"] +docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] +json-logging = ["json-logging"] +test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] [[package]] name = "packaging" -version = "20.4" +version = "21.3" description = "Core utilities for Python packages" category = "main" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +optional = false +python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" -six = "*" +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pandocfilters" -version = "1.4.2" +version = "1.5.0" description = "Utilities for writing pandoc filters in python" category = "main" optional = true -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "parso" -version = "0.7.0" +version = "0.7.1" description = "A Python Parser" category = "main" optional = true @@ -377,6 +659,14 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] testing = ["docopt", "pytest (>=3.0.7)"] +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + [[package]] name = "pexpect" version = "4.8.0" @@ -396,66 +686,164 @@ category = "main" optional = true python-versions = "*" +[[package]] +name = "platformdirs" +version = "2.4.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "2.17.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-resources = {version = "<5.3", markers = "python_version < \"3.7\""} +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +toml = "*" +virtualenv = ">=20.0.8" + [[package]] name = "prometheus-client" -version = "0.8.0" +version = "0.14.1" description = "Python client for the Prometheus monitoring system." category = "main" optional = true -python-versions = "*" +python-versions = ">=3.6" [package.extras] twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.3" +version = "3.0.29" description = "Library for building powerful interactive command lines in Python" category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.6.2" [package.dependencies] wcwidth = "*" [[package]] name = "ptyprocess" -version = "0.6.0" +version = "0.7.0" description = "Run a subprocess in a pseudo terminal" category = "main" optional = true python-versions = "*" +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pygments" -version = "2.7.2" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "pyparsing" -version = "2.4.7" +version = "3.0.7" description = "Python parsing module" category = "main" -optional = true -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +optional = false +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyrsistent" -version = "0.16.0" +version = "0.18.0" description = "Persistent/Functional/Immutable data structures" category = "main" optional = true -python-versions = "*" +python-versions = ">=3.6" + +[[package]] +name = "pytest" +version = "7.0.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" [package.dependencies] -six = "*" +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] [[package]] name = "python-dateutil" -version = "2.8.1" +version = "2.8.2" description = "Extensions to the standard Python datetime module" category = "main" optional = true @@ -466,7 +854,7 @@ six = ">=1.5" [[package]] name = "pywin32" -version = "228" +version = "304" description = "Python for Window Extensions" category = "main" optional = true @@ -474,63 +862,99 @@ python-versions = "*" [[package]] name = "pywinpty" -version = "0.5.7" -description = "Python bindings for the winpty library" +version = "2.0.3" +description = "Pseudo terminal support for Windows from Python." category = "main" optional = true -python-versions = "*" +python-versions = ">=3.6" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" [[package]] name = "pyzmq" -version = "19.0.1" +version = "22.3.0" description = "Python bindings for 0MQ" category = "main" optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +python-versions = ">=3.6" + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} +py = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "send2trash" -version = "1.5.0" +version = "1.8.0" description = "Send file to trash natively under Mac OS X, Windows and Linux." category = "main" optional = true python-versions = "*" +[package.extras] +nativelib = ["pyobjc-framework-cocoa", "pywin32"] +objc = ["pyobjc-framework-cocoa"] +win32 = ["pywin32"] + [[package]] name = "six" -version = "1.15.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" category = "main" -optional = true +optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "terminado" -version = "0.8.3" -description = "Terminals served to xterm.js using Tornado websockets" +version = "0.13.0" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." category = "main" optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "*" [package.dependencies] ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=0.5", markers = "os_name == \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} tornado = ">=4" +[package.extras] +test = ["pytest"] + [[package]] name = "testpath" -version = "0.4.4" +version = "0.6.0" description = "Test utilities for code working with files and commands" category = "main" optional = true -python-versions = "*" +python-versions = ">= 3.5" [package.extras] -test = ["pathlib2"] +test = ["pytest"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "1.2.3" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.6" [[package]] name = "tornado" -version = "6.0.4" +version = "6.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "main" optional = true @@ -552,13 +976,49 @@ six = "*" [package.extras] test = ["pytest", "mock"] +[[package]] +name = "typed-ast" +version = "1.5.3" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "types-dataclasses" +version = "0.6.5" +description = "Typing stubs for dataclasses" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "typing-extensions" -version = "3.7.4.3" -description = "Backported and Experimental Type Hints for Python 3.5+" +version = "4.1.1" +description = "Backported and Experimental Type Hints for Python 3.6+" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" + +[[package]] +name = "virtualenv" +version = "20.14.1" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""} +platformdirs = ">=2,<3" +six = ">=1.9.0,<2" + +[package.extras] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] [[package]] name = "wcwidth" @@ -578,7 +1038,7 @@ python-versions = "*" [[package]] name = "widgetsnbextension" -version = "3.5.1" +version = "3.6.0" description = "IPython HTML widgets for Jupyter" category = "main" optional = true @@ -589,40 +1049,163 @@ notebook = ">=4.4.1" [[package]] name = "zipp" -version = "3.1.0" +version = "3.6.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" -optional = true +optional = false python-versions = ">=3.6" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["jaraco.itertools", "func-timeout"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [extras] jupyter = ["ipywidgets"] [metadata] lock-version = "1.1" -python-versions = "^3.6" -content-hash = "2d2f8de1abd0be719c813e5c47d7b48620c01de464894ab995485e85fb804454" +python-versions = "^3.6.3" +content-hash = "db93dc88a30c445999c422ad140ff15c2d28d0017efe262ce0f750cb42b45baf" [metadata.files] appnope = [ - {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, - {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] +argon2-cffi = [ + {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, + {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, +] +argon2-cffi-bindings = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] +asv = [ + {file = "asv-0.5.1.tar.gz", hash = "sha256:805fc3cc46c0bcf3e7baeaa16a12e4b92f1276c25490db4cb80fc541afa52bfc"}, +] +async-generator = [ + {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, + {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, - {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] +black = [ + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, +] bleach = [ - {file = "bleach-3.1.5-py2.py3-none-any.whl", hash = "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f"}, - {file = "bleach-3.1.5.tar.gz", hash = "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b"}, + {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, + {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, +] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +cfgv = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] +click = [ + {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, + {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -632,123 +1215,282 @@ commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] +coverage = [ + {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"}, + {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"}, + {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"}, + {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"}, + {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"}, + {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"}, + {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"}, + {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"}, + {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"}, + {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"}, + {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"}, + {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"}, + {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"}, + {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"}, + {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"}, + {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"}, + {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"}, + {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"}, + {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"}, + {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"}, +] dataclasses = [ {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, ] decorator = [ - {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, - {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] defusedxml = [ - {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, - {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] +distlib = [ + {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, + {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, ] entrypoints = [ - {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, - {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] +filelock = [ + {file = "filelock-3.4.1-py3-none-any.whl", hash = "sha256:a4bc51381e01502a30e9f06dd4fa19a1712eab852b6fb0f84fd7cce0793d8ca3"}, + {file = "filelock-3.4.1.tar.gz", hash = "sha256:0f12f552b42b5bf60dba233710bf71337d35494fc8bdd4fd6d9f6d082ad45e06"}, +] +identify = [ + {file = "identify-2.4.4-py2.py3-none-any.whl", hash = "sha256:aa68609c7454dbcaae60a01ff6b8df1de9b39fe6e50b1f6107ec81dcda624aa6"}, + {file = "identify-2.4.4.tar.gz", hash = "sha256:6b4b5031f69c48bf93a646b90de9b381c6b5f560df4cbe0ed3cf7650ae741e4d"}, ] importlib-metadata = [ - {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, - {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, + {file = "importlib_metadata-4.8.3-py3-none-any.whl", hash = "sha256:65a9576a5b2d58ca44d133c42a241905cc45e34d2c06fd5ba2bafa221e5d7b5e"}, + {file = "importlib_metadata-4.8.3.tar.gz", hash = "sha256:766abffff765960fcc18003801f7044eb6755ffae4521c8e8ce8e83b9c9b0668"}, +] +importlib-resources = [ + {file = "importlib_resources-5.2.3-py3-none-any.whl", hash = "sha256:ae35ed1cfe8c0d6c1a53ecd168167f01fa93b893d51a62cdf23aea044c67211b"}, + {file = "importlib_resources-5.2.3.tar.gz", hash = "sha256:203d70dda34cfbfbb42324a8d4211196e7d3e858de21a5eb68c6d1cdd99e4e98"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] ipykernel = [ - {file = "ipykernel-5.3.2-py3-none-any.whl", hash = "sha256:0a5f1fc6f63241b9710b5960d314ffe44d8a18bf6674e3f28d2542b192fa318c"}, - {file = "ipykernel-5.3.2.tar.gz", hash = "sha256:89dc4bd19c7781f6d7eef0e666c59ce57beac56bb39b511544a71397b7b31cbb"}, + {file = "ipykernel-5.5.6-py3-none-any.whl", hash = "sha256:66f824af1ef4650e1e2f6c42e1423074321440ef79ca3651a6cfd06a4e25e42f"}, + {file = "ipykernel-5.5.6.tar.gz", hash = "sha256:4ea44b90ae1f7c38987ad58ea0809562a17c2695a0499644326f334aecd369ec"}, ] ipython = [ - {file = "ipython-7.16.1-py3-none-any.whl", hash = "sha256:2dbcc8c27ca7d3cfe4fcdff7f45b27f9a8d3edfa70ff8024a71c7a8eb5f09d64"}, - {file = "ipython-7.16.1.tar.gz", hash = "sha256:9f4fcb31d3b2c533333893b9172264e4821c1ac91839500f31bd43f2c59b3ccf"}, + {file = "ipython-7.16.3-py3-none-any.whl", hash = "sha256:c0427ed8bc33ac481faf9d3acf7e84e0010cdaada945e0badd1e2e74cc075833"}, + {file = "ipython-7.16.3.tar.gz", hash = "sha256:5ac47dc9af66fc2f5530c12069390877ae372ac905edca75a92a6e363b5d7caa"}, ] ipython-genutils = [ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, ] ipywidgets = [ - {file = "ipywidgets-7.5.1-py2.py3-none-any.whl", hash = "sha256:13ffeca438e0c0f91ae583dc22f50379b9d6b28390ac7be8b757140e9a771516"}, - {file = "ipywidgets-7.5.1.tar.gz", hash = "sha256:e945f6e02854a74994c596d9db83444a1850c01648f1574adf144fbbabe05c97"}, + {file = "ipywidgets-7.7.0-py2.py3-none-any.whl", hash = "sha256:e58ff58bc94d481e91ecb6e13a5cb96a87b6b8ade135e055603d0ca24593df38"}, + {file = "ipywidgets-7.7.0.tar.gz", hash = "sha256:ab4a5596855a88b83761921c768707d65e5847068139bc1729ddfe834703542a"}, ] jedi = [ - {file = "jedi-0.17.1-py2.py3-none-any.whl", hash = "sha256:1ddb0ec78059e8e27ec9eb5098360b4ea0a3dd840bedf21415ea820c21b40a22"}, - {file = "jedi-0.17.1.tar.gz", hash = "sha256:807d5d4f96711a2bcfdd5dfa3b1ae6d09aa53832b182090b222b5efb81f52f63"}, + {file = "jedi-0.17.2-py2.py3-none-any.whl", hash = "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5"}, + {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"}, ] jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, ] jsonschema = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, + {file = "jsonschema-4.0.0-py3-none-any.whl", hash = "sha256:c773028c649441ab980015b5b622f4cd5134cf563daaf0235ca4b73cc3734f20"}, + {file = "jsonschema-4.0.0.tar.gz", hash = "sha256:bc51325b929171791c42ebc1c70b9713eb134d3bb8ebd5474c8b659b15be6d86"}, ] jupyter-client = [ - {file = "jupyter_client-6.1.5-py3-none-any.whl", hash = "sha256:9f0092a0951d878e7521924899e1fba6f689c7a99d43735a4c0bc05c6f311452"}, - {file = "jupyter_client-6.1.5.tar.gz", hash = "sha256:5099cda1ac86b27b655a715c51e15bdc8bd9595b2b17adb41a2bd446bbbafc4a"}, + {file = "jupyter_client-7.1.2-py3-none-any.whl", hash = "sha256:d56f1c57bef42ff31e61b1185d3348a5b2bcde7c9a05523ae4dbe5ee0871797c"}, + {file = "jupyter_client-7.1.2.tar.gz", hash = "sha256:4ea61033726c8e579edb55626d8ee2e6bf0a83158ddf3751b8dd46b2c5cd1e96"}, ] jupyter-core = [ - {file = "jupyter_core-4.6.3-py2.py3-none-any.whl", hash = "sha256:a4ee613c060fe5697d913416fc9d553599c05e4492d58fac1192c9a6844abb21"}, - {file = "jupyter_core-4.6.3.tar.gz", hash = "sha256:394fd5dd787e7c8861741880bdf8a00ce39f95de5d18e579c74b882522219e7e"}, + {file = "jupyter_core-4.9.2-py3-none-any.whl", hash = "sha256:f875e4d27e202590311d468fa55f90c575f201490bd0c18acabe4e318db4a46d"}, + {file = "jupyter_core-4.9.2.tar.gz", hash = "sha256:d69baeb9ffb128b8cd2657fcf2703f89c769d1673c851812119e3a2a0e93ad9a"}, +] +jupyterlab-pygments = [ + {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, + {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, +] +jupyterlab-widgets = [ + {file = "jupyterlab_widgets-1.1.0-py3-none-any.whl", hash = "sha256:c2a9bd3789f120f64d73268c066ed3b000c56bc1dda217be5cdc43e7b4ebad3f"}, + {file = "jupyterlab_widgets-1.1.0.tar.gz", hash = "sha256:d5f41bc1713795385f718d44dcba47e1e1473c6289f28a95aa6b2c0782ee372a"}, ] markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] mistune = [ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] +mypy = [ + {file = "mypy-0.950-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b"}, + {file = "mypy-0.950-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0"}, + {file = "mypy-0.950-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22"}, + {file = "mypy-0.950-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb"}, + {file = "mypy-0.950-cp310-cp310-win_amd64.whl", hash = "sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334"}, + {file = "mypy-0.950-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f"}, + {file = "mypy-0.950-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc"}, + {file = "mypy-0.950-cp36-cp36m-win_amd64.whl", hash = "sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2"}, + {file = "mypy-0.950-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed"}, + {file = "mypy-0.950-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075"}, + {file = "mypy-0.950-cp37-cp37m-win_amd64.whl", hash = "sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b"}, + {file = "mypy-0.950-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d"}, + {file = "mypy-0.950-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a"}, + {file = "mypy-0.950-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605"}, + {file = "mypy-0.950-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2"}, + {file = "mypy-0.950-cp38-cp38-win_amd64.whl", hash = "sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff"}, + {file = "mypy-0.950-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8"}, + {file = "mypy-0.950-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038"}, + {file = "mypy-0.950-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2"}, + {file = "mypy-0.950-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519"}, + {file = "mypy-0.950-cp39-cp39-win_amd64.whl", hash = "sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef"}, + {file = "mypy-0.950-py3-none-any.whl", hash = "sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb"}, + {file = "mypy-0.950.tar.gz", hash = "sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbclient = [ + {file = "nbclient-0.5.9-py3-none-any.whl", hash = "sha256:8a307be4129cce5f70eb83a57c3edbe45656623c31de54e38bb6fdfbadc428b3"}, + {file = "nbclient-0.5.9.tar.gz", hash = "sha256:99e46ddafacd0b861293bf246fed8540a184adfa3aa7d641f89031ec070701e0"}, +] nbconvert = [ - {file = "nbconvert-5.6.1-py2.py3-none-any.whl", hash = "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee"}, - {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, + {file = "nbconvert-6.0.7-py3-none-any.whl", hash = "sha256:39e9f977920b203baea0be67eea59f7b37a761caa542abe80f5897ce3cf6311d"}, + {file = "nbconvert-6.0.7.tar.gz", hash = "sha256:cbbc13a86dfbd4d1b5dee106539de0795b4db156c894c2c5dc382062bbc29002"}, ] nbformat = [ - {file = "nbformat-5.0.7-py3-none-any.whl", hash = "sha256:ea55c9b817855e2dfcd3f66d74857342612a60b1f09653440f4a5845e6e3523f"}, - {file = "nbformat-5.0.7.tar.gz", hash = "sha256:54d4d6354835a936bad7e8182dcd003ca3dc0cedfee5a306090e04854343b340"}, + {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, + {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"}, +] +nest-asyncio = [ + {file = "nest_asyncio-1.5.5-py3-none-any.whl", hash = "sha256:b98e3ec1b246135e4642eceffa5a6c23a3ab12c82ff816a92c612d68205813b2"}, + {file = "nest_asyncio-1.5.5.tar.gz", hash = "sha256:e442291cd942698be619823a17a86a5759eabe1f8613084790de189fe9e16d65"}, +] +nodeenv = [ + {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, + {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, ] notebook = [ - {file = "notebook-6.0.3-py3-none-any.whl", hash = "sha256:3edc616c684214292994a3af05eaea4cc043f6b4247d830f3a2f209fa7639a80"}, - {file = "notebook-6.0.3.tar.gz", hash = "sha256:47a9092975c9e7965ada00b9a20f0cf637d001db60d241d479f53c0be117ad48"}, + {file = "notebook-6.4.10-py3-none-any.whl", hash = "sha256:49cead814bff0945fcb2ee07579259418672ac175d3dc3d8102a4b0a656ed4df"}, + {file = "notebook-6.4.10.tar.gz", hash = "sha256:2408a76bc6289283a8eecfca67e298ec83c67db51a4c2e1b713dd180bb39e90e"}, ] packaging = [ - {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, - {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pandocfilters = [ - {file = "pandocfilters-1.4.2.tar.gz", hash = "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9"}, + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, ] parso = [ - {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, - {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, + {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"}, + {file = "parso-0.7.1.tar.gz", hash = "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pexpect = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, @@ -758,124 +1500,296 @@ pickleshare = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] +platformdirs = [ + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +pre-commit = [ + {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, + {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, +] prometheus-client = [ - {file = "prometheus_client-0.8.0-py2.py3-none-any.whl", hash = "sha256:983c7ac4b47478720db338f1491ef67a100b474e3bc7dafcbaefb7d0b8f9b01c"}, - {file = "prometheus_client-0.8.0.tar.gz", hash = "sha256:c6e6b706833a6bd1fd51711299edee907857be10ece535126a158f911ee80915"}, + {file = "prometheus_client-0.14.1-py3-none-any.whl", hash = "sha256:522fded625282822a89e2773452f42df14b5a8e84a86433e3f8a189c1d54dc01"}, + {file = "prometheus_client-0.14.1.tar.gz", hash = "sha256:5459c427624961076277fdc6dc50540e2bacb98eebde99886e59ec55ed92093a"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.3-py3-none-any.whl", hash = "sha256:c93e53af97f630f12f5f62a3274e79527936ed466f038953dfa379d4941f651a"}, - {file = "prompt_toolkit-3.0.3.tar.gz", hash = "sha256:a402e9bf468b63314e37460b68ba68243d55b2f8c4d0192f85a019af3945050e"}, + {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, + {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, ] ptyprocess = [ - {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, - {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pygments = [ - {file = "Pygments-2.7.2-py3-none-any.whl", hash = "sha256:88a0bbcd659fcb9573703957c6b9cff9fab7295e6e76db54c9d00ae42df32773"}, - {file = "Pygments-2.7.2.tar.gz", hash = "sha256:381985fcc551eb9d37c52088a32914e00517e57f4a21609f48141ba08e193fa0"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, + {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, + {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pyrsistent = [ - {file = "pyrsistent-0.16.0.tar.gz", hash = "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, + {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, + {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, +] +pytest = [ + {file = "pytest-7.0.1-py3-none-any.whl", hash = "sha256:9ce3ff477af913ecf6321fe337b93a2c0dcf2a0a1439c43f5452112c1e4280db"}, + {file = "pytest-7.0.1.tar.gz", hash = "sha256:e30905a0c131d3d94b89624a1cc5afec3e0ba2fbdb151867d8e0ebd49850f171"}, +] +pytest-cov = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] pywin32 = [ - {file = "pywin32-228-cp27-cp27m-win32.whl", hash = "sha256:37dc9935f6a383cc744315ae0c2882ba1768d9b06700a70f35dc1ce73cd4ba9c"}, - {file = "pywin32-228-cp27-cp27m-win_amd64.whl", hash = "sha256:11cb6610efc2f078c9e6d8f5d0f957620c333f4b23466931a247fb945ed35e89"}, - {file = "pywin32-228-cp35-cp35m-win32.whl", hash = "sha256:1f45db18af5d36195447b2cffacd182fe2d296849ba0aecdab24d3852fbf3f80"}, - {file = "pywin32-228-cp35-cp35m-win_amd64.whl", hash = "sha256:6e38c44097a834a4707c1b63efa9c2435f5a42afabff634a17f563bc478dfcc8"}, - {file = "pywin32-228-cp36-cp36m-win32.whl", hash = "sha256:ec16d44b49b5f34e99eb97cf270806fdc560dff6f84d281eb2fcb89a014a56a9"}, - {file = "pywin32-228-cp36-cp36m-win_amd64.whl", hash = "sha256:a60d795c6590a5b6baeacd16c583d91cce8038f959bd80c53bd9a68f40130f2d"}, - {file = "pywin32-228-cp37-cp37m-win32.whl", hash = "sha256:af40887b6fc200eafe4d7742c48417529a8702dcc1a60bf89eee152d1d11209f"}, - {file = "pywin32-228-cp37-cp37m-win_amd64.whl", hash = "sha256:00eaf43dbd05ba6a9b0080c77e161e0b7a601f9a3f660727a952e40140537de7"}, - {file = "pywin32-228-cp38-cp38-win32.whl", hash = "sha256:fa6ba028909cfc64ce9e24bcf22f588b14871980d9787f1e2002c99af8f1850c"}, - {file = "pywin32-228-cp38-cp38-win_amd64.whl", hash = "sha256:9b3466083f8271e1a5eb0329f4e0d61925d46b40b195a33413e0905dccb285e8"}, - {file = "pywin32-228-cp39-cp39-win32.whl", hash = "sha256:ed74b72d8059a6606f64842e7917aeee99159ebd6b8d6261c518d002837be298"}, - {file = "pywin32-228-cp39-cp39-win_amd64.whl", hash = "sha256:8319bafdcd90b7202c50d6014efdfe4fde9311b3ff15fd6f893a45c0868de203"}, + {file = "pywin32-304-cp310-cp310-win32.whl", hash = "sha256:3c7bacf5e24298c86314f03fa20e16558a4e4138fc34615d7de4070c23e65af3"}, + {file = "pywin32-304-cp310-cp310-win_amd64.whl", hash = "sha256:4f32145913a2447736dad62495199a8e280a77a0ca662daa2332acf849f0be48"}, + {file = "pywin32-304-cp310-cp310-win_arm64.whl", hash = "sha256:d3ee45adff48e0551d1aa60d2ec066fec006083b791f5c3527c40cd8aefac71f"}, + {file = "pywin32-304-cp311-cp311-win32.whl", hash = "sha256:30c53d6ce44c12a316a06c153ea74152d3b1342610f1b99d40ba2795e5af0269"}, + {file = "pywin32-304-cp311-cp311-win_amd64.whl", hash = "sha256:7ffa0c0fa4ae4077e8b8aa73800540ef8c24530057768c3ac57c609f99a14fd4"}, + {file = "pywin32-304-cp311-cp311-win_arm64.whl", hash = "sha256:cbbe34dad39bdbaa2889a424d28752f1b4971939b14b1bb48cbf0182a3bcfc43"}, + {file = "pywin32-304-cp36-cp36m-win32.whl", hash = "sha256:be253e7b14bc601718f014d2832e4c18a5b023cbe72db826da63df76b77507a1"}, + {file = "pywin32-304-cp36-cp36m-win_amd64.whl", hash = "sha256:de9827c23321dcf43d2f288f09f3b6d772fee11e809015bdae9e69fe13213988"}, + {file = "pywin32-304-cp37-cp37m-win32.whl", hash = "sha256:f64c0377cf01b61bd5e76c25e1480ca8ab3b73f0c4add50538d332afdf8f69c5"}, + {file = "pywin32-304-cp37-cp37m-win_amd64.whl", hash = "sha256:bb2ea2aa81e96eee6a6b79d87e1d1648d3f8b87f9a64499e0b92b30d141e76df"}, + {file = "pywin32-304-cp38-cp38-win32.whl", hash = "sha256:94037b5259701988954931333aafd39cf897e990852115656b014ce72e052e96"}, + {file = "pywin32-304-cp38-cp38-win_amd64.whl", hash = "sha256:ead865a2e179b30fb717831f73cf4373401fc62fbc3455a0889a7ddac848f83e"}, + {file = "pywin32-304-cp39-cp39-win32.whl", hash = "sha256:25746d841201fd9f96b648a248f731c1dec851c9a08b8e33da8b56148e4c65cc"}, + {file = "pywin32-304-cp39-cp39-win_amd64.whl", hash = "sha256:d24a3382f013b21aa24a5cfbfad5a2cd9926610c0affde3e8ab5b3d7dbcf4ac9"}, ] pywinpty = [ - {file = "pywinpty-0.5.7-cp27-cp27m-win32.whl", hash = "sha256:b358cb552c0f6baf790de375fab96524a0498c9df83489b8c23f7f08795e966b"}, - {file = "pywinpty-0.5.7-cp27-cp27m-win_amd64.whl", hash = "sha256:1e525a4de05e72016a7af27836d512db67d06a015aeaf2fa0180f8e6a039b3c2"}, - {file = "pywinpty-0.5.7-cp35-cp35m-win32.whl", hash = "sha256:2740eeeb59297593a0d3f762269b01d0285c1b829d6827445fcd348fb47f7e70"}, - {file = "pywinpty-0.5.7-cp35-cp35m-win_amd64.whl", hash = "sha256:33df97f79843b2b8b8bc5c7aaf54adec08cc1bae94ee99dfb1a93c7a67704d95"}, - {file = "pywinpty-0.5.7-cp36-cp36m-win32.whl", hash = "sha256:e854211df55d107f0edfda8a80b39dfc87015bef52a8fe6594eb379240d81df2"}, - {file = "pywinpty-0.5.7-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd838de92de1d4ebf0dce9d4d5e4fc38d0b7b1de837947a18b57a882f219139"}, - {file = "pywinpty-0.5.7-cp37-cp37m-win32.whl", hash = "sha256:5fb2c6c6819491b216f78acc2c521b9df21e0f53b9a399d58a5c151a3c4e2a2d"}, - {file = "pywinpty-0.5.7-cp37-cp37m-win_amd64.whl", hash = "sha256:dd22c8efacf600730abe4a46c1388355ce0d4ab75dc79b15d23a7bd87bf05b48"}, - {file = "pywinpty-0.5.7-cp38-cp38-win_amd64.whl", hash = "sha256:8fc5019ff3efb4f13708bd3b5ad327589c1a554cb516d792527361525a7cb78c"}, - {file = "pywinpty-0.5.7.tar.gz", hash = "sha256:2d7e9c881638a72ffdca3f5417dd1563b60f603e1b43e5895674c2a1b01f95a0"}, + {file = "pywinpty-2.0.3-cp310-none-win_amd64.whl", hash = "sha256:7a330ef7a2ce284370b1a1fdd2a80c523585464fa5e5ab934c9f27220fa7feab"}, + {file = "pywinpty-2.0.3-cp37-none-win_amd64.whl", hash = "sha256:6455f1075f978942d318f95616661c605d5e0f991c5b176c0c852d237aafefc0"}, + {file = "pywinpty-2.0.3-cp38-none-win_amd64.whl", hash = "sha256:2e7a288a8121393c526d4e6ec7d65edef75d68c7787ab9560e438df867b75a5d"}, + {file = "pywinpty-2.0.3-cp39-none-win_amd64.whl", hash = "sha256:def51627e6aa659f33ea7a0ea4c6b68365c83af4aad7940600f844746817a0ed"}, + {file = "pywinpty-2.0.3.tar.gz", hash = "sha256:6b29a826e896105370c38d53904c3aaac6c36146a50448fc0ed5082cf9d092bc"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] pyzmq = [ - {file = "pyzmq-19.0.1-cp27-cp27m-macosx_10_9_intel.whl", hash = "sha256:58688a2dfa044fad608a8e70ba8d019d0b872ec2acd75b7b5e37da8905605891"}, - {file = "pyzmq-19.0.1-cp27-cp27m-win32.whl", hash = "sha256:87c78f6936e2654397ca2979c1d323ee4a889eef536cc77a938c6b5be33351a7"}, - {file = "pyzmq-19.0.1-cp27-cp27m-win_amd64.whl", hash = "sha256:97b6255ae77328d0e80593681826a0479cb7bac0ba8251b4dd882f5145a2293a"}, - {file = "pyzmq-19.0.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:15b4cb21118f4589c4db8be4ac12b21c8b4d0d42b3ee435d47f686c32fe2e91f"}, - {file = "pyzmq-19.0.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:931339ac2000d12fe212e64f98ce291e81a7ec6c73b125f17cf08415b753c087"}, - {file = "pyzmq-19.0.1-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:2a88b8fabd9cc35bd59194a7723f3122166811ece8b74018147a4ed8489e6421"}, - {file = "pyzmq-19.0.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:bafd651b557dd81d89bd5f9c678872f3e7b7255c1c751b78d520df2caac80230"}, - {file = "pyzmq-19.0.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8952f6ba6ae598e792703f3134af5a01af8f5c7cf07e9a148f05a12b02412cea"}, - {file = "pyzmq-19.0.1-cp35-cp35m-win32.whl", hash = "sha256:54aa24fd60c4262286fc64ca632f9e747c7cc3a3a1144827490e1dc9b8a3a960"}, - {file = "pyzmq-19.0.1-cp35-cp35m-win_amd64.whl", hash = "sha256:dcbc3f30c11c60d709c30a213dc56e88ac016fe76ac6768e64717bd976072566"}, - {file = "pyzmq-19.0.1-cp36-cp36m-macosx_10_9_intel.whl", hash = "sha256:6ca519309703e95d55965735a667809bbb65f52beda2fdb6312385d3e7a6d234"}, - {file = "pyzmq-19.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4ee0bfd82077a3ff11c985369529b12853a4064320523f8e5079b630f9551448"}, - {file = "pyzmq-19.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ba6f24431b569aec674ede49cad197cad59571c12deed6ad8e3c596da8288217"}, - {file = "pyzmq-19.0.1-cp36-cp36m-win32.whl", hash = "sha256:956775444d01331c7eb412c5fb9bb62130dfaac77e09f32764ea1865234e2ca9"}, - {file = "pyzmq-19.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08780e3a55215873b3b8e6e7ca8987f14c902a24b6ac081b344fd430d6ca7cd"}, - {file = "pyzmq-19.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21f7d91f3536f480cb2c10d0756bfa717927090b7fb863e6323f766e5461ee1c"}, - {file = "pyzmq-19.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:bfff5ffff051f5aa47ba3b379d87bd051c3196b0c8a603e8b7ed68a6b4f217ec"}, - {file = "pyzmq-19.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:07fb8fe6826a229dada876956590135871de60dbc7de5a18c3bcce2ed1f03c98"}, - {file = "pyzmq-19.0.1-cp37-cp37m-win32.whl", hash = "sha256:342fb8a1dddc569bc361387782e8088071593e7eaf3e3ecf7d6bd4976edff112"}, - {file = "pyzmq-19.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:faee2604f279d31312bc455f3d024f160b6168b9c1dde22bf62d8c88a4deca8e"}, - {file = "pyzmq-19.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b9d21fc56c8aacd2e6d14738021a9d64f3f69b30578a99325a728e38a349f85"}, - {file = "pyzmq-19.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af0c02cf49f4f9eedf38edb4f3b6bb621d83026e7e5d76eb5526cc5333782fd6"}, - {file = "pyzmq-19.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5f1f2eb22aab606f808163eb1d537ac9a0ba4283fbeb7a62eb48d9103cf015c2"}, - {file = "pyzmq-19.0.1-cp38-cp38-win32.whl", hash = "sha256:f9d7e742fb0196992477415bb34366c12e9bb9a0699b8b3f221ff93b213d7bec"}, - {file = "pyzmq-19.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:5b99c2ae8089ef50223c28bac57510c163bfdff158c9e90764f812b94e69a0e6"}, - {file = "pyzmq-19.0.1-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:cf5d689ba9513b9753959164cf500079383bc18859f58bf8ce06d8d4bef2b054"}, - {file = "pyzmq-19.0.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:aaa8b40b676576fd7806839a5de8e6d5d1b74981e6376d862af6c117af2a3c10"}, - {file = "pyzmq-19.0.1.tar.gz", hash = "sha256:13a5638ab24d628a6ade8f794195e1a1acd573496c3b85af2f1183603b7bf5e0"}, + {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, + {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"}, + {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"}, + {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"}, + {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"}, + {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f907c7359ce8bf7f7e63c82f75ad0223384105f5126f313400b7e8004d9b33c3"}, + {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:902319cfe23366595d3fa769b5b751e6ee6750a0a64c5d9f757d624b2ac3519e"}, + {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"}, + {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"}, + {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"}, + {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"}, + {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"}, + {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"}, + {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:62bcade20813796c426409a3e7423862d50ff0639f5a2a95be4b85b09a618666"}, + {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ea5a79e808baef98c48c884effce05c31a0698c1057de8fc1c688891043c1ce1"}, + {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"}, + {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"}, + {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"}, + {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"}, + {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"}, + {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"}, + {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08c4e315a76ef26eb833511ebf3fa87d182152adf43dedee8d79f998a2162a0b"}, + {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:badb868fff14cfd0e200eaa845887b1011146a7d26d579aaa7f966c203736b92"}, + {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"}, + {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"}, + {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"}, + {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"}, + {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"}, + {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"}, + {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:468bd59a588e276961a918a3060948ae68f6ff5a7fa10bb2f9160c18fe341067"}, + {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c88fa7410e9fc471e0858638f403739ee869924dd8e4ae26748496466e27ac59"}, + {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"}, + {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"}, + {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"}, + {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"}, + {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"}, + {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"}, + {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"}, + {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:53f4fd13976789ffafedd4d46f954c7bb01146121812b72b4ddca286034df966"}, + {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1b5d457acbadcf8b27561deeaa386b0217f47626b29672fa7bd31deb6e91e1b"}, + {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"}, + {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"}, + {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, ] send2trash = [ - {file = "Send2Trash-1.5.0-py3-none-any.whl", hash = "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"}, - {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"}, + {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, + {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, ] six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] terminado = [ - {file = "terminado-0.8.3-py2.py3-none-any.whl", hash = "sha256:a43dcb3e353bc680dd0783b1d9c3fc28d529f190bc54ba9a229f72fe6e7a54d7"}, - {file = "terminado-0.8.3.tar.gz", hash = "sha256:4804a774f802306a7d9af7322193c5390f1da0abb429e082a10ef1d46e6fb2c2"}, + {file = "terminado-0.13.0-py3-none-any.whl", hash = "sha256:50a18654ad0cff153fdeb58711c9a7b25e0e2b74fb721dbaddd9e80d5612fac6"}, + {file = "terminado-0.13.0.tar.gz", hash = "sha256:713531ccb5db7d4f544651f14050da79809030f00d1afa21462088cf32fb143a"}, ] testpath = [ - {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, - {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, + {file = "testpath-0.6.0-py3-none-any.whl", hash = "sha256:8ada9f80a2ac6fb0391aa7cdb1a7d11cfa8429f693eda83f74dde570fe6fa639"}, + {file = "testpath-0.6.0.tar.gz", hash = "sha256:2f1b97e6442c02681ebe01bd84f531028a7caea1af3825000f52345c30285e0f"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, + {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, ] tornado = [ - {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, - {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, - {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, - {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, - {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, - {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, - {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, - {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, - {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, + {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, + {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, + {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, + {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, + {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, + {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, + {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, + {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, + {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, + {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, + {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, + {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, + {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, + {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, + {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, + {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, + {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, + {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] traitlets = [ {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, ] +typed-ast = [ + {file = "typed_ast-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ad3b48cf2b487be140072fb86feff36801487d4abb7382bb1929aaac80638ea"}, + {file = "typed_ast-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:542cd732351ba8235f20faa0fc7398946fe1a57f2cdb289e5497e1e7f48cfedb"}, + {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc2c11ae59003d4a26dda637222d9ae924387f96acae9492df663843aefad55"}, + {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd5df1313915dbd70eaaa88c19030b441742e8b05e6103c631c83b75e0435ccc"}, + {file = "typed_ast-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:e34f9b9e61333ecb0f7d79c21c28aa5cd63bec15cb7e1310d7d3da6ce886bc9b"}, + {file = "typed_ast-1.5.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f818c5b81966d4728fec14caa338e30a70dfc3da577984d38f97816c4b3071ec"}, + {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3042bfc9ca118712c9809201f55355479cfcdc17449f9f8db5e744e9625c6805"}, + {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fff9fdcce59dc61ec1b317bdb319f8f4e6b69ebbe61193ae0a60c5f9333dc49"}, + {file = "typed_ast-1.5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8e0b8528838ffd426fea8d18bde4c73bcb4167218998cc8b9ee0a0f2bfe678a6"}, + {file = "typed_ast-1.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ef1d96ad05a291f5c36895d86d1375c0ee70595b90f6bb5f5fdbee749b146db"}, + {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed44e81517364cb5ba367e4f68fca01fba42a7a4690d40c07886586ac267d9b9"}, + {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f60d9de0d087454c91b3999a296d0c4558c1666771e3460621875021bf899af9"}, + {file = "typed_ast-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9e237e74fd321a55c90eee9bc5d44be976979ad38a29bbd734148295c1ce7617"}, + {file = "typed_ast-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee852185964744987609b40aee1d2eb81502ae63ee8eef614558f96a56c1902d"}, + {file = "typed_ast-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27e46cdd01d6c3a0dd8f728b6a938a6751f7bd324817501c15fb056307f918c6"}, + {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d64dabc6336ddc10373922a146fa2256043b3b43e61f28961caec2a5207c56d5"}, + {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8cdf91b0c466a6c43f36c1964772918a2c04cfa83df8001ff32a89e357f8eb06"}, + {file = "typed_ast-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:9cc9e1457e1feb06b075c8ef8aeb046a28ec351b1958b42c7c31c989c841403a"}, + {file = "typed_ast-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e20d196815eeffb3d76b75223e8ffed124e65ee62097e4e73afb5fec6b993e7a"}, + {file = "typed_ast-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37e5349d1d5de2f4763d534ccb26809d1c24b180a477659a12c4bde9dd677d74"}, + {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f1a27592fac87daa4e3f16538713d705599b0a27dfe25518b80b6b017f0a6d"}, + {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8831479695eadc8b5ffed06fdfb3e424adc37962a75925668deeb503f446c0a3"}, + {file = "typed_ast-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:20d5118e494478ef2d3a2702d964dae830aedd7b4d3b626d003eea526be18718"}, + {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"}, +] +types-dataclasses = [ + {file = "types-dataclasses-0.6.5.tar.gz", hash = "sha256:c3226d0a93289f53aac7b55ced17fb18473e278247abdb8d85a8956f5fb4faa6"}, + {file = "types_dataclasses-0.6.5-py3-none-any.whl", hash = "sha256:2d6347ff290a17e802400ddc747c2e2c05f3d64dc4c29de9818dc497b808180a"}, +] typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, + {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, + {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, +] +virtualenv = [ + {file = "virtualenv-20.14.1-py2.py3-none-any.whl", hash = "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a"}, + {file = "virtualenv-20.14.1.tar.gz", hash = "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -886,10 +1800,10 @@ webencodings = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] widgetsnbextension = [ - {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"}, - {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"}, + {file = "widgetsnbextension-3.6.0-py2.py3-none-any.whl", hash = "sha256:4fd321cad39fdcf8a8e248a657202d42917ada8e8ed5dd3f60f073e0d54ceabd"}, + {file = "widgetsnbextension-3.6.0.tar.gz", hash = "sha256:e84a7a9fcb9baf3d57106e184a7389a8f8eb935bf741a5eb9d60aa18cc029a80"}, ] zipp = [ - {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, - {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, ] diff --git a/pyproject.toml b/pyproject.toml index b223a9e63c..71f4e9ac69 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,14 +2,15 @@ name = "rich" homepage = "https://github.com/willmcgugan/rich" documentation = "https://rich.readthedocs.io/en/latest/" -version = "9.3.0" +version = "12.4.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" authors = ["Will McGugan "] license = "MIT" readme = "README.md" classifiers = [ - "Development Status :: 5 - Production/Stable", - "Environment :: Console", + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Framework :: IPython", "Intended Audience :: Developers", "Operating System :: Microsoft :: Windows", "Operating System :: MacOS", @@ -18,25 +19,45 @@ classifiers = [ "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Typing :: Typed", ] include = ["rich/py.typed"] [tool.poetry.dependencies] -python = "^3.6" -typing-extensions = "^3.7.4" -dataclasses = {version=">=0.7,<0.9", python = "~3.6"} +python = "^3.6.3" +typing-extensions = { version = ">=4.0.0, <5.0", python = "<3.9" } +dataclasses = { version = ">=0.7,<0.9", python = "<3.7" } pygments = "^2.6.0" commonmark = "^0.9.0" -colorama = "^0.4.0" -ipywidgets = {version = "^7.5.1", optional = true} +ipywidgets = { version = "^7.5.1", optional = true } [tool.poetry.extras] jupyter = ["ipywidgets"] [tool.poetry.dev-dependencies] +pytest = "^7.0.0" +black = "^22.3" +mypy = "^0.950" +pytest-cov = "^3.0.0" +attrs = "^21.4.0" +types-dataclasses = "^0.6.4" +pre-commit = "^2.17.0" +asv = "^0.5.1" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" + + +[tool.mypy] +files = ["rich"] +show_error_codes = true +strict = true +enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] + +[[tool.mypy.overrides]] +module = ["pygments.*", "IPython.*", "commonmark.*", "ipywidgets.*"] +ignore_missing_imports = true diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 9f21ab6859..0000000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,5 +0,0 @@ -black==20.8b1 -mypy==0.790 -poetry==1.1.4 -pytest==6.1.2 -pytest-cov==2.10.1 diff --git a/rich/__init__.py b/rich/__init__.py index dbb9da61fe..07bc1a1920 100644 --- a/rich/__init__.py +++ b/rich/__init__.py @@ -1,6 +1,11 @@ """Rich text and beautiful formatting in the terminal.""" -from typing import Any, IO, Optional, TYPE_CHECKING +import os +from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union + +from ._extension import load_ipython_extension # noqa: F401 + +__all__ = ["get_console", "reconfigure", "print", "inspect"] if TYPE_CHECKING: from .console import Console @@ -8,6 +13,12 @@ # Global console used by alternative print _console: Optional["Console"] = None +try: + _IMPORT_CWD = os.path.abspath(os.getcwd()) +except FileNotFoundError: + # Can happen if the cwd has been deleted + _IMPORT_CWD = "" + def get_console() -> "Console": """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, @@ -25,7 +36,26 @@ def get_console() -> "Console": return _console -def print(*objects: Any, sep=" ", end="\n", file: IO[str] = None, flush: bool = False): +def reconfigure(*args: Any, **kwargs: Any) -> None: + """Reconfigures the global console by replacing it with another. + + Args: + console (Console): Replacement console instance. + """ + from rich.console import Console + + new_console = Console(*args, **kwargs) + _console = get_console() + _console.__dict__ = new_console.__dict__ + + +def print( + *objects: Any, + sep: str = " ", + end: str = "\n", + file: Optional[IO[str]] = None, + flush: bool = False, +) -> None: r"""Print object(s) supplied via positional arguments. This function has an identical signature to the built-in print. For more advanced features, see the :class:`~rich.console.Console` class. @@ -43,11 +73,54 @@ def print(*objects: Any, sep=" ", end="\n", file: IO[str] = None, flush: bool = return write_console.print(*objects, sep=sep, end=end) +def print_json( + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = True, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, +) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (str): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (int, optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + + get_console().print_json( + json, + data=data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + + def inspect( obj: Any, *, - console: "Console" = None, - title: str = None, + console: Optional["Console"] = None, + title: Optional[str] = None, help: bool = False, methods: bool = False, docs: bool = True, @@ -55,9 +128,17 @@ def inspect( dunder: bool = False, sort: bool = True, all: bool = False, -): + value: bool = True, +) -> None: """Inspect any Python object. + * inspect() to see summarized info. + * inspect(, methods=True) to see methods. + * inspect(, help=True) to see full (non-abbreviated) help. + * inspect(, private=True) to see private attributes (single underscore). + * inspect(, dunder=True) to see attributes beginning with double underscore. + * inspect(, all=True) to see all attributes. + Args: obj (Any): An object to inspect. title (str, optional): Title to display over inspect result, or None use type. Defaults to None. @@ -68,20 +149,25 @@ def inspect( dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. sort (bool, optional): Sort attributes alphabetically. Defaults to True. all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value. Defaults to True. """ _console = console or get_console() from rich._inspect import Inspect + # Special case for inspect(inspect) + is_inspect = obj is inspect + _inspect = Inspect( obj, title=title, - help=help, - methods=methods, - docs=docs, + help=is_inspect or help, + methods=is_inspect or methods, + docs=is_inspect or docs, private=private, dunder=dunder, sort=sort, all=all, + value=value, ) _console.print(_inspect) diff --git a/rich/__main__.py b/rich/__main__.py index 5688477fcd..eb293a0ba3 100644 --- a/rich/__main__.py +++ b/rich/__main__.py @@ -2,20 +2,17 @@ import io from time import process_time +from rich import box from rich.color import Color -from rich.columns import Columns -from rich.console import Console, ConsoleOptions, RenderGroup, RenderResult +from rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult from rich.markdown import Markdown from rich.measure import Measurement -from rich.padding import Padding -from rich.panel import Panel from rich.pretty import Pretty from rich.segment import Segment from rich.style import Style -from rich.table import Table from rich.syntax import Syntax +from rich.table import Table from rich.text import Text -from rich import box class ColorBox: @@ -26,14 +23,17 @@ def __rich_console__( for x in range(options.max_width): h = x / options.max_width l = 0.1 + ((y / 5) * 0.7) - r, g, b = colorsys.hls_to_rgb(h, l, 1.0) - yield Segment( - "█", Style(color=Color.from_rgb(r * 255, g * 255, b * 255)) - ) + r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) + r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) + bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) + color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) + yield Segment("▄", Style(color=color, bgcolor=bgcolor)) yield Segment.line() - def __rich_measure__(self, console: "Console", max_width: int) -> Measurement: - return Measurement(1, max_width) + def __rich_measure__( + self, console: "Console", options: ConsoleOptions + ) -> Measurement: + return Measurement(1, options.max_width) def make_test_card() -> Table: @@ -51,7 +51,6 @@ def make_test_card() -> Table: pad_edge=False, ) color_table.add_row( - # "[bold yellow]256[/] colors or [bold green]16.7 million[/] colors [blue](if supported by your terminal)[/].", ( "✓ [bold green]4-bit color[/]\n" "✓ [bold blue]8-bit color[/]\n" @@ -80,7 +79,7 @@ def make_test_card() -> Table: ) table.add_row( "Text", - RenderGroup( + Group( Text.from_markup( """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" ), @@ -88,7 +87,7 @@ def make_test_card() -> Table: ), ) - def comparison(renderable1, renderable2) -> Table: + def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: table = Table(show_header=False, pad_edge=False, box=None, expand=True) table.add_column("1", ratio=1) table.add_column("2", ratio=1) @@ -96,15 +95,15 @@ def comparison(renderable1, renderable2) -> Table: return table table.add_row( - "Asian languages", + "Asian\nlanguage\nsupport", ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다", ) markup_example = ( - "[bold magenta]Rich[/] supports a simple [i]bbcode[/i] like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " + "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " ) - table.add_row("Console markup", markup_example) + table.add_row("Markup", markup_example) example_table = Table( show_edge=False, @@ -171,9 +170,9 @@ def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: "foo": [ 3.1427, ( - "Paul Atriedies", + "Paul Atreides", "Vladimir Harkonnen", - "Thufir Haway", + "Thufir Hawat", ), ], "atomic": (False, True, None), @@ -189,7 +188,7 @@ def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: markdown_example = """\ # Markdown -Supports much of the *markdown*, __syntax__! +Supports much of the *markdown* __syntax__! - Headers - Basic formatting: **bold**, *italic*, `code` @@ -201,27 +200,83 @@ def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: ) table.add_row( - "And more", + "+more!", """Progress bars, columns, styled logging handler, tracebacks, etc...""", ) return table if __name__ == "__main__": # pragma: no cover - console = Console(file=io.StringIO(), force_terminal=True) + + console = Console( + file=io.StringIO(), + force_terminal=True, + ) test_card = make_test_card() # Print once to warm cache + start = process_time() console.print(test_card) + pre_cache_taken = round((process_time() - start) * 1000.0, 1) + console.file = io.StringIO() start = process_time() console.print(test_card) taken = round((process_time() - start) * 1000.0, 1) - text = console.file.getvalue() - # https://bugs.python.org/issue37871 - for line in text.splitlines(): - print(line) + c = Console(record=True) + c.print(test_card) + # c.save_svg( + # path="/Users/darrenburns/Library/Application Support/JetBrains/PyCharm2021.3/scratches/svg_export.svg", + # title="Rich can export to SVG", + # ) + + print(f"rendered in {pre_cache_taken}ms (cold cache)") + print(f"rendered in {taken}ms (warm cache)") + + from rich.panel import Panel + + console = Console() + + sponsor_message = Table.grid(padding=1) + sponsor_message.add_column(style="green", justify="right") + sponsor_message.add_column(no_wrap=True) - print(f"rendered in {taken}ms") + sponsor_message.add_row( + "Textualize", + "[u blue link=https://github.com/textualize]https://github.com/textualize", + ) + sponsor_message.add_row( + "Buy devs a :coffee:", + "[u blue link=https://ko-fi.com/textualize]https://ko-fi.com/textualize", + ) + sponsor_message.add_row( + "Twitter", + "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", + ) + + intro_message = Text.from_markup( + """\ +We hope you enjoy using Rich! + +Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/] + +- Will McGugan""" + ) + + message = Table.grid(padding=2) + message.add_column() + message.add_column(no_wrap=True) + message.add_row(intro_message, sponsor_message) + + console.print( + Panel.fit( + message, + box=box.ROUNDED, + padding=(1, 2), + title="[b red]Thanks for trying out Rich!", + border_style="bright_blue", + ), + justify="center", + ) diff --git a/rich/_emoji_replace.py b/rich/_emoji_replace.py index ee8cde009b..bb2cafa180 100644 --- a/rich/_emoji_replace.py +++ b/rich/_emoji_replace.py @@ -1,17 +1,32 @@ -from typing import Match - +from typing import Callable, Match, Optional import re from ._emoji_codes import EMOJI -def _emoji_replace(text: str, _emoji_sub=re.compile(r"(:(\S*?):)").sub) -> str: +_ReStringMatch = Match[str] # regex match object +_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub +_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re + + +def _emoji_replace( + text: str, + default_variant: Optional[str] = None, + _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, +) -> str: """Replace emoji code in text.""" - get_emoji = EMOJI.get + get_emoji = EMOJI.__getitem__ + variants = {"text": "\uFE0E", "emoji": "\uFE0F"} + get_variant = variants.get + default_variant_code = variants.get(default_variant, "") if default_variant else "" def do_replace(match: Match[str]) -> str: - """Called by re.sub to do the replacement.""" - emoji_code, emoji_name = match.groups() - return get_emoji(emoji_name.lower(), emoji_code) + emoji_code, emoji_name, variant = match.groups() + try: + return get_emoji(emoji_name.lower()) + get_variant( + variant, default_variant_code + ) + except KeyError: + return emoji_code return _emoji_sub(do_replace, text) diff --git a/rich/_export_format.py b/rich/_export_format.py new file mode 100644 index 0000000000..32aa71c91d --- /dev/null +++ b/rich/_export_format.py @@ -0,0 +1,69 @@ +CONSOLE_HTML_FORMAT = """\ + + + + + + + + +
{code}
+
+ + +""" + +CONSOLE_SVG_FORMAT = """\ + + + + {chrome} + + {backgrounds} + {matrix} + + +""" + +_SVG_FONT_FAMILY = "Rich Fira Code" +_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/rich/_extension.py b/rich/_extension.py new file mode 100644 index 0000000000..38658864eb --- /dev/null +++ b/rich/_extension.py @@ -0,0 +1,10 @@ +from typing import Any + + +def load_ipython_extension(ip: Any) -> None: # pragma: no cover + # prevent circular import + from rich.pretty import install + from rich.traceback import install as tr_install + + install() + tr_install() diff --git a/rich/_inspect.py b/rich/_inspect.py index a766b05559..01713e5767 100644 --- a/rich/_inspect.py +++ b/rich/_inspect.py @@ -1,9 +1,10 @@ from __future__ import absolute_import +import inspect from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature from typing import Any, Iterable, Optional, Tuple -from .console import RenderableType, RenderGroup +from .console import Group, RenderableType from .highlighter import ReprHighlighter from .jupyter import JupyterMixin from .panel import Panel @@ -37,13 +38,14 @@ class Inspect(JupyterMixin): dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. sort (bool, optional): Sort attributes alphabetically. Defaults to True. all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value of object. Defaults to True. """ def __init__( self, obj: Any, *, - title: TextType = None, + title: Optional[TextType] = None, help: bool = False, methods: bool = False, docs: bool = True, @@ -51,6 +53,7 @@ def __init__( dunder: bool = False, sort: bool = True, all: bool = True, + value: bool = True, ) -> None: self.highlighter = ReprHighlighter() self.obj = obj @@ -63,6 +66,7 @@ def __init__( self.private = private or dunder self.dunder = dunder self.sort = sort + self.value = value def _make_title(self, obj: Any) -> Text: """Make a default title.""" @@ -76,23 +80,26 @@ def _make_title(self, obj: Any) -> Text: def __rich__(self) -> Panel: return Panel.fit( - RenderGroup(*self._render()), + Group(*self._render()), title=self.title, border_style="scope.border", padding=(0, 1), ) - def _get_signature(self, name: str, obj: Any) -> Text: + def _get_signature(self, name: str, obj: Any) -> Optional[Text]: """Get a signature for a callable.""" try: _signature = str(signature(obj)) + ":" except ValueError: _signature = "(...)" + except TypeError: + return None source_filename: Optional[str] = None try: source_filename = getfile(obj) - except TypeError: + except (OSError, TypeError): + # OSError is raised if obj has no source file, e.g. when defined in REPL. pass callable_name = Text(name, style="inspect.callable") @@ -101,8 +108,17 @@ def _get_signature(self, name: str, obj: Any) -> Text: signature_text = self.highlighter(_signature) qualname = name or getattr(obj, "__qualname__", name) + + # If obj is a module, there may be classes (which are callable) to display + if inspect.isclass(obj): + prefix = "class" + else: + prefix = "def" + qual_signature = Text.assemble( - ("def ", "inspect.def"), (qualname, "inspect.callable"), signature_text + (f"{prefix} ", f"inspect.{prefix}"), + (qualname, "inspect.callable"), + signature_text, ) return qual_signature @@ -139,16 +155,26 @@ def safe_getattr(attr_name: str) -> Tuple[Any, Any]: highlighter = self.highlighter if callable(obj): - yield self._get_signature("", obj) - yield "" - - _doc = getdoc(obj) - if _doc is not None: - if not self.help: - _doc = _first_paragraph(_doc) - doc_text = Text(_reformat_doc(_doc), style="inspect.help") - doc_text = highlighter(doc_text) - yield doc_text + signature = self._get_signature("", obj) + if signature is not None: + yield signature + yield "" + + if self.docs: + _doc = getdoc(obj) + if _doc is not None: + if not self.help: + _doc = _first_paragraph(_doc) + doc_text = Text(_reformat_doc(_doc), style="inspect.help") + doc_text = highlighter(doc_text) + yield doc_text + yield "" + + if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): + yield Panel( + Pretty(obj, indent_guides=True, max_length=10, max_string=60), + border_style="inspect.value.border", + ) yield "" for key, (error, value) in items: @@ -168,67 +194,29 @@ def safe_getattr(attr_name: str) -> Tuple[Any, Any]: if callable(value): if not self.methods: continue - _signature_text = self._get_signature(key, value) - if self.docs: - docs = getdoc(value) - if docs is not None: - _doc = _reformat_doc(str(docs)) - if not self.help: - _doc = _first_paragraph(_doc) - _signature_text.append("\n" if "\n" in _doc else " ") - doc = highlighter(_doc) - doc.stylize("inspect.doc") - _signature_text.append(doc) - - add_row(key_text, _signature_text) + _signature_text = self._get_signature(key, value) + if _signature_text is None: + add_row(key_text, Pretty(value, highlighter=highlighter)) + else: + if self.docs: + docs = getdoc(value) + if docs is not None: + _doc = _reformat_doc(str(docs)) + if not self.help: + _doc = _first_paragraph(_doc) + _signature_text.append("\n" if "\n" in _doc else " ") + doc = highlighter(_doc) + doc.stylize("inspect.doc") + _signature_text.append(doc) + + add_row(key_text, _signature_text) else: add_row(key_text, Pretty(value, highlighter=highlighter)) if items_table.row_count: yield items_table - else: - yield self.highlighter( - Text.from_markup( - f"[i]{not_shown_count} attribute(s) not shown.[/i] Use inspect(, all=True) to see all attributes." - ) + elif not_shown_count: + yield Text.from_markup( + f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " + f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." ) - - -if __name__ == "__main__": # type: ignore - from rich import print - - inspect = Inspect({}, docs=True, methods=True, dunder=True) - print(inspect) - - t = Text("Hello, World") - print(Inspect(t)) - - from rich.style import Style - from rich.color import Color - - print(Inspect(Style.parse("bold red on black"), methods=True, docs=True)) - print(Inspect(Color.parse("#ffe326"), methods=True, docs=True)) - - from rich import get_console - - print(Inspect(get_console(), methods=False)) - - print(Inspect(open("foo.txt", "wt"), methods=False)) - - print(Inspect("Hello", methods=False, dunder=True)) - print(Inspect(inspect, methods=False, dunder=False, docs=False)) - - class Foo: - @property - def broken(self): - 1 / 0 - - f = Foo() - print(Inspect(f)) - - print(Inspect(object, dunder=True)) - - print(Inspect(None, dunder=False)) - - print(Inspect(str, help=True)) - print(Inspect(1, help=False)) diff --git a/rich/_log_render.py b/rich/_log_render.py index e0380289aa..e8810100b3 100644 --- a/rich/_log_render.py +++ b/rich/_log_render.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Iterable, List, Optional, TYPE_CHECKING, Union +from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable from .text import Text, TextType @@ -8,6 +8,8 @@ from .console import Console, ConsoleRenderable, RenderableType from .table import Table +FormatTimeCallable = Callable[[datetime], Text] + class LogRender: def __init__( @@ -15,26 +17,28 @@ def __init__( show_time: bool = True, show_level: bool = False, show_path: bool = True, - time_format: str = "[%x %X]", + time_format: Union[str, FormatTimeCallable] = "[%x %X]", + omit_repeated_times: bool = True, level_width: Optional[int] = 8, ) -> None: self.show_time = show_time self.show_level = show_level self.show_path = show_path self.time_format = time_format + self.omit_repeated_times = omit_repeated_times self.level_width = level_width - self._last_time: Optional[str] = None + self._last_time: Optional[Text] = None def __call__( self, console: "Console", renderables: Iterable["ConsoleRenderable"], - log_time: datetime = None, - time_format: str = None, + log_time: Optional[datetime] = None, + time_format: Optional[Union[str, FormatTimeCallable]] = None, level: TextType = "", - path: str = None, - line_no: int = None, - link_path: str = None, + path: Optional[str] = None, + line_no: Optional[int] = None, + link_path: Optional[str] = None, ) -> "Table": from .containers import Renderables from .table import Table @@ -51,11 +55,15 @@ def __call__( row: List["RenderableType"] = [] if self.show_time: log_time = log_time or console.get_datetime() - log_time_display = log_time.strftime(time_format or self.time_format) - if log_time_display == self._last_time: + time_format = time_format or self.time_format + if callable(time_format): + log_time_display = time_format(log_time) + else: + log_time_display = Text(log_time.strftime(time_format)) + if log_time_display == self._last_time and self.omit_repeated_times: row.append(Text(" " * len(log_time_display))) else: - row.append(Text(log_time_display)) + row.append(log_time_display) self._last_time = log_time_display if self.show_level: row.append(level) @@ -67,7 +75,11 @@ def __call__( path, style=f"link file://{link_path}" if link_path else "" ) if line_no: - path_text.append(f":{line_no}") + path_text.append(":") + path_text.append( + f"{line_no}", + style=f"link file://{link_path}#{line_no}" if link_path else "", + ) row.append(path_text) output.add_row(*row) diff --git a/rich/_lru_cache.py b/rich/_lru_cache.py index b77c337ca5..a227894352 100644 --- a/rich/_lru_cache.py +++ b/rich/_lru_cache.py @@ -1,12 +1,16 @@ -from collections import OrderedDict -from typing import Dict, Generic, TypeVar - +from typing import Dict, Generic, TypeVar, TYPE_CHECKING +import sys CacheKey = TypeVar("CacheKey") CacheValue = TypeVar("CacheValue") +if sys.version_info < (3, 9): + from typing_extensions import OrderedDict +else: + from collections import OrderedDict + -class LRUCache(Generic[CacheKey, CacheValue], OrderedDict): +class LRUCache(OrderedDict[CacheKey, CacheValue]): """ A dictionary-like container that stores a given maximum items. @@ -17,18 +21,18 @@ class LRUCache(Generic[CacheKey, CacheValue], OrderedDict): def __init__(self, cache_size: int) -> None: self.cache_size = cache_size - super(LRUCache, self).__init__() + super().__init__() def __setitem__(self, key: CacheKey, value: CacheValue) -> None: """Store a new views, potentially discarding an old value.""" if key not in self: if len(self) >= self.cache_size: self.popitem(last=False) - OrderedDict.__setitem__(self, key, value) + super().__setitem__(key, value) - def __getitem__(self: Dict[CacheKey, CacheValue], key: CacheKey) -> CacheValue: + def __getitem__(self, key: CacheKey) -> CacheValue: """Gets the item, but also makes it most recent.""" - value: CacheValue = OrderedDict.__getitem__(self, key) - OrderedDict.__delitem__(self, key) - OrderedDict.__setitem__(self, key, value) + value: CacheValue = super().__getitem__(key) + super().__delitem__(key) + super().__setitem__(key, value) return value diff --git a/rich/_palettes.py b/rich/_palettes.py index 082d881741..3c748d33e4 100644 --- a/rich/_palettes.py +++ b/rich/_palettes.py @@ -1,17 +1,25 @@ from .palette import Palette -# The standard ansi colors +# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) WINDOWS_PALETTE = Palette( [ - (0, 0, 0), - (128, 0, 0), - (0, 128, 0), - (128, 128, 0), - (0, 0, 128), - (128, 0, 128), - (0, 128, 128), - (192, 192, 192), + (12, 12, 12), + (197, 15, 31), + (19, 161, 14), + (193, 156, 0), + (0, 55, 218), + (136, 23, 152), + (58, 150, 221), + (204, 204, 204), + (118, 118, 118), + (231, 72, 86), + (22, 198, 12), + (249, 241, 165), + (59, 120, 255), + (180, 0, 158), + (97, 214, 214), + (242, 242, 242), ] ) diff --git a/rich/_ratio.py b/rich/_ratio.py index 4d9010d44f..f7dbe92705 100644 --- a/rich/_ratio.py +++ b/rich/_ratio.py @@ -1,5 +1,81 @@ +import sys +from fractions import Fraction from math import ceil -from typing import List +from typing import cast, List, Optional, Sequence + +if sys.version_info >= (3, 8): + from typing import Protocol +else: + from typing_extensions import Protocol # pragma: no cover + + +class Edge(Protocol): + """Any object that defines an edge (such as Layout).""" + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + +def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: + """Divide total space to satisfy size, ratio, and minimum_size, constraints. + + The returned list of integers should add up to total in most cases, unless it is + impossible to satisfy all the constraints. For instance, if there are two edges + with a minimum size of 20 each and `total` is 30 then the returned list will be + greater than total. In practice, this would mean that a Layout object would + clip the rows that would overflow the screen height. + + Args: + total (int): Total number of characters. + edges (List[Edge]): Edges within total space. + + Returns: + List[int]: Number of characters for each edge. + """ + # Size of edge or None for yet to be determined + sizes = [(edge.size or None) for edge in edges] + + _Fraction = Fraction + + # While any edges haven't been calculated + while None in sizes: + # Get flexible edges and index to map these back on to sizes list + flexible_edges = [ + (index, edge) + for index, (size, edge) in enumerate(zip(sizes, edges)) + if size is None + ] + # Remaining space in total + remaining = total - sum(size or 0 for size in sizes) + if remaining <= 0: + # No room for flexible edges + return [ + ((edge.minimum_size or 1) if size is None else size) + for size, edge in zip(sizes, edges) + ] + # Calculate number of characters in a ratio portion + portion = _Fraction( + remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) + ) + + # If any edges will be less than their minimum, replace size with the minimum + for index, edge in flexible_edges: + if portion * edge.ratio <= edge.minimum_size: + sizes[index] = edge.minimum_size + # New fixed size will invalidate calculations, so we need to repeat the process + break + else: + # Distribute flexible space and compensate for rounding error + # Since edge sizes can only be integers we need to add the remainder + # to the following line + remainder = _Fraction(0) + for index, edge in flexible_edges: + size, remainder = divmod(portion * edge.ratio + remainder, 1) + sizes[index] = size + break + # Sizes now contains integers only + return cast(List[int], sizes) def ratio_reduce( @@ -35,7 +111,7 @@ def ratio_reduce( def ratio_distribute( - total: int, ratios: List[int], minimums: List[int] = None + total: int, ratios: List[int], minimums: Optional[List[int]] = None ) -> List[int]: """Distribute an integer total in to parts based on ratios. @@ -68,3 +144,17 @@ def ratio_distribute( total_ratio -= ratio total_remaining -= distributed return distributed_total + + +if __name__ == "__main__": + from dataclasses import dataclass + + @dataclass + class E: + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) + print(sum(resolved)) diff --git a/rich/_spinners.py b/rich/_spinners.py new file mode 100644 index 0000000000..d0bb1fe751 --- /dev/null +++ b/rich/_spinners.py @@ -0,0 +1,482 @@ +""" +Spinners are from: +* cli-spinners: + MIT License + Copyright (c) Sindre Sorhus (sindresorhus.com) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +""" + +SPINNERS = { + "dots": { + "interval": 80, + "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏", + }, + "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, + "dots3": { + "interval": 80, + "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", + }, + "dots4": { + "interval": 80, + "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", + }, + "dots5": { + "interval": 80, + "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋", + }, + "dots6": { + "interval": 80, + "frames": "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁", + }, + "dots7": { + "interval": 80, + "frames": "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈", + }, + "dots8": { + "interval": 80, + "frames": "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈", + }, + "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗⡏"}, + "dots10": {"interval": 80, "frames": "⢄⢂⢁⡁⡈⡐⡠"}, + "dots11": {"interval": 100, "frames": "⠁⠂⠄⡀⢀⠠⠐⠈"}, + "dots12": { + "interval": 80, + "frames": [ + "⢀⠀", + "⡀⠀", + "⠄⠀", + "⢂⠀", + "⡂⠀", + "⠅⠀", + "⢃⠀", + "⡃⠀", + "⠍⠀", + "⢋⠀", + "⡋⠀", + "⠍⠁", + "⢋⠁", + "⡋⠁", + "⠍⠉", + "⠋⠉", + "⠋⠉", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⢈⠩", + "⡀⢙", + "⠄⡙", + "⢂⠩", + "⡂⢘", + "⠅⡘", + "⢃⠨", + "⡃⢐", + "⠍⡐", + "⢋⠠", + "⡋⢀", + "⠍⡁", + "⢋⠁", + "⡋⠁", + "⠍⠉", + "⠋⠉", + "⠋⠉", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⠈⠩", + "⠀⢙", + "⠀⡙", + "⠀⠩", + "⠀⢘", + "⠀⡘", + "⠀⠨", + "⠀⢐", + "⠀⡐", + "⠀⠠", + "⠀⢀", + "⠀⡀", + ], + }, + "dots8Bit": { + "interval": 80, + "frames": "⠀⠁⠂⠃⠄⠅⠆⠇⡀⡁⡂⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌⠍⠎⠏⡈⡉⡊⡋⡌⡍⡎⡏⠐⠑⠒⠓⠔⠕⠖⠗⡐⡑⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜⠝⠞⠟⡘⡙" + "⡚⡛⡜⡝⡞⡟⠠⠡⠢⠣⠤⠥⠦⠧⡠⡡⡢⡣⡤⡥⡦⡧⠨⠩⠪⠫⠬⠭⠮⠯⡨⡩⡪⡫⡬⡭⡮⡯⠰⠱⠲⠳⠴⠵⠶⠷⡰⡱⡲⡳⡴⡵⡶⡷⠸⠹⠺⠻" + "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⣀⣁⣂⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌⢍⢎⢏⣈⣉⣊⣋⣌⣍⣎⣏⢐⢑⢒⢓⢔⢕⢖⢗⣐⣑⣒⣓⣔⣕" + "⣖⣗⢘⢙⢚⢛⢜⢝⢞⢟⣘⣙⣚⣛⣜⣝⣞⣟⢠⢡⢢⢣⢤⢥⢦⢧⣠⣡⣢⣣⣤⣥⣦⣧⢨⢩⢪⢫⢬⢭⢮⢯⣨⣩⣪⣫⣬⣭⣮⣯⢰⢱⢲⢳⢴⢵⢶⢷" + "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", + }, + "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, + "line2": {"interval": 100, "frames": "⠂-–—–-"}, + "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬┐"}, + "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, + "simpleDotsScrolling": { + "interval": 200, + "frames": [". ", ".. ", "...", " ..", " .", " "], + }, + "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, + "star2": {"interval": 80, "frames": "+x*"}, + "flip": { + "interval": 70, + "frames": "___-``'´-___", + }, + "hamburger": {"interval": 100, "frames": "☱☲☴"}, + "growVertical": { + "interval": 120, + "frames": "▁▃▄▅▆▇▆▅▄▃", + }, + "growHorizontal": { + "interval": 120, + "frames": "▏▎▍▌▋▊▉▊▋▌▍▎", + }, + "balloon": {"interval": 140, "frames": " .oO@* "}, + "balloon2": {"interval": 120, "frames": ".oO°Oo."}, + "noise": {"interval": 100, "frames": "▓▒░"}, + "bounce": {"interval": 120, "frames": "⠁⠂⠄⠂"}, + "boxBounce": {"interval": 120, "frames": "▖▘▝▗"}, + "boxBounce2": {"interval": 100, "frames": "▌▀▐▄"}, + "triangle": {"interval": 50, "frames": "◢◣◤◥"}, + "arc": {"interval": 100, "frames": "◜◠◝◞◡◟"}, + "circle": {"interval": 120, "frames": "◡⊙◠"}, + "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, + "circleQuarters": {"interval": 120, "frames": "◴◷◶◵"}, + "circleHalves": {"interval": 50, "frames": "◐◓◑◒"}, + "squish": {"interval": 100, "frames": "╫╪"}, + "toggle": {"interval": 250, "frames": "⊶⊷"}, + "toggle2": {"interval": 80, "frames": "▫▪"}, + "toggle3": {"interval": 120, "frames": "□■"}, + "toggle4": {"interval": 100, "frames": "■□▪▫"}, + "toggle5": {"interval": 100, "frames": "▮▯"}, + "toggle6": {"interval": 300, "frames": "ဝ၀"}, + "toggle7": {"interval": 80, "frames": "⦾⦿"}, + "toggle8": {"interval": 100, "frames": "◍◌"}, + "toggle9": {"interval": 100, "frames": "◉◎"}, + "toggle10": {"interval": 100, "frames": "㊂㊀㊁"}, + "toggle11": {"interval": 50, "frames": "⧇⧆"}, + "toggle12": {"interval": 120, "frames": "☗☖"}, + "toggle13": {"interval": 80, "frames": "=*-"}, + "arrow": {"interval": 100, "frames": "←↖↑↗→↘↓↙"}, + "arrow2": { + "interval": 80, + "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "], + }, + "arrow3": { + "interval": 120, + "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], + }, + "bouncingBar": { + "interval": 80, + "frames": [ + "[ ]", + "[= ]", + "[== ]", + "[=== ]", + "[ ===]", + "[ ==]", + "[ =]", + "[ ]", + "[ =]", + "[ ==]", + "[ ===]", + "[====]", + "[=== ]", + "[== ]", + "[= ]", + ], + }, + "bouncingBall": { + "interval": 80, + "frames": [ + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "( ●)", + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "(● )", + ], + }, + "smiley": {"interval": 200, "frames": ["😄 ", "😝 "]}, + "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, + "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]}, + "clock": { + "interval": 100, + "frames": [ + "🕛 ", + "🕐 ", + "🕑 ", + "🕒 ", + "🕓 ", + "🕔 ", + "🕕 ", + "🕖 ", + "🕗 ", + "🕘 ", + "🕙 ", + "🕚 ", + ], + }, + "earth": {"interval": 180, "frames": ["🌍 ", "🌎 ", "🌏 "]}, + "material": { + "interval": 17, + "frames": [ + "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", + "████████▁▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "██████████▁▁▁▁▁▁▁▁▁▁", + "███████████▁▁▁▁▁▁▁▁▁", + "█████████████▁▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁▁██████████████▁▁▁▁", + "▁▁▁██████████████▁▁▁", + "▁▁▁▁█████████████▁▁▁", + "▁▁▁▁██████████████▁▁", + "▁▁▁▁██████████████▁▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁▁██████████████", + "▁▁▁▁▁▁██████████████", + "▁▁▁▁▁▁▁█████████████", + "▁▁▁▁▁▁▁█████████████", + "▁▁▁▁▁▁▁▁████████████", + "▁▁▁▁▁▁▁▁████████████", + "▁▁▁▁▁▁▁▁▁███████████", + "▁▁▁▁▁▁▁▁▁███████████", + "▁▁▁▁▁▁▁▁▁▁██████████", + "▁▁▁▁▁▁▁▁▁▁██████████", + "▁▁▁▁▁▁▁▁▁▁▁▁████████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "████████▁▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "███████████▁▁▁▁▁▁▁▁▁", + "████████████▁▁▁▁▁▁▁▁", + "████████████▁▁▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁▁▁█████████████▁▁▁▁", + "▁▁▁▁▁████████████▁▁▁", + "▁▁▁▁▁████████████▁▁▁", + "▁▁▁▁▁▁███████████▁▁▁", + "▁▁▁▁▁▁▁▁█████████▁▁▁", + "▁▁▁▁▁▁▁▁█████████▁▁▁", + "▁▁▁▁▁▁▁▁▁█████████▁▁", + "▁▁▁▁▁▁▁▁▁█████████▁▁", + "▁▁▁▁▁▁▁▁▁▁█████████▁", + "▁▁▁▁▁▁▁▁▁▁▁████████▁", + "▁▁▁▁▁▁▁▁▁▁▁████████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + ], + }, + "moon": { + "interval": 80, + "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], + }, + "runner": {"interval": 140, "frames": ["🚶 ", "🏃 "]}, + "pong": { + "interval": 80, + "frames": [ + "▐⠂ ▌", + "▐⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂▌", + "▐ ⠠▌", + "▐ ⡀▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐⠠ ▌", + ], + }, + "shark": { + "interval": 120, + "frames": [ + "▐|\\____________▌", + "▐_|\\___________▌", + "▐__|\\__________▌", + "▐___|\\_________▌", + "▐____|\\________▌", + "▐_____|\\_______▌", + "▐______|\\______▌", + "▐_______|\\_____▌", + "▐________|\\____▌", + "▐_________|\\___▌", + "▐__________|\\__▌", + "▐___________|\\_▌", + "▐____________|\\▌", + "▐____________/|▌", + "▐___________/|_▌", + "▐__________/|__▌", + "▐_________/|___▌", + "▐________/|____▌", + "▐_______/|_____▌", + "▐______/|______▌", + "▐_____/|_______▌", + "▐____/|________▌", + "▐___/|_________▌", + "▐__/|__________▌", + "▐_/|___________▌", + "▐/|____________▌", + ], + }, + "dqpb": {"interval": 100, "frames": "dqpb"}, + "weather": { + "interval": 100, + "frames": [ + "☀️ ", + "☀️ ", + "☀️ ", + "🌤 ", + "⛅️ ", + "🌥 ", + "☁️ ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "⛈ ", + "🌨 ", + "🌧 ", + "🌨 ", + "☁️ ", + "🌥 ", + "⛅️ ", + "🌤 ", + "☀️ ", + "☀️ ", + ], + }, + "christmas": {"interval": 400, "frames": "🌲🎄"}, + "grenade": { + "interval": 80, + "frames": [ + "، ", + "′ ", + " ´ ", + " ‾ ", + " ⸌", + " ⸊", + " |", + " ⁎", + " ⁕", + " ෴ ", + " ⁓", + " ", + " ", + " ", + ], + }, + "point": {"interval": 125, "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]}, + "layer": {"interval": 150, "frames": "-=≡"}, + "betaWave": { + "interval": 80, + "frames": [ + "ρββββββ", + "βρβββββ", + "ββρββββ", + "βββρβββ", + "ββββρββ", + "βββββρβ", + "ββββββρ", + ], + }, + "aesthetic": { + "interval": 80, + "frames": [ + "▰▱▱▱▱▱▱", + "▰▰▱▱▱▱▱", + "▰▰▰▱▱▱▱", + "▰▰▰▰▱▱▱", + "▰▰▰▰▰▱▱", + "▰▰▰▰▰▰▱", + "▰▰▰▰▰▰▰", + "▰▱▱▱▱▱▱", + ], + }, +} diff --git a/rich/_timer.py b/rich/_timer.py new file mode 100644 index 0000000000..a2ca6be03c --- /dev/null +++ b/rich/_timer.py @@ -0,0 +1,19 @@ +""" +Timer context manager, only used in debug. + +""" + +from time import time + +import contextlib +from typing import Generator + + +@contextlib.contextmanager +def timer(subject: str = "time") -> Generator[None, None, None]: + """print the elapsed time. (only used in debugging)""" + start = time() + yield + elapsed = time() - start + elapsed_ms = elapsed * 1000 + print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/rich/_win32_console.py b/rich/_win32_console.py new file mode 100644 index 0000000000..f642279c55 --- /dev/null +++ b/rich/_win32_console.py @@ -0,0 +1,630 @@ +"""Light wrapper around the Win32 Console API - this module should only be imported on Windows + +The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions +""" +import ctypes +import sys +from typing import Any + +windll: Any = None +if sys.platform == "win32": + windll = ctypes.LibraryLoader(ctypes.WinDLL) +else: + raise ImportError(f"{__name__} can only be imported on Windows") + +import time +from ctypes import Structure, byref, wintypes +from typing import IO, NamedTuple, Type, cast + +from rich.color import ColorSystem +from rich.style import Style + +STDOUT = -11 +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 + +COORD = wintypes._COORD + + +class LegacyWindowsError(Exception): + pass + + +class WindowsCoordinates(NamedTuple): + """Coordinates in the Windows Console API are (y, x), not (x, y). + This class is intended to prevent that confusion. + Rows and columns are indexed from 0. + This class can be used in place of wintypes._COORD in arguments and argtypes. + """ + + row: int + col: int + + @classmethod + def from_param(cls, value: "WindowsCoordinates") -> COORD: + """Converts a WindowsCoordinates into a wintypes _COORD structure. + This classmethod is internally called by ctypes to perform the conversion. + + Args: + value (WindowsCoordinates): The input coordinates to convert. + + Returns: + wintypes._COORD: The converted coordinates struct. + """ + return COORD(value.col, value.row) + + +class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + + +class CONSOLE_CURSOR_INFO(ctypes.Structure): + _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] + + +_GetStdHandle = windll.kernel32.GetStdHandle +_GetStdHandle.argtypes = [ + wintypes.DWORD, +] +_GetStdHandle.restype = wintypes.HANDLE + + +def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: + """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). + + Args: + handle (int): Integer identifier for the handle. Defaults to -11 (stdout). + + Returns: + wintypes.HANDLE: The handle + """ + return cast(wintypes.HANDLE, _GetStdHandle(handle)) + + +_GetConsoleMode = windll.kernel32.GetConsoleMode +_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] +_GetConsoleMode.restype = wintypes.BOOL + + +def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: + """Retrieves the current input mode of a console's input buffer + or the current output mode of a console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Raises: + LegacyWindowsError: If any error occurs while calling the Windows console API. + + Returns: + int: Value representing the current console mode as documented at + https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters + """ + + console_mode = wintypes.DWORD() + success = bool(_GetConsoleMode(std_handle, console_mode)) + if not success: + raise LegacyWindowsError("Unable to get legacy Windows Console Mode") + return console_mode.value + + +_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW +_FillConsoleOutputCharacterW.argtypes = [ + wintypes.HANDLE, + ctypes.c_char, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputCharacterW.restype = wintypes.BOOL + + +def FillConsoleOutputCharacter( + std_handle: wintypes.HANDLE, + char: str, + length: int, + start: WindowsCoordinates, +) -> int: + """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + char (str): The character to write. Must be a string of length 1. + length (int): The number of times to write the character. + start (WindowsCoordinates): The coordinates to start writing at. + + Returns: + int: The number of characters written. + """ + character = ctypes.c_char(char.encode()) + num_characters = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + _FillConsoleOutputCharacterW( + std_handle, + character, + num_characters, + start, + byref(num_written), + ) + return num_written.value + + +_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute +_FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputAttribute.restype = wintypes.BOOL + + +def FillConsoleOutputAttribute( + std_handle: wintypes.HANDLE, + attributes: int, + length: int, + start: WindowsCoordinates, +) -> int: + """Sets the character attributes for a specified number of character cells, + beginning at the specified coordinates in a screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours of the cells. + length (int): The number of cells to set the output attribute of. + start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. + + Returns: + int: The number of cells whose attributes were actually set. + """ + num_cells = wintypes.DWORD(length) + style_attrs = wintypes.WORD(attributes) + num_written = wintypes.DWORD(0) + _FillConsoleOutputAttribute( + std_handle, style_attrs, num_cells, start, byref(num_written) + ) + return num_written.value + + +_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute +_SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, +] +_SetConsoleTextAttribute.restype = wintypes.BOOL + + +def SetConsoleTextAttribute( + std_handle: wintypes.HANDLE, attributes: wintypes.WORD +) -> bool: + """Set the colour attributes for all text written after this function is called. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours. + + + Returns: + bool: True if the attribute was set successfully, otherwise False. + """ + return bool(_SetConsoleTextAttribute(std_handle, attributes)) + + +_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo +_GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), +] +_GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + +def GetConsoleScreenBufferInfo( + std_handle: wintypes.HANDLE, +) -> CONSOLE_SCREEN_BUFFER_INFO: + """Retrieves information about the specified console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Returns: + CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about + screen size, cursor position, colour attributes, and more.""" + console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() + _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) + return console_screen_buffer_info + + +_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition +_SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + cast(Type[COORD], WindowsCoordinates), +] +_SetConsoleCursorPosition.restype = wintypes.BOOL + + +def SetConsoleCursorPosition( + std_handle: wintypes.HANDLE, coords: WindowsCoordinates +) -> bool: + """Set the position of the cursor in the console screen + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + coords (WindowsCoordinates): The coordinates to move the cursor to. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorPosition(std_handle, coords)) + + +_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo +_SetConsoleCursorInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_CURSOR_INFO), +] +_SetConsoleCursorInfo.restype = wintypes.BOOL + + +def SetConsoleCursorInfo( + std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO +) -> bool: + """Set the cursor info - used for adjusting cursor visibility and width + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) + + +_SetConsoleTitle = windll.kernel32.SetConsoleTitleW +_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] +_SetConsoleTitle.restype = wintypes.BOOL + + +def SetConsoleTitle(title: str) -> bool: + """Sets the title of the current console window + + Args: + title (str): The new title of the console window. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleTitle(title)) + + +class LegacyWindowsTerm: + """This class allows interaction with the legacy Windows Console API. It should only be used in the context + of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, + the entire API should work. + + Args: + file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. + """ + + BRIGHT_BIT = 8 + + # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers + ANSI_TO_WINDOWS = [ + 0, # black The Windows colours are defined in wincon.h as follows: + 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 + 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 + 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 + 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 + 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 + 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 + 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 + 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 + 12, # bright red + 10, # bright green + 14, # bright yellow + 9, # bright blue + 13, # bright magenta + 11, # bright cyan + 15, # bright white + ] + + def __init__(self, file: "IO[str]") -> None: + handle = GetStdHandle(STDOUT) + self._handle = handle + default_text = GetConsoleScreenBufferInfo(handle).wAttributes + self._default_text = default_text + + self._default_fore = default_text & 7 + self._default_back = (default_text >> 4) & 7 + self._default_attrs = self._default_fore | (self._default_back << 4) + + self._file = file + self.write = file.write + self.flush = file.flush + + @property + def cursor_position(self) -> WindowsCoordinates: + """Returns the current position of the cursor (0-based) + + Returns: + WindowsCoordinates: The current cursor position. + """ + coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition + return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) + + @property + def screen_size(self) -> WindowsCoordinates: + """Returns the current size of the console screen buffer, in character columns and rows + + Returns: + WindowsCoordinates: The width and height of the screen as WindowsCoordinates. + """ + screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize + return WindowsCoordinates( + row=cast(int, screen_size.Y), col=cast(int, screen_size.X) + ) + + def write_text(self, text: str) -> None: + """Write text directly to the terminal without any modification of styles + + Args: + text (str): The text to write to the console + """ + self.write(text) + self.flush() + + def write_styled(self, text: str, style: Style) -> None: + """Write styled text to the terminal. + + Args: + text (str): The text to write + style (Style): The style of the text + """ + color = style.color + bgcolor = style.bgcolor + if style.reverse: + color, bgcolor = bgcolor, color + + if color: + fore = color.downgrade(ColorSystem.WINDOWS).number + fore = fore if fore is not None else 7 # Default to ANSI 7: White + if style.bold: + fore = fore | self.BRIGHT_BIT + if style.dim: + fore = fore & ~self.BRIGHT_BIT + fore = self.ANSI_TO_WINDOWS[fore] + else: + fore = self._default_fore + + if bgcolor: + back = bgcolor.downgrade(ColorSystem.WINDOWS).number + back = back if back is not None else 0 # Default to ANSI 0: Black + back = self.ANSI_TO_WINDOWS[back] + else: + back = self._default_back + + assert fore is not None + assert back is not None + + SetConsoleTextAttribute( + self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) + ) + self.write_text(text) + SetConsoleTextAttribute(self._handle, attributes=self._default_text) + + def move_cursor_to(self, new_position: WindowsCoordinates) -> None: + """Set the position of the cursor + + Args: + new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. + """ + if new_position.col < 0 or new_position.row < 0: + return + SetConsoleCursorPosition(self._handle, coords=new_position) + + def erase_line(self) -> None: + """Erase all content on the line the cursor is currently located at""" + screen_size = self.screen_size + cursor_position = self.cursor_position + cells_to_erase = screen_size.col + start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=start_coordinates + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=start_coordinates, + ) + + def erase_end_of_line(self) -> None: + """Erase all content from the cursor position to the end of that line""" + cursor_position = self.cursor_position + cells_to_erase = self.screen_size.col - cursor_position.col + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=cursor_position + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=cursor_position, + ) + + def erase_start_of_line(self) -> None: + """Erase all content from the cursor position to the start of that line""" + row, col = self.cursor_position + start = WindowsCoordinates(row, 0) + FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) + FillConsoleOutputAttribute( + self._handle, self._default_attrs, length=col, start=start + ) + + def move_cursor_up(self) -> None: + """Move the cursor up a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row - 1, col=cursor_position.col + ), + ) + + def move_cursor_down(self) -> None: + """Move the cursor down a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row + 1, + col=cursor_position.col, + ), + ) + + def move_cursor_forward(self) -> None: + """Move the cursor forward a single cell. Wrap to the next line if required.""" + row, col = self.cursor_position + if col == self.screen_size.col - 1: + row += 1 + col = 0 + else: + col += 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def move_cursor_to_column(self, column: int) -> None: + """Move cursor to the column specified by the zero-based column index, staying on the same row + + Args: + column (int): The zero-based column index to move the cursor to. + """ + row, _ = self.cursor_position + SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) + + def move_cursor_backward(self) -> None: + """Move the cursor backward a single cell. Wrap to the previous line if required.""" + row, col = self.cursor_position + if col == 0: + row -= 1 + col = self.screen_size.col - 1 + else: + col -= 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def hide_cursor(self) -> None: + """Hide the cursor""" + invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=100, bVisible=0) + SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) + + def show_cursor(self) -> None: + """Show the cursor""" + visible_cursor = CONSOLE_CURSOR_INFO(dwSize=100, bVisible=1) + SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) + + def set_title(self, title: str) -> None: + """Set the title of the terminal window + + Args: + title (str): The new title of the console window + """ + assert len(title) < 255, "Console title must be less than 255 characters" + SetConsoleTitle(title) + + +if __name__ == "__main__": + handle = GetStdHandle() + + from rich.console import Console + + console = Console() + + term = LegacyWindowsTerm(sys.stdout) + term.set_title("Win32 Console Examples") + + style = Style(color="black", bgcolor="red") + + heading = Style.parse("black on green") + + # Check colour output + console.rule("Checking colour output") + console.print("[on red]on red!") + console.print("[blue]blue!") + console.print("[yellow]yellow!") + console.print("[bold yellow]bold yellow!") + console.print("[bright_yellow]bright_yellow!") + console.print("[dim bright_yellow]dim bright_yellow!") + console.print("[italic cyan]italic cyan!") + console.print("[bold white on blue]bold white on blue!") + console.print("[reverse bold white on blue]reverse bold white on blue!") + console.print("[bold black on cyan]bold black on cyan!") + console.print("[black on green]black on green!") + console.print("[blue on green]blue on green!") + console.print("[white on black]white on black!") + console.print("[black on white]black on white!") + console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") + + # Check cursor movement + console.rule("Checking cursor movement") + console.print() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("went back and wrapped to prev line") + time.sleep(1) + term.move_cursor_up() + term.write_text("we go up") + time.sleep(1) + term.move_cursor_down() + term.write_text("and down") + time.sleep(1) + term.move_cursor_up() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went up and back 2") + time.sleep(1) + term.move_cursor_down() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went down and back 2") + time.sleep(1) + + # Check erasing of lines + term.hide_cursor() + console.print() + console.rule("Checking line erasing") + console.print("\n...Deleting to the start of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + term.move_cursor_to_column(16) + term.write_styled("<", Style.parse("black on red")) + term.move_cursor_backward() + time.sleep(1) + term.erase_start_of_line() + time.sleep(1) + + console.print("\n\n...And to the end of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + + term.move_cursor_to_column(16) + term.write_styled(">", Style.parse("black on red")) + time.sleep(1) + term.erase_end_of_line() + time.sleep(1) + + console.print("\n\n...Now the whole line will be erased...") + term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) + time.sleep(1) + term.erase_line() + + term.show_cursor() + print("\n") diff --git a/rich/_windows.py b/rich/_windows.py index d252d1f9ea..98c7008635 100644 --- a/rich/_windows.py +++ b/rich/_windows.py @@ -1,5 +1,4 @@ import sys - from dataclasses import dataclass @@ -15,10 +14,21 @@ class WindowsConsoleFeatures: try: import ctypes - from ctypes import wintypes from ctypes import LibraryLoader - windll = LibraryLoader(ctypes.WinDLL) # type: ignore + if sys.platform == "win32": + windll = LibraryLoader(ctypes.WinDLL) + else: + windll = None + raise ImportError("Not windows") + + from rich._win32_console import ( + ENABLE_VIRTUAL_TERMINAL_PROCESSING, + GetConsoleMode, + GetStdHandle, + LegacyWindowsError, + ) + except (AttributeError, ImportError, ValueError): # Fallback if we can't load the Windows DLL @@ -26,34 +36,25 @@ def get_windows_console_features() -> WindowsConsoleFeatures: features = WindowsConsoleFeatures() return features - else: - STDOUT = -11 - ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 - _GetConsoleMode = windll.kernel32.GetConsoleMode - _GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] - _GetConsoleMode.restype = wintypes.BOOL - - _GetStdHandle = windll.kernel32.GetStdHandle - _GetStdHandle.argtypes = [ - wintypes.DWORD, - ] - _GetStdHandle.restype = wintypes.HANDLE - def get_windows_console_features() -> WindowsConsoleFeatures: """Get windows console features. Returns: WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. """ - handle = _GetStdHandle(STDOUT) - console_mode = wintypes.DWORD() - result = _GetConsoleMode(handle, console_mode) - vt = bool(result and console_mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING) + handle = GetStdHandle() + try: + console_mode = GetConsoleMode(handle) + success = True + except LegacyWindowsError: + console_mode = 0 + success = False + vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) truecolor = False if vt: - win_version = sys.getwindowsversion() # type: ignore + win_version = sys.getwindowsversion() truecolor = win_version.major > 10 or ( win_version.major == 10 and win_version.build >= 15063 ) diff --git a/rich/_windows_renderer.py b/rich/_windows_renderer.py new file mode 100644 index 0000000000..0fc2ba852a --- /dev/null +++ b/rich/_windows_renderer.py @@ -0,0 +1,56 @@ +from typing import Iterable, Sequence, Tuple, cast + +from rich._win32_console import LegacyWindowsTerm, WindowsCoordinates +from rich.segment import ControlCode, ControlType, Segment + + +def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: + """Makes appropriate Windows Console API calls based on the segments in the buffer. + + Args: + buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. + term (LegacyWindowsTerm): Used to call the Windows Console API. + """ + for text, style, control in buffer: + if not control: + if style: + term.write_styled(text, style) + else: + term.write_text(text) + else: + control_codes: Sequence[ControlCode] = control + for control_code in control_codes: + control_type = control_code[0] + if control_type == ControlType.CURSOR_MOVE_TO: + _, x, y = cast(Tuple[ControlType, int, int], control_code) + term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) + elif control_type == ControlType.CARRIAGE_RETURN: + term.write_text("\r") + elif control_type == ControlType.HOME: + term.move_cursor_to(WindowsCoordinates(0, 0)) + elif control_type == ControlType.CURSOR_UP: + term.move_cursor_up() + elif control_type == ControlType.CURSOR_DOWN: + term.move_cursor_down() + elif control_type == ControlType.CURSOR_FORWARD: + term.move_cursor_forward() + elif control_type == ControlType.CURSOR_BACKWARD: + term.move_cursor_backward() + elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: + _, column = cast(Tuple[ControlType, int], control_code) + term.move_cursor_to_column(column - 1) + elif control_type == ControlType.HIDE_CURSOR: + term.hide_cursor() + elif control_type == ControlType.SHOW_CURSOR: + term.show_cursor() + elif control_type == ControlType.ERASE_IN_LINE: + _, mode = cast(Tuple[ControlType, int], control_code) + if mode == 0: + term.erase_end_of_line() + elif mode == 1: + term.erase_start_of_line() + elif mode == 2: + term.erase_line() + elif control_type == ControlType.SET_WINDOW_TITLE: + _, title = cast(Tuple[ControlType, str], control_code) + term.set_title(title) diff --git a/rich/align.py b/rich/align.py index 046323eca7..c9b7cfa01e 100644 --- a/rich/align.py +++ b/rich/align.py @@ -1,17 +1,23 @@ -from typing import Iterable, TYPE_CHECKING +import sys +from itertools import chain +from typing import TYPE_CHECKING, Iterable, Optional + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal # pragma: no cover -from typing_extensions import Literal from .constrain import Constrain from .jupyter import JupyterMixin from .measure import Measurement from .segment import Segment from .style import StyleType - if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult, RenderableType + from .console import Console, ConsoleOptions, RenderableType, RenderResult -AlignValues = Literal["left", "center", "right"] +AlignMethod = Literal["left", "center", "right"] +VerticalAlignMethod = Literal["top", "middle", "bottom"] class Align(JupyterMixin): @@ -19,10 +25,12 @@ class Align(JupyterMixin): Args: renderable (RenderableType): A console renderable. - align (AlignValues): One of "left", "center", or "right"" - style (StyleType, optional): An optional style to apply to the renderable. + align (AlignMethod): One of "left", "center", or "right"" + style (StyleType, optional): An optional style to apply to the background. + vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. pad (bool, optional): Pad the right with spaces. Defaults to True. width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. + height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. Raises: ValueError: if ``align`` is not one of the expected values. @@ -31,69 +39,116 @@ class Align(JupyterMixin): def __init__( self, renderable: "RenderableType", - align: AlignValues, - style: StyleType = None, + align: AlignMethod = "left", + style: Optional[StyleType] = None, *, + vertical: Optional[VerticalAlignMethod] = None, pad: bool = True, - width: int = None, + width: Optional[int] = None, + height: Optional[int] = None, ) -> None: if align not in ("left", "center", "right"): raise ValueError( - f'invalid value for align, expected "left", "center", "right" (not {align!r})' + f'invalid value for align, expected "left", "center", or "right" (not {align!r})' + ) + if vertical is not None and vertical not in ("top", "middle", "bottom"): + raise ValueError( + f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' ) self.renderable = renderable self.align = align self.style = style + self.vertical = vertical self.pad = pad self.width = width + self.height = height + + def __repr__(self) -> str: + return f"Align({self.renderable!r}, {self.align!r})" @classmethod def left( cls, renderable: "RenderableType", - style: StyleType = None, + style: Optional[StyleType] = None, *, + vertical: Optional[VerticalAlignMethod] = None, pad: bool = True, - width: int = None, + width: Optional[int] = None, + height: Optional[int] = None, ) -> "Align": """Align a renderable to the left.""" - return cls(renderable, "left", style=style, pad=pad, width=width) + return cls( + renderable, + "left", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) @classmethod def center( cls, renderable: "RenderableType", - style: StyleType = None, + style: Optional[StyleType] = None, *, + vertical: Optional[VerticalAlignMethod] = None, pad: bool = True, - width: int = None, + width: Optional[int] = None, + height: Optional[int] = None, ) -> "Align": """Align a renderable to the center.""" - return cls(renderable, "center", style=style, pad=pad, width=width) + return cls( + renderable, + "center", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) @classmethod def right( cls, renderable: "RenderableType", - style: StyleType = None, + style: Optional[StyleType] = None, *, + vertical: Optional[VerticalAlignMethod] = None, pad: bool = True, - width: int = None, + width: Optional[int] = None, + height: Optional[int] = None, ) -> "Align": """Align a renderable to the right.""" - return cls(renderable, "right", style=style, pad=pad, width=width) + return cls( + renderable, + "right", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": - align = self.align - rendered = console.render(Constrain(self.renderable, width=self.width), options) + width = console.measure(self.renderable, options=options).maximum + rendered = console.render( + Constrain( + self.renderable, width if self.width is None else min(width, self.width) + ), + options.update(height=None), + ) lines = list(Segment.split_lines(rendered)) width, height = Segment.get_shape(lines) lines = Segment.set_shape(lines, width, height) new_line = Segment.line() excess_space = options.max_width - width + style = console.get_style(self.style) if self.style is not None else None def generate_segments() -> Iterable[Segment]: if excess_space <= 0: @@ -104,7 +159,7 @@ def generate_segments() -> Iterable[Segment]: elif align == "left": # Pad on the right - pad = Segment(" " * excess_space) if self.pad else None + pad = Segment(" " * excess_space, style) if self.pad else None for line in lines: yield from line if pad: @@ -114,8 +169,10 @@ def generate_segments() -> Iterable[Segment]: elif align == "center": # Pad left and right left = excess_space // 2 - pad = Segment(" " * left) - pad_right = Segment(" " * (excess_space - left)) if self.pad else None + pad = Segment(" " * left, style) + pad_right = ( + Segment(" " * (excess_space - left), style) if self.pad else None + ) for line in lines: if left: yield pad @@ -126,27 +183,129 @@ def generate_segments() -> Iterable[Segment]: elif align == "right": # Padding on left - pad = Segment(" " * excess_space) + pad = Segment(" " * excess_space, style) for line in lines: yield pad yield from line yield new_line - iter_segments = generate_segments() - if self.style is not None: + blank_line = ( + Segment(f"{' ' * (self.width or options.max_width)}\n", style) + if self.pad + else Segment("\n") + ) + + def blank_lines(count: int) -> Iterable[Segment]: + if count > 0: + for _ in range(count): + yield blank_line + + vertical_height = self.height or options.height + iter_segments: Iterable[Segment] + if self.vertical and vertical_height is not None: + if self.vertical == "top": + bottom_space = vertical_height - height + iter_segments = chain(generate_segments(), blank_lines(bottom_space)) + elif self.vertical == "middle": + top_space = (vertical_height - height) // 2 + bottom_space = vertical_height - top_space - height + iter_segments = chain( + blank_lines(top_space), + generate_segments(), + blank_lines(bottom_space), + ) + else: # self.vertical == "bottom": + top_space = vertical_height - height + iter_segments = chain(blank_lines(top_space), generate_segments()) + else: + iter_segments = generate_segments() + if self.style: style = console.get_style(self.style) iter_segments = Segment.apply_style(iter_segments, style) - return iter_segments + yield from iter_segments + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) + return measurement + + +class VerticalCenter(JupyterMixin): + """Vertically aligns a renderable. + + Warn: + This class is deprecated and may be removed in a future version. Use Align class with + `vertical="middle"`. + + Args: + renderable (RenderableType): A renderable object. + """ - def __rich_measure__(self, console: "Console", max_width: int) -> Measurement: - measurement = Measurement.get(console, self.renderable, max_width) + def __init__( + self, + renderable: "RenderableType", + style: Optional[StyleType] = None, + ) -> None: + self.renderable = renderable + self.style = style + + def __repr__(self) -> str: + return f"VerticalCenter({self.renderable!r})" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + style = console.get_style(self.style) if self.style is not None else None + lines = console.render_lines( + self.renderable, options.update(height=None), pad=False + ) + width, _height = Segment.get_shape(lines) + new_line = Segment.line() + height = options.height or options.size.height + top_space = (height - len(lines)) // 2 + bottom_space = height - top_space - len(lines) + blank_line = Segment(f"{' ' * width}", style) + + def blank_lines(count: int) -> Iterable[Segment]: + for _ in range(count): + yield blank_line + yield new_line + + if top_space > 0: + yield from blank_lines(top_space) + for line in lines: + yield from line + yield new_line + if bottom_space > 0: + yield from blank_lines(bottom_space) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) return measurement if __name__ == "__main__": # pragma: no cover - from rich.console import Console + from rich.console import Console, Group + from rich.highlighter import ReprHighlighter + from rich.panel import Panel + highlighter = ReprHighlighter() console = Console() - for align in ["left", "center", "right"]: - console.print(Align("Hello\nWorld!\nWorld!!!", align)) # type: ignore + panel = Panel( + Group( + Align.left(highlighter("align='left'")), + Align.center(highlighter("align='center'")), + Align.right(highlighter("align='right'")), + ), + width=60, + style="on dark_blue", + title="Algin", + ) + + console.print( + Align.center(panel, vertical="middle", style="on red", height=console.height) + ) diff --git a/rich/ansi.py b/rich/ansi.py index c2ec3581dd..d4c32cef1e 100644 --- a/rich/ansi.py +++ b/rich/ansi.py @@ -1,21 +1,27 @@ -from contextlib import suppress import re -from typing import Iterable, NamedTuple +import sys +from contextlib import suppress +from typing import Iterable, NamedTuple, Optional from .color import Color from .style import Style from .text import Text -re_ansi = re.compile(r"(?:\x1b\[(.*?)m)|(?:\x1b\](.*?)\x1b\\)") -re_csi = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])") +re_ansi = re.compile( + r""" +(?:\x1b\](.*?)\x1b\\)| +(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) +""", + re.VERBOSE, +) class _AnsiToken(NamedTuple): """Result of ansi tokenized string.""" plain: str = "" - sgr: str = "" - osc: str = "" + sgr: Optional[str] = "" + osc: Optional[str] = "" def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: @@ -28,20 +34,22 @@ def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: AnsiToken: A named tuple of (plain, sgr, osc) """ - def remove_csi(ansi_text: str) -> str: - """Remove unknown CSI sequences.""" - return re_csi.sub("", ansi_text) - position = 0 + sgr: Optional[str] + osc: Optional[str] for match in re_ansi.finditer(ansi_text): start, end = match.span(0) - sgr, osc = match.groups() + osc, sgr = match.groups() if start > position: - yield _AnsiToken(remove_csi(ansi_text[position:start])) - yield _AnsiToken("", sgr, osc) + yield _AnsiToken(ansi_text[position:start]) + if sgr: + if sgr.endswith("m"): + yield _AnsiToken("", sgr[1:-1], osc) + else: + yield _AnsiToken("", sgr, osc) position = end if position < len(ansi_text): - yield _AnsiToken(remove_csi(ansi_text[position:])) + yield _AnsiToken(ansi_text[position:]) SGR_STYLE_MAP = { @@ -117,7 +125,6 @@ def decode(self, terminal_text: str) -> Iterable[Text]: Args: lines (Iterable[str]): An iterable of lines of terminal output. - Yields: Text: Marked up Text. """ @@ -139,20 +146,21 @@ def decode_line(self, line: str) -> Text: text = Text() append = text.append line = line.rsplit("\r", 1)[-1] - for token in _ansi_tokenize(line): - plain_text, sgr, osc = token + for plain_text, sgr, osc in _ansi_tokenize(line): if plain_text: append(plain_text, self.style or None) - elif osc: + elif osc is not None: if osc.startswith("8;"): _params, semicolon, link = osc[2:].partition(";") if semicolon: self.style = self.style.update_link(link or None) - elif sgr: + elif sgr is not None: # Translate in to semi-colon separated codes # Ignore invalid codes, because we want to be lenient codes = [ - min(255, int(_code)) for _code in sgr.split(";") if _code.isdigit() + min(255, int(_code) if _code else 0) + for _code in sgr.split(";") + if _code.isdigit() or _code == "" ] iter_codes = iter(codes) for code in iter_codes: @@ -199,17 +207,17 @@ def decode_line(self, line: str) -> Text: return text -if __name__ == "__main__": # pragma: no cover - import pty +if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover import io import os + import pty import sys decoder = AnsiDecoder() stdout = io.BytesIO() - def read(fd): + def read(fd: int) -> bytes: data = os.read(fd, 1024) stdout.write(data) return data diff --git a/rich/bar.py b/rich/bar.py index 637b75cc18..ed86a552d1 100644 --- a/rich/bar.py +++ b/rich/bar.py @@ -32,7 +32,7 @@ def __init__( begin: float, end: float, *, - width: int = None, + width: Optional[int] = None, color: Union[Color, str] = "default", bgcolor: Union[Color, str] = "default", ): @@ -49,7 +49,10 @@ def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: - width = min(self.width or options.max_width, options.max_width) + width = min( + self.width if self.width is not None else options.max_width, + options.max_width, + ) if self.begin >= self.end: yield Segment(" " * width, self.style) @@ -81,9 +84,11 @@ def __rich_console__( yield Segment(prefix + body[len(prefix) :] + suffix, self.style) yield Segment.line() - def __rich_measure__(self, console: Console, max_width: int) -> Measurement: + def __rich_measure__( + self, console: Console, options: ConsoleOptions + ) -> Measurement: return ( Measurement(self.width, self.width) if self.width is not None - else Measurement(4, max_width) + else Measurement(4, options.max_width) ) diff --git a/rich/box.py b/rich/box.py index b70b5c2cdc..d37c6c81c0 100644 --- a/rich/box.py +++ b/rich/box.py @@ -1,6 +1,11 @@ +import sys from typing import TYPE_CHECKING, Iterable, List -from typing_extensions import Literal +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal # pragma: no cover + from ._loop import loop_last @@ -430,7 +435,7 @@ def get_bottom(self, widths: Iterable[int]) -> str: from rich.columns import Columns from rich.panel import Panel - from . import box + from . import box as box from .console import Console from .table import Table from .text import Text diff --git a/rich/cells.py b/rich/cells.py index 1a0ebccec4..d7adf5a046 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -1,9 +1,13 @@ +import re from functools import lru_cache from typing import Dict, List from ._cell_widths import CELL_WIDTHS from ._lru_cache import LRUCache +# Regex to match sequence of the most common character ranges +_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match + def cell_len(text: str, _cache: Dict[str, int] = LRUCache(1024 * 4)) -> int: """Get the number of cells required to display text. @@ -12,7 +16,7 @@ def cell_len(text: str, _cache: Dict[str, int] = LRUCache(1024 * 4)) -> int: text (str): Text to display. Returns: - int: Number of cells required to display the text. + int: Get the number of cells required to display text. """ cached_result = _cache.get(text, None) if cached_result is not None: @@ -20,11 +24,12 @@ def cell_len(text: str, _cache: Dict[str, int] = LRUCache(1024 * 4)) -> int: _get_size = get_character_cell_size total_size = sum(_get_size(character) for character in text) - if len(text) <= 64: + if len(text) <= 512: _cache[text] = total_size return total_size +@lru_cache(maxsize=4096) def get_character_cell_size(character: str) -> int: """Get the cell size of a character. @@ -34,12 +39,7 @@ def get_character_cell_size(character: str) -> int: Returns: int: Number of cells (0, 1 or 2) occupied by that character. """ - - codepoint = ord(character) - if 127 > codepoint > 31: - # Shortcut for ascii - return 1 - return _get_codepoint_cell_size(codepoint) + return _get_codepoint_cell_size(ord(character)) @lru_cache(maxsize=4096) @@ -73,37 +73,52 @@ def _get_codepoint_cell_size(codepoint: int) -> int: def set_cell_size(text: str, total: int) -> str: """Set the length of a string to fit within given number of cells.""" + + if _is_single_cell_widths(text): + size = len(text) + if size < total: + return text + " " * (total - size) + return text[:total] + + if not total: + return "" cell_size = cell_len(text) if cell_size == total: return text if cell_size < total: return text + " " * (total - cell_size) - _get_character_cell_size = get_character_cell_size - character_sizes = [_get_character_cell_size(character) for character in text] - excess = cell_size - total - pop = character_sizes.pop - while excess > 0 and character_sizes: - excess -= pop() - text = text[: len(character_sizes)] - if excess == -1: - text += " " - return text + start = 0 + end = len(text) + # Binary search until we find the right size + while True: + pos = (start + end) // 2 + before = text[: pos + 1] + before_len = cell_len(before) + if before_len == total + 1 and cell_len(before[-1]) == 2: + return before[:-1] + " " + if before_len == total: + return before + if before_len > total: + end = pos + else: + start = pos + +# TODO: This is inefficient +# TODO: This might not work with CWJ type characters def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: """Break text in to equal (cell) length strings.""" _get_character_cell_size = get_character_cell_size characters = [ (character, _get_character_cell_size(character)) for character in text - ][::-1] + ] total_size = position lines: List[List[str]] = [[]] append = lines[-1].append - pop = characters.pop - while characters: - character, size = pop() + for character, size in reversed(characters): if total_size + size > max_size: lines.append([character]) append = lines[-1].append @@ -111,6 +126,7 @@ def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: else: total_size += size append(character) + return ["".join(line) for line in lines] diff --git a/rich/color.py b/rich/color.py index 8110eb5c4d..6bca2da922 100644 --- a/rich/color.py +++ b/rich/color.py @@ -7,10 +7,12 @@ from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE from .color_triplet import ColorTriplet +from .repr import Result, rich_repr from .terminal_theme import DEFAULT_TERMINAL_THEME if TYPE_CHECKING: # pragma: no cover from .terminal_theme import TerminalTheme + from .text import Text WINDOWS = platform.system() == "Windows" @@ -24,6 +26,9 @@ class ColorSystem(IntEnum): TRUECOLOR = 3 WINDOWS = 4 + def __repr__(self) -> str: + return f"ColorSystem.{self.name}" + class ColorType(IntEnum): """Type of color stored in Color class.""" @@ -34,6 +39,9 @@ class ColorType(IntEnum): TRUECOLOR = 3 WINDOWS = 4 + def __repr__(self) -> str: + return f"ColorType.{self.name}" + ANSI_COLOR_NAMES = { "black": 0, @@ -53,6 +61,7 @@ class ColorType(IntEnum): "bright_cyan": 14, "bright_white": 15, "grey0": 16, + "gray0": 16, "navy_blue": 17, "dark_blue": 18, "blue3": 20, @@ -88,6 +97,7 @@ class ColorType(IntEnum): "blue_violet": 57, "orange4": 94, "grey37": 59, + "gray37": 59, "medium_purple4": 60, "slate_blue3": 62, "royal_blue1": 63, @@ -120,7 +130,9 @@ class ColorType(IntEnum): "yellow4": 106, "wheat4": 101, "grey53": 102, + "gray53": 102, "light_slate_grey": 103, + "light_slate_gray": 103, "medium_purple": 104, "light_slate_blue": 105, "dark_olive_green3": 149, @@ -147,11 +159,13 @@ class ColorType(IntEnum): "light_salmon3": 173, "rosy_brown": 138, "grey63": 139, + "gray63": 139, "medium_purple1": 141, "gold3": 178, "dark_khaki": 143, "navajo_white3": 144, "grey69": 145, + "gray69": 145, "light_steel_blue3": 146, "light_steel_blue": 147, "yellow3": 184, @@ -181,6 +195,7 @@ class ColorType(IntEnum): "light_goldenrod2": 222, "light_yellow3": 187, "grey84": 188, + "gray84": 188, "light_steel_blue1": 189, "yellow2": 190, "dark_olive_green1": 192, @@ -215,30 +230,55 @@ class ColorType(IntEnum): "wheat1": 229, "cornsilk1": 230, "grey100": 231, + "gray100": 231, "grey3": 232, + "gray3": 232, "grey7": 233, + "gray7": 233, "grey11": 234, + "gray11": 234, "grey15": 235, + "gray15": 235, "grey19": 236, + "gray19": 236, "grey23": 237, + "gray23": 237, "grey27": 238, + "gray27": 238, "grey30": 239, + "gray30": 239, "grey35": 240, + "gray35": 240, "grey39": 241, + "gray39": 241, "grey42": 242, + "gray42": 242, "grey46": 243, + "gray46": 243, "grey50": 244, + "gray50": 244, "grey54": 245, + "gray54": 245, "grey58": 246, + "gray58": 246, "grey62": 247, + "gray62": 247, "grey66": 248, + "gray66": 248, "grey70": 249, + "gray70": 249, "grey74": 250, + "gray74": 250, "grey78": 251, + "gray78": 251, "grey82": 252, + "gray82": 252, "grey85": 253, + "gray85": 253, "grey89": 254, + "gray89": 254, "grey93": 255, + "gray93": 255, } @@ -256,6 +296,7 @@ class ColorParseError(Exception): ) +@rich_repr class Color(NamedTuple): """Terminal color definition.""" @@ -268,16 +309,22 @@ class Color(NamedTuple): triplet: Optional[ColorTriplet] = None """A triplet of color components, if an RGB color.""" - def __str__(self) -> str: - """Render the color to the terminal.""" - attrs = self.get_ansi_codes(foreground=True) - return ( - f"\x1b[{';'.join(attrs)}m⬤ \x1b[0m" - f"" + def __rich__(self) -> "Text": + """Dispays the actual color if Rich printed.""" + from .style import Style + from .text import Text + + return Text.assemble( + f"", ) - def __repr__(self) -> str: - return f"" + def __rich_repr__(self) -> Result: + yield self.name + yield self.type + yield "number", self.number, None + yield "triplet", self.triplet, None @property def system(self) -> ColorSystem: @@ -297,7 +344,7 @@ def is_default(self) -> bool: return self.type == ColorType.DEFAULT def get_truecolor( - self, theme: "TerminalTheme" = None, foreground=True + self, theme: Optional["TerminalTheme"] = None, foreground: bool = True ) -> ColorTriplet: """Get an equivalent color triplet for this color. @@ -322,7 +369,7 @@ def get_truecolor( return theme.ansi_colors[self.number] elif self.type == ColorType.WINDOWS: assert self.number is not None - return STANDARD_PALETTE[self.number] + return WINDOWS_PALETTE[self.number] else: # self.type == ColorType.DEFAULT: assert self.number is None return theme.foreground_color if foreground else theme.background_color @@ -360,9 +407,9 @@ def from_rgb(cls, red: float, green: float, blue: float) -> "Color": """Create a truecolor from three color components in the range(0->255). Args: - red (float): Red component. - green (float): Green component. - blue (float): Blue component. + red (float): Red component in range 0-255. + green (float): Green component in range 0-255. + blue (float): Blue component in range 0-255. Returns: Color: A new color object. @@ -441,7 +488,8 @@ def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: elif _type == ColorType.WINDOWS: number = self.number assert number is not None - return (str(30 + number if foreground else 40 + number),) + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) elif _type == ColorType.STANDARD: number = self.number @@ -462,15 +510,13 @@ def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: def downgrade(self, system: ColorSystem) -> "Color": """Downgrade a color system to a system with fewer colors.""" - if self.type == ColorType.DEFAULT or self.type == system: + if self.type in [ColorType.DEFAULT, system]: return self # Convert to 8-bit color from truecolor color if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: assert self.triplet is not None - red, green, blue = self.triplet.normalized _h, l, s = rgb_to_hls(red, green, blue) - # If saturation is under 10% assume it is grayscale if s < 0.1: gray = round(l * 25.0) @@ -505,10 +551,8 @@ def downgrade(self, system: ColorSystem) -> "Color": triplet = self.triplet else: # self.system == ColorSystem.EIGHT_BIT assert self.number is not None - if self.number < 8: + if self.number < 16: return Color(self.name, ColorType.WINDOWS, number=self.number) - elif self.number < 16: - return Color(self.name, ColorType.WINDOWS, number=self.number - 8) triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) color_number = WINDOWS_PALETTE.match(triplet) @@ -545,7 +589,6 @@ def blend_rgb( from .console import Console from .table import Table from .text import Text - from . import box console = Console() @@ -558,11 +601,13 @@ def blend_rgb( colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) for color_number, name in colors: + if "grey" in name: + continue color_cell = Text(" " * 10, style=f"on {name}") if color_number < 16: table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) else: - color = EIGHT_BIT_PALETTE[color_number] + color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] table.add_row( color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb ) diff --git a/rich/color_triplet.py b/rich/color_triplet.py index 75c03d2aca..02cab32825 100644 --- a/rich/color_triplet.py +++ b/rich/color_triplet.py @@ -29,7 +29,7 @@ def rgb(self) -> str: @property def normalized(self) -> Tuple[float, float, float]: - """Covert components in to floats between 0 and 1. + """Convert components into floats between 0 and 1. Returns: Tuple[float, float, float]: A tuple of three normalized colour components. diff --git a/rich/columns.py b/rich/columns.py index 2807e78c15..669a3a7074 100644 --- a/rich/columns.py +++ b/rich/columns.py @@ -3,7 +3,7 @@ from operator import itemgetter from typing import Dict, Iterable, List, Optional, Tuple -from .align import Align, AlignValues +from .align import Align, AlignMethod from .console import Console, ConsoleOptions, RenderableType, RenderResult from .constrain import Constrain from .measure import Measurement @@ -30,16 +30,16 @@ class Columns(JupyterMixin): def __init__( self, - renderables: Iterable[RenderableType] = None, + renderables: Optional[Iterable[RenderableType]] = None, padding: PaddingDimensions = (0, 1), *, - width: int = None, + width: Optional[int] = None, expand: bool = False, equal: bool = False, column_first: bool = False, right_to_left: bool = False, - align: AlignValues = None, - title: TextType = None, + align: Optional[AlignMethod] = None, + title: Optional[TextType] = None, ) -> None: self.renderables = list(renderables or []) self.width = width @@ -48,7 +48,7 @@ def __init__( self.equal = equal self.column_first = column_first self.right_to_left = right_to_left - self.align = align + self.align: Optional[AlignMethod] = align self.title = title def add_renderable(self, renderable: RenderableType) -> None: @@ -77,7 +77,7 @@ def __rich_console__( get_measurement = Measurement.get renderable_widths = [ - get_measurement(console, renderable, max_width).maximum + get_measurement(console, options, renderable).maximum for renderable in renderables ] if self.equal: @@ -176,8 +176,6 @@ def iter_renderables( console = Console() - from rich.panel import Panel - files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] columns = Columns(files, padding=(0, 1), expand=False, equal=False) console.print(columns) diff --git a/rich/console.py b/rich/console.py index 59ceacd639..2159d3c175 100644 --- a/rich/console.py +++ b/rich/console.py @@ -1,16 +1,21 @@ import inspect +import io import os import platform -import shutil import sys import threading +import zlib from abc import ABC, abstractmethod -from collections import abc -from dataclasses import dataclass, field, replace +from dataclasses import dataclass, field from datetime import datetime from functools import wraps from getpass import getpass +from html import escape +from inspect import isclass +from itertools import islice +from math import ceil from time import monotonic +from types import FrameType, ModuleType, TracebackType from typing import ( IO, TYPE_CHECKING, @@ -19,35 +24,53 @@ Dict, Iterable, List, + Mapping, NamedTuple, Optional, TextIO, + Tuple, + Type, Union, cast, ) -from typing_extensions import Literal, Protocol, runtime_checkable +if sys.version_info >= (3, 8): + from typing import Literal, Protocol, runtime_checkable +else: + from typing_extensions import ( + Literal, + Protocol, + runtime_checkable, + ) # pragma: no cover from . import errors, themes from ._emoji_replace import _emoji_replace -from ._log_render import LogRender -from .align import Align, AlignValues -from .color import ColorSystem +from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT +from ._log_render import FormatTimeCallable, LogRender +from .align import Align, AlignMethod +from .color import ColorSystem, blend_rgb from .control import Control +from .emoji import EmojiVariant from .highlighter import NullHighlighter, ReprHighlighter from .markup import render as render_markup from .measure import Measurement, measure_renderables from .pager import Pager, SystemPager -from .pretty import Pretty +from .pretty import Pretty, is_expandable +from .protocol import rich_cast +from .region import Region from .scope import render_scope +from .screen import Screen from .segment import Segment -from .style import Style -from .terminal_theme import DEFAULT_TERMINAL_THEME, TerminalTheme +from .style import Style, StyleType +from .styled import Styled +from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme from .text import Text, TextType from .theme import Theme, ThemeStack if TYPE_CHECKING: from ._windows import WindowsConsoleFeatures + from .live import Live + from .status import Status WINDOWS = platform.system() == "Windows" @@ -56,34 +79,47 @@ OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] -CONSOLE_HTML_FORMAT = """\ - - - - - - - - -
{code}
-
- - -""" +class NoChange: + pass + + +NO_CHANGE = NoChange() + +try: + _STDIN_FILENO = sys.__stdin__.fileno() +except Exception: + _STDIN_FILENO = 0 +try: + _STDOUT_FILENO = sys.__stdout__.fileno() +except Exception: + _STDOUT_FILENO = 1 +try: + _STDERR_FILENO = sys.__stderr__.fileno() +except Exception: + _STDERR_FILENO = 2 + +_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) +_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) + _TERM_COLORS = {"256color": ColorSystem.EIGHT_BIT, "16color": ColorSystem.STANDARD} +class ConsoleDimensions(NamedTuple): + """Size of the terminal.""" + + width: int + """The width of the console in 'cells'.""" + height: int + """The height of the console in lines.""" + + @dataclass class ConsoleOptions: """Options for __rich_console__ method.""" + size: ConsoleDimensions + """Size of console.""" legacy_windows: bool """legacy_windows: flag for legacy windows.""" min_width: int @@ -94,41 +130,121 @@ class ConsoleOptions: """True if the target is a terminal, otherwise False.""" encoding: str """Encoding of terminal.""" + max_height: int + """Height of container (starts as terminal)""" justify: Optional[JustifyMethod] = None """Justify value override for renderable.""" overflow: Optional[OverflowMethod] = None """Overflow value override for renderable.""" no_wrap: Optional[bool] = False - """"Disable wrapping for text.""" + """Disable wrapping for text.""" + highlight: Optional[bool] = None + """Highlight override for render_str.""" + markup: Optional[bool] = None + """Enable markup when rendering strings.""" + height: Optional[int] = None @property def ascii_only(self) -> bool: """Check if renderables should use ascii only.""" return not self.encoding.startswith("utf") + def copy(self) -> "ConsoleOptions": + """Return a copy of the options. + + Returns: + ConsoleOptions: a copy of self. + """ + options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) + options.__dict__ = self.__dict__.copy() + return options + def update( self, - width: int = None, - min_width: int = None, - max_width: int = None, - justify: JustifyMethod = None, - overflow: OverflowMethod = None, - no_wrap: bool = None, + *, + width: Union[int, NoChange] = NO_CHANGE, + min_width: Union[int, NoChange] = NO_CHANGE, + max_width: Union[int, NoChange] = NO_CHANGE, + justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, + overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, + no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, + highlight: Union[Optional[bool], NoChange] = NO_CHANGE, + markup: Union[Optional[bool], NoChange] = NO_CHANGE, + height: Union[Optional[int], NoChange] = NO_CHANGE, ) -> "ConsoleOptions": """Update values, return a copy.""" - options = replace(self) - if width is not None: - options.min_width = options.max_width = width - if min_width is not None: + options = self.copy() + if not isinstance(width, NoChange): + options.min_width = options.max_width = max(0, width) + if not isinstance(min_width, NoChange): options.min_width = min_width - if max_width is not None: + if not isinstance(max_width, NoChange): options.max_width = max_width - if justify is not None: + if not isinstance(justify, NoChange): options.justify = justify - if overflow is not None: + if not isinstance(overflow, NoChange): options.overflow = overflow - if no_wrap is not None: + if not isinstance(no_wrap, NoChange): options.no_wrap = no_wrap + if not isinstance(highlight, NoChange): + options.highlight = highlight + if not isinstance(markup, NoChange): + options.markup = markup + if not isinstance(height, NoChange): + if height is not None: + options.max_height = height + options.height = None if height is None else max(0, height) + return options + + def update_width(self, width: int) -> "ConsoleOptions": + """Update just the width, return a copy. + + Args: + width (int): New width (sets both min_width and max_width) + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + return options + + def update_height(self, height: int) -> "ConsoleOptions": + """Update the height, and return a copy. + + Args: + height (int): New height + + Returns: + ~ConsoleOptions: New Console options instance. + """ + options = self.copy() + options.max_height = options.height = height + return options + + def reset_height(self) -> "ConsoleOptions": + """Return a copy of the options with height set to ``None``. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.height = None + return options + + def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": + """Update the width and height, and return a copy. + + Args: + width (int): New width (sets both min_width and max_width). + height (int): New height. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + options.height = options.max_height = height return options @@ -136,7 +252,9 @@ def update( class RichCast(Protocol): """An object that may be 'cast' to a console renderable.""" - def __rich__(self) -> Union["ConsoleRenderable", str]: # pragma: no cover + def __rich__( + self, + ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover ... @@ -150,12 +268,11 @@ def __rich_console__( ... +# A type that may be rendered by Console. RenderableType = Union[ConsoleRenderable, RichCast, str] -"""A type that may be rendered by Console.""" +# The result of calling a __rich_console__ method. RenderResult = Iterable[Union[RenderableType, Segment]] -"""The result of calling a __rich_console__ method.""" - _null_highlighter = NullHighlighter() @@ -164,6 +281,36 @@ class CaptureError(Exception): """An error in the Capture context manager.""" +class NewLine: + """A renderable to generate new line(s)""" + + def __init__(self, count: int = 1) -> None: + self.count = count + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> Iterable[Segment]: + yield Segment("\n" * self.count) + + +class ScreenUpdate: + """Render a list of lines at a given offset.""" + + def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: + self._lines = lines + self.x = x + self.y = y + + def __rich_console__( + self, console: "Console", options: ConsoleOptions + ) -> RenderResult: + x = self.x + move_to = Control.move_to + for offset, line in enumerate(self._lines, self.y): + yield move_to(x, offset) + yield from line + + class Capture: """Context manager to capture the result of printing to the console. See :meth:`~rich.console.Console.capture` for how to use. @@ -180,7 +327,12 @@ def __enter__(self) -> "Capture": self._console.begin_capture() return self - def __exit__(self, exc_type, exc_val, exc_tb) -> None: + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: self._result = self._console.end_capture() def get(self) -> str: @@ -193,7 +345,7 @@ def get(self) -> str: class ThemeContext: - """A context manager to use a temporary theme. See :meth:`~rich.console.Console.theme` for usage.""" + """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: self.console = console @@ -204,7 +356,12 @@ def __enter__(self) -> "ThemeContext": self.console.push_theme(self.theme) return self - def __exit__(self, exc_type, exc_val, exc_tb) -> None: + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: self.console.pop_theme() @@ -214,7 +371,7 @@ class PagerContext: def __init__( self, console: "Console", - pager: Pager = None, + pager: Optional[Pager] = None, styles: bool = False, links: bool = False, ) -> None: @@ -227,7 +384,12 @@ def __enter__(self) -> "PagerContext": self._console._enter_buffer() return self - def __exit__(self, exc_type, exc_val, exc_tb) -> None: + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: if exc_type is None: with self._console._lock: buffer: List[Segment] = self._console._buffer[:] @@ -242,7 +404,54 @@ def __exit__(self, exc_type, exc_val, exc_tb) -> None: self._console._exit_buffer() -class RenderGroup: +class ScreenContext: + """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" + + def __init__( + self, console: "Console", hide_cursor: bool, style: StyleType = "" + ) -> None: + self.console = console + self.hide_cursor = hide_cursor + self.screen = Screen(style=style) + self._changed = False + + def update( + self, *renderables: RenderableType, style: Optional[StyleType] = None + ) -> None: + """Update the screen. + + Args: + renderable (RenderableType, optional): Optional renderable to replace current renderable, + or None for no change. Defaults to None. + style: (Style, optional): Replacement style, or None for no change. Defaults to None. + """ + if renderables: + self.screen.renderable = ( + Group(*renderables) if len(renderables) > 1 else renderables[0] + ) + if style is not None: + self.screen.style = style + self.console.print(self.screen, end="") + + def __enter__(self) -> "ScreenContext": + self._changed = self.console.set_alt_screen(True) + if self._changed and self.hide_cursor: + self.console.show_cursor(False) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if self._changed: + self.console.set_alt_screen(False) + if self.hide_cursor: + self.console.show_cursor(True) + + +class Group: """Takes a group of renderables and returns a renderable object that renders the group. Args: @@ -261,11 +470,13 @@ def renderables(self) -> List["RenderableType"]: self._render = list(self._renderables) return self._render - def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": if self.fit: - return measure_renderables(console, self.renderables, max_width) + return measure_renderables(console, options, self.renderables) else: - return Measurement(max_width, max_width) + return Measurement(options.max_width, options.max_width) def __rich_console__( self, console: "Console", options: "ConsoleOptions" @@ -273,43 +484,37 @@ def __rich_console__( yield from self.renderables -def render_group(fit: bool = True) -> Callable: +def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: """A decorator that turns an iterable of renderables in to a group. Args: fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. """ - def decorator(method): - """Convert a method that returns an iterable of renderables in to a RenderGroup.""" + def decorator( + method: Callable[..., Iterable[RenderableType]] + ) -> Callable[..., Group]: + """Convert a method that returns an iterable of renderables in to a Group.""" @wraps(method) - def _replace(*args, **kwargs): + def _replace(*args: Any, **kwargs: Any) -> Group: renderables = method(*args, **kwargs) - return RenderGroup(*renderables, fit=fit) + return Group(*renderables, fit=fit) return _replace return decorator -class ConsoleDimensions(NamedTuple): - """Size of the terminal.""" - - width: int - """The width of the console in 'cells'.""" - height: int - """The height of the console in lines.""" - - def _is_jupyter() -> bool: # pragma: no cover """Check if we're running in a Jupyter notebook.""" try: - get_ipython # type: ignore + get_ipython # type: ignore[name-defined] except NameError: return False - shell = get_ipython().__class__.__name__ # type: ignore - if shell == "ZMQInteractiveShell": + ipython = get_ipython() # type: ignore[name-defined] + shell = ipython.__class__.__name__ + if "google.colab" in str(ipython.__class__) or shell == "ZMQInteractiveShell": return True # Jupyter notebook or qtconsole elif shell == "TerminalInteractiveShell": return False # Terminal running IPython @@ -324,7 +529,6 @@ def _is_jupyter() -> bool: # pragma: no cover "windows": ColorSystem.WINDOWS, } - _COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} @@ -374,12 +578,6 @@ def detect_legacy_windows() -> bool: return WINDOWS and not get_windows_console_features().vt -if detect_legacy_windows(): # pragma: no cover - from colorama import init - - init() - - class Console: """A high level console interface. @@ -388,18 +586,26 @@ class Console: either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. + force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. + soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. theme (Theme, optional): An optional style theme object, or ``None`` for default theme. + stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. file (IO, optional): A file object where the console should write to. Defaults to stdout. + quiet (bool, Optional): Boolean to suppress all output. Defaults to False. width (int, optional): The width of the terminal. Leave as default to auto-detect width. height (int, optional): The height of the terminal. Leave as default to auto-detect height. + style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. + no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. + tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. record (bool, optional): Boolean to enable recording of terminal output, - required to call :meth:`export_html` and :meth:`export_text`. Defaults to False. + required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. emoji (bool, optional): Enable emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. highlight (bool, optional): Enable automatic highlighting. Defaults to True. log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. - log_time_format (str, optional): Log time format if ``log_time`` is enabled. Defaults to "[%X] ". + log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". highlighter (HighlighterType, optional): Default highlighter. legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. safe_box (bool, optional): Restrict box options that don't render on legacy Windows. @@ -408,56 +614,83 @@ class Console: get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. """ + _environ: Mapping[str, str] = os.environ + def __init__( self, *, color_system: Optional[ Literal["auto", "standard", "256", "truecolor", "windows"] ] = "auto", - force_terminal: bool = None, - force_jupyter: bool = None, - theme: Theme = None, - file: IO[str] = None, - width: int = None, - height: int = None, + force_terminal: Optional[bool] = None, + force_jupyter: Optional[bool] = None, + force_interactive: Optional[bool] = None, + soft_wrap: bool = False, + theme: Optional[Theme] = None, + stderr: bool = False, + file: Optional[IO[str]] = None, + quiet: bool = False, + width: Optional[int] = None, + height: Optional[int] = None, + style: Optional[StyleType] = None, + no_color: Optional[bool] = None, tab_size: int = 8, record: bool = False, markup: bool = True, emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, highlight: bool = True, log_time: bool = True, log_path: bool = True, - log_time_format: str = "[%X]", + log_time_format: Union[str, FormatTimeCallable] = "[%X]", highlighter: Optional["HighlighterType"] = ReprHighlighter(), - legacy_windows: bool = None, + legacy_windows: Optional[bool] = None, safe_box: bool = True, - get_datetime: Callable[[], datetime] = None, - get_time: Callable[[], float] = None, - _environ: Dict[str, str] = None, + get_datetime: Optional[Callable[[], datetime]] = None, + get_time: Optional[Callable[[], float]] = None, + _environ: Optional[Mapping[str, str]] = None, ): # Copy of os.environ allows us to replace it for testing - self._environ = os.environ if _environ is None else _environ + if _environ is not None: + self._environ = _environ self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter if self.is_jupyter: width = width or 93 height = height or 100 + + self.soft_wrap = soft_wrap self._width = width self._height = height self.tab_size = tab_size self.record = record self._markup = markup self._emoji = emoji + self._emoji_variant: Optional[EmojiVariant] = emoji_variant self._highlight = highlight self.legacy_windows: bool = ( (detect_legacy_windows() and not self.is_jupyter) if legacy_windows is None else legacy_windows ) + if width is None: + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) - self.legacy_windows + if height is None: + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + self.soft_wrap = soft_wrap + self._width = width + self._height = height self._color_system: Optional[ColorSystem] self._force_terminal = force_terminal - self.file = file or sys.stdout + self._file = file + self.quiet = quiet + self.stderr = stderr if color_system is None: self._color_system = None @@ -476,6 +709,15 @@ def __init__( self.safe_box = safe_box self.get_datetime = get_datetime or datetime.now self.get_time = get_time or monotonic + self.style = style + self.no_color = ( + no_color if no_color is not None else "NO_COLOR" in self._environ + ) + self.is_interactive = ( + (self.is_terminal and not self.is_dumb_terminal) + if force_interactive is None + else force_interactive + ) self._record_buffer_lock = threading.RLock() self._thread_locals = ConsoleThreadLocals( @@ -483,10 +725,24 @@ def __init__( ) self._record_buffer: List[Segment] = [] self._render_hooks: List[RenderHook] = [] + self._live: Optional["Live"] = None + self._is_alt_screen = False def __repr__(self) -> str: return f"" + @property + def file(self) -> IO[str]: + """Get the file object to write to.""" + file = self._file or (sys.stderr if self.stderr else sys.stdout) + file = getattr(file, "rich_proxied_file", file) + return file + + @file.setter + def file(self, new_file: IO[str]) -> None: + """Set a new file object.""" + self._file = new_file + @property def _buffer(self) -> List[Segment]: """Get a thread local buffer.""" @@ -510,7 +766,7 @@ def _detect_color_system(self) -> Optional[ColorSystem]: """Detect color system from env vars.""" if self.is_jupyter: return ColorSystem.TRUECOLOR - if not self.is_terminal or "NO_COLOR" in self._environ or self.is_dumb_terminal: + if not self.is_terminal or self.is_dumb_terminal: return None if WINDOWS: # pragma: no cover if self.legacy_windows: # pragma: no cover @@ -526,7 +782,7 @@ def _detect_color_system(self) -> Optional[ColorSystem]: if color_term in ("truecolor", "24bit"): return ColorSystem.TRUECOLOR term = self._environ.get("TERM", "").strip().lower() - _term_name, _hyphen, colors = term.partition("-") + _term_name, _hyphen, colors = term.rpartition("-") color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) return color_system @@ -539,25 +795,45 @@ def _exit_buffer(self) -> None: self._buffer_index -= 1 self._check_buffer() + def set_live(self, live: "Live") -> None: + """Set Live instance. Used by Live context manager. + + Args: + live (Live): Live instance using this Console. + + Raises: + errors.LiveError: If this Console has a Live context currently active. + """ + with self._lock: + if self._live is not None: + raise errors.LiveError("Only one live display may be active at once") + self._live = live + + def clear_live(self) -> None: + """Clear the Live instance.""" + with self._lock: + self._live = None + def push_render_hook(self, hook: RenderHook) -> None: """Add a new render hook to the stack. Args: hook (RenderHook): Render hook instance. """ - - self._render_hooks.append(hook) + with self._lock: + self._render_hooks.append(hook) def pop_render_hook(self) -> None: """Pop the last renderhook from the stack.""" - self._render_hooks.pop() + with self._lock: + self._render_hooks.pop() def __enter__(self) -> "Console": """Own context manager to enter buffer context.""" self._enter_buffer() return self - def __exit__(self, exc_type, exc_value, traceback) -> None: + def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: """Exit buffer context.""" self._exit_buffer() @@ -635,8 +911,21 @@ def is_terminal(self) -> bool: """ if self._force_terminal is not None: return self._force_terminal - isatty = getattr(self.file, "isatty", None) - return False if isatty is None else isatty() + + if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( + "idlelib" + ): + # Return False for Idle which claims to be a tty but can't handle ansi codes + return False + + isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) + try: + return False if isatty is None else isatty() + except ValueError: + # in some situation (at the end of a pytest run for example) isatty() can raise + # ValueError: I/O operation on closed file + # return False because we aren't in a terminal anymore + return False @property def is_dumb_terminal(self) -> bool: @@ -654,6 +943,8 @@ def is_dumb_terminal(self) -> bool: def options(self) -> ConsoleOptions: """Get default console options.""" return ConsoleOptions( + max_height=self.size.height, + size=self.size, legacy_windows=self.legacy_windows, min_width=1, max_width=self.width, @@ -670,20 +961,54 @@ def size(self) -> ConsoleDimensions: """ if self._width is not None and self._height is not None: - return ConsoleDimensions(self._width, self._height) + return ConsoleDimensions(self._width - self.legacy_windows, self._height) if self.is_dumb_terminal: return ConsoleDimensions(80, 25) - width, height = shutil.get_terminal_size() + width: Optional[int] = None + height: Optional[int] = None + + if WINDOWS: # pragma: no cover + try: + width, height = os.get_terminal_size() + except (AttributeError, ValueError, OSError): # Probably not a terminal + pass + else: + for file_descriptor in _STD_STREAMS: + try: + width, height = os.get_terminal_size(file_descriptor) + except (AttributeError, ValueError, OSError): + pass + else: + break + + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + # get_terminal_size can report 0, 0 if run from pseudo-terminal width = width or 80 height = height or 25 return ConsoleDimensions( - (width - self.legacy_windows) if self._width is None else self._width, + width - self.legacy_windows if self._width is None else self._width, height if self._height is None else self._height, ) + @size.setter + def size(self, new_size: Tuple[int, int]) -> None: + """Set a new size for the terminal. + + Args: + new_size (Tuple[int, int]): New width and height. + """ + width, height = new_size + self._width = width + self._height = height + @property def width(self) -> int: """Get the width of the console. @@ -691,12 +1016,38 @@ def width(self) -> int: Returns: int: The width (in characters) of the console. """ - width, _ = self.size - return width + return self.size.width + + @width.setter + def width(self, width: int) -> None: + """Set width. + + Args: + width (int): New width. + """ + self._width = width + + @property + def height(self) -> int: + """Get the height of the console. + + Returns: + int: The height (in lines) of the console. + """ + return self.size.height + + @height.setter + def height(self, height: int) -> None: + """Set height. + + Args: + height (int): new height. + """ + self._height = height def bell(self) -> None: """Play a 'bell' sound (if supported by the terminal).""" - self.control("\x07") + self.control(Control.bell()) def capture(self) -> Capture: """A context manager to *capture* the result of print() or log() in a string, @@ -716,13 +1067,13 @@ def capture(self) -> Capture: return capture def pager( - self, pager: Pager = None, styles: bool = False, links: bool = False + self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False ) -> PagerContext: """A context manager to display anything printed within a "pager". The pager application is defined by the system and will typically support at least pressing a key to scroll. Args: - pager (Pager, optional): A pager object, or None to use :class:~rich.pager.SystemPager`. Defaults to None. + pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. styles (bool, optional): Show styles in pager. Defaults to False. links (bool, optional): Show links in pager. Defaults to False. @@ -746,9 +1097,7 @@ def line(self, count: int = 1) -> None: """ assert count >= 0, "count must be >= 0" - if count: - self._buffer.append(Segment("\n" * count)) - self._check_buffer() + self.print(NewLine(count)) def clear(self, home: bool = True) -> None: """Clear the screen. @@ -756,19 +1105,150 @@ def clear(self, home: bool = True) -> None: Args: home (bool, optional): Also move the cursor to 'home' position. Defaults to True. """ - self.control("\033[2J\033[H" if home else "\033[2J") + if home: + self.control(Control.clear(), Control.home()) + else: + self.control(Control.clear()) + + def status( + self, + status: RenderableType, + *, + spinner: str = "dots", + spinner_style: str = "status.spinner", + speed: float = 1.0, + refresh_per_second: float = 12.5, + ) -> "Status": + """Display a status and spinner. + + Args: + status (RenderableType): A status renderable (str or Text typically). + spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". + spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". + speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. + refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. + + Returns: + Status: A Status object that may be used as a context manager. + """ + from .status import Status + + status_renderable = Status( + status, + console=self, + spinner=spinner, + spinner_style=spinner_style, + speed=speed, + refresh_per_second=refresh_per_second, + ) + return status_renderable - def show_cursor(self, show: bool = True) -> None: + def show_cursor(self, show: bool = True) -> bool: """Show or hide the cursor. Args: show (bool, optional): Set visibility of the cursor. """ + if self.is_terminal: + self.control(Control.show_cursor(show)) + return True + return False + + def set_alt_screen(self, enable: bool = True) -> bool: + """Enables alternative screen mode. + + Note, if you enable this mode, you should ensure that is disabled before + the application exits. See :meth:`~rich.Console.screen` for a context manager + that handles this for you. + + Args: + enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. + + Returns: + bool: True if the control codes were written. + + """ + changed = False if self.is_terminal and not self.legacy_windows: - self.control("\033[?25h" if show else "\033[?25l") + self.control(Control.alt_screen(enable)) + changed = True + self._is_alt_screen = enable + return changed + + @property + def is_alt_screen(self) -> bool: + """Check if the alt screen was enabled. + + Returns: + bool: True if the alt screen was enabled, otherwise False. + """ + return self._is_alt_screen + + def set_window_title(self, title: str) -> bool: + """Set the title of the console terminal window. + + Warning: There is no means within Rich of "resetting" the window title to its + previous value, meaning the title you set will persist even after your application + exits. + + ``fish`` shell resets the window title before and after each command by default, + negating this issue. Windows Terminal and command prompt will also reset the title for you. + Most other shells and terminals, however, do not do this. + + Some terminals may require configuration changes before you can set the title. + Some terminals may not support setting the title at all. + + Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) + may also set the terminal window title. This could result in whatever value you write + using this method being overwritten. + + Args: + title (str): The new title of the terminal window. + + Returns: + bool: True if the control code to change the terminal title was + written, otherwise False. Note that a return value of True + does not guarantee that the window title has actually changed, + since the feature may be unsupported/disabled in some terminals. + """ + if self.is_terminal: + self.control(Control.title(title)) + return True + return False + + def screen( + self, hide_cursor: bool = True, style: Optional[StyleType] = None + ) -> "ScreenContext": + """Context manager to enable and disable 'alternative screen' mode. + + Args: + hide_cursor (bool, optional): Also hide the cursor. Defaults to False. + style (Style, optional): Optional style for screen. Defaults to None. + + Returns: + ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. + """ + return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") + + def measure( + self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None + ) -> Measurement: + """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains + information regarding the number of characters required to print the renderable. + + Args: + renderable (RenderableType): Any renderable or string. + options (Optional[ConsoleOptions], optional): Options to use when measuring, or None + to use default options. Defaults to None. + + Returns: + Measurement: A measurement of the renderable. + """ + measurement = Measurement.get(self, options or self.options, renderable) + return measurement def render( - self, renderable: RenderableType, options: ConsoleOptions = None + self, renderable: RenderableType, options: Optional[ConsoleOptions] = None ) -> Iterable[Segment]: """Render an object in to an iterable of `Segment` instances. @@ -789,13 +1269,15 @@ def render( # No space to render anything. This prevents potential recursion errors. return render_iterable: RenderResult - if isinstance(renderable, RichCast): - renderable = renderable.__rich__() - if isinstance(renderable, ConsoleRenderable): - render_iterable = renderable.__rich_console__(self, _options) + + renderable = rich_cast(renderable) + if hasattr(renderable, "__rich_console__") and not isclass(renderable): + render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] elif isinstance(renderable, str): - yield from self.render(self.render_str(renderable), _options) - return + text_renderable = self.render_str( + renderable, highlight=_options.highlight, markup=_options.markup + ) + render_iterable = text_renderable.__rich_console__(self, _options) else: raise errors.NotRenderableError( f"Unable to render {renderable!r}; " @@ -808,8 +1290,10 @@ def render( raise errors.NotRenderableError( f"object {render_iterable!r} is not renderable" ) + _Segment = Segment + _options = _options.reset_height() for render_output in iter_render: - if isinstance(render_output, Segment): + if isinstance(render_output, _Segment): yield render_output else: yield from self.render(render_output, _options) @@ -821,6 +1305,7 @@ def render_lines( *, style: Optional[Style] = None, pad: bool = True, + new_lines: bool = False, ) -> List[List[Segment]]: """Render objects in to a list of lines. @@ -832,33 +1317,58 @@ def render_lines( options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. + new_lines (bool, optional): Include "\n" characters at end of lines. Returns: List[List[Segment]]: A list of lines, where a line is a list of Segment objects. """ - render_options = options or self.options - _rendered = self.render(renderable, render_options) - if style is not None: - _rendered = Segment.apply_style(_rendered, style) - lines = list( - Segment.split_and_crop_lines( - _rendered, render_options.max_width, include_new_lines=False, pad=pad + with self._lock: + render_options = options or self.options + _rendered = self.render(renderable, render_options) + if style: + _rendered = Segment.apply_style(_rendered, style) + + render_height = render_options.height + if render_height is not None: + render_height = max(0, render_height) + + lines = list( + islice( + Segment.split_and_crop_lines( + _rendered, + render_options.max_width, + include_new_lines=new_lines, + pad=pad, + ), + None, + render_height, + ) ) - ) - return lines + if render_options.height is not None: + extra_lines = render_options.height - len(lines) + if extra_lines > 0: + pad_line = [ + [Segment(" " * render_options.max_width, style), Segment("\n")] + if new_lines + else [Segment(" " * render_options.max_width, style)] + ] + lines.extend(pad_line * extra_lines) + + return lines def render_str( self, text: str, *, style: Union[str, Style] = "", - justify: JustifyMethod = None, - overflow: OverflowMethod = None, - emoji: bool = None, - markup: bool = None, - highlighter: HighlighterType = None, + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + highlighter: Optional[HighlighterType] = None, ) -> "Text": - """Convert a string to a Text instance. This is is called automatically if + """Convert a string to a Text instance. This is called automatically if you print or log a string. Args: @@ -868,6 +1378,7 @@ def render_str( overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. + highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. highlighter (HighlighterType, optional): Optional highlighter to apply. Returns: ConsoleRenderable: Renderable object. @@ -875,30 +1386,39 @@ def render_str( """ emoji_enabled = emoji or (emoji is None and self._emoji) markup_enabled = markup or (markup is None and self._markup) + highlight_enabled = highlight or (highlight is None and self._highlight) if markup_enabled: - rich_text = render_markup(text, style=style, emoji=emoji_enabled) + rich_text = render_markup( + text, + style=style, + emoji=emoji_enabled, + emoji_variant=self._emoji_variant, + ) rich_text.justify = justify rich_text.overflow = overflow else: rich_text = Text( - _emoji_replace(text) if emoji_enabled else text, + _emoji_replace(text, default_variant=self._emoji_variant) + if emoji_enabled + else text, justify=justify, overflow=overflow, style=style, ) - if highlighter is not None: - highlight_text = highlighter(str(rich_text)) + _highlighter = (highlighter or self.highlighter) if highlight_enabled else None + if _highlighter is not None: + highlight_text = _highlighter(str(rich_text)) highlight_text.copy_styles(rich_text) return highlight_text return rich_text def get_style( - self, name: Union[str, Style], *, default: Union[Style, str] = None + self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None ) -> Style: - """Get a Style instance by it's theme name or parse a definition. + """Get a Style instance by its theme name or parse a definition. Args: name (str): The name of a style or a style definition. @@ -921,7 +1441,9 @@ def get_style( except errors.StyleSyntaxError as error: if default is not None: return self.get_style(default) - raise errors.MissingStyle(f"Failed to get style {name!r}; {error}") + raise errors.MissingStyle( + f"Failed to get style {name!r}; {error}" + ) from None def _collect_renderables( self, @@ -929,17 +1451,17 @@ def _collect_renderables( sep: str, end: str, *, - justify: JustifyMethod = None, - emoji: bool = None, - markup: bool = None, - highlight: bool = None, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, ) -> List[ConsoleRenderable]: - """Combined a number of renderables and text in to one renderable. + """Combine a number of renderables and text into one renderable. Args: objects (Iterable[Any]): Anything that Rich can render. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\n". + sep (str): String to write between print data. + end (str): String to write at end of print data. justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. @@ -957,7 +1479,7 @@ def _collect_renderables( if justify in ("left", "center", "right"): def align_append(renderable: RenderableType) -> None: - _append(Align(renderable, cast(AlignValues, justify))) + _append(Align(renderable, cast(AlignMethod, justify))) append = align_append @@ -972,22 +1494,19 @@ def check_text() -> None: del text[:] for renderable in objects: - rich_cast = getattr(renderable, "__rich__", None) - if rich_cast: - renderable = rich_cast() + renderable = rich_cast(renderable) if isinstance(renderable, str): append_text( self.render_str( - renderable, - emoji=emoji, - markup=markup, - highlighter=_highlighter, + renderable, emoji=emoji, markup=markup, highlighter=_highlighter ) ) + elif isinstance(renderable, Text): + append_text(renderable) elif isinstance(renderable, ConsoleRenderable): check_text() append(renderable) - elif isinstance(renderable, (abc.Mapping, abc.Sequence, abc.Set)): + elif is_expandable(renderable): check_text() append(Pretty(renderable, highlighter=_highlighter)) else: @@ -995,6 +1514,10 @@ def check_text() -> None: check_text() + if self.style is not None: + style = self.get_style(self.style) + renderables = [Styled(renderable, style) for renderable in renderables] + return renderables def rule( @@ -1003,35 +1526,38 @@ def rule( *, characters: str = "─", style: Union[str, Style] = "rule.line", + align: AlignMethod = "center", ) -> None: """Draw a line with optional centered title. Args: title (str, optional): Text to render over the rule. Defaults to "". characters (str, optional): Character(s) to form the line. Defaults to "─". + style (str, optional): Style of line. Defaults to "rule.line". + align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". """ from .rule import Rule - rule = Rule(title=title, characters=characters, style=style) + rule = Rule(title=title, characters=characters, style=style, align=align) self.print(rule) - def control(self, control_codes: Union["Control", str]) -> None: + def control(self, *control: Control) -> None: """Insert non-printing control codes. Args: control_codes (str): Control codes, such as those that may move the cursor. """ if not self.is_dumb_terminal: - self._buffer.append(Segment.control(str(control_codes))) - self._check_buffer() + with self: + self._buffer.extend(_control.segment for _control in control) def out( self, *objects: Any, - sep=" ", - end="\n", - style: Union[str, Style] = None, - highlight: bool = True, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + highlight: Optional[bool] = None, ) -> None: """Output to the terminal. This is a low-level way of writing to the terminal which unlike :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will @@ -1039,7 +1565,7 @@ def out( Args: sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\n". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". style (Union[str, Style], optional): A style to apply to output. Defaults to None. highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. @@ -1060,25 +1586,27 @@ def out( def print( self, *objects: Any, - sep=" ", - end="\n", - style: Union[str, Style] = None, - justify: JustifyMethod = None, - overflow: OverflowMethod = None, - no_wrap: bool = None, - emoji: bool = None, - markup: bool = None, - highlight: bool = None, - width: int = None, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + no_wrap: Optional[bool] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + width: Optional[int] = None, + height: Optional[int] = None, crop: bool = True, - soft_wrap: bool = False, + soft_wrap: Optional[bool] = None, + new_line_start: bool = False, ) -> None: """Print to the console. Args: objects (positional args): Objects to log to the terminal. sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\n". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". style (Union[str, Style], optional): A style to apply to output. Defaults to None. justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. @@ -1088,19 +1616,22 @@ def print( highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. - soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping. Defaults to False. + soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for + Console default. Defaults to ``None``. + new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. """ if not objects: - self.line() - return + objects = (NewLine(),) + if soft_wrap is None: + soft_wrap = self.soft_wrap if soft_wrap: if no_wrap is None: no_wrap = True if overflow is None: overflow = "ignore" crop = False - + render_hooks = self._render_hooks[:] with self: renderables = self._collect_renderables( objects, @@ -1111,11 +1642,18 @@ def print( markup=markup, highlight=highlight, ) - for hook in self._render_hooks: + for hook in render_hooks: renderables = hook.process_renderables(renderables) render_options = self.options.update( - justify=justify, overflow=overflow, width=width, no_wrap=no_wrap + justify=justify, + overflow=overflow, + width=min(width, self.width) if width is not None else NO_CHANGE, + height=height, + no_wrap=no_wrap, + markup=markup, + highlight=highlight, ) + new_segments: List[Segment] = [] extend = new_segments.extend render = self.render @@ -1129,6 +1667,12 @@ def print( render(renderable, render_options), self.get_style(style) ) ) + if new_line_start: + if ( + len("".join(segment.text for segment in new_segments).splitlines()) + > 1 + ): + new_segments.insert(0, Segment.line()) if crop: buffer_extend = self._buffer.extend for line in Segment.split_and_crop_lines( @@ -1138,6 +1682,121 @@ def print( else: self._buffer.extend(new_segments) + def print_json( + self, + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = True, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, + ) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (Optional[str]): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + from rich.json import JSON + + if json is None: + json_renderable = JSON.from_data( + data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + else: + if not isinstance(json, str): + raise TypeError( + f"json must be str. Did you mean print_json(data={json!r}) ?" + ) + json_renderable = JSON( + json, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + self.print(json_renderable, soft_wrap=True) + + def update_screen( + self, + renderable: RenderableType, + *, + region: Optional[Region] = None, + options: Optional[ConsoleOptions] = None, + ) -> None: + """Update the screen at a given offset. + + Args: + renderable (RenderableType): A Rich renderable. + region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. + x (int, optional): x offset. Defaults to 0. + y (int, optional): y offset. Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + render_options = options or self.options + if region is None: + x = y = 0 + render_options = render_options.update_dimensions( + render_options.max_width, render_options.height or self.height + ) + else: + x, y, width, height = region + render_options = render_options.update_dimensions(width, height) + + lines = self.render_lines(renderable, options=render_options) + self.update_screen_lines(lines, x, y) + + def update_screen_lines( + self, lines: List[List[Segment]], x: int = 0, y: int = 0 + ) -> None: + """Update lines of the screen at a given offset. + + Args: + lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). + x (int, optional): x offset (column no). Defaults to 0. + y (int, optional): y offset (column no). Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + screen_update = ScreenUpdate(lines, x, y) + segments = self.render(screen_update) + self._buffer.extend(segments) + self._check_buffer() + def print_exception( self, *, @@ -1146,15 +1805,19 @@ def print_exception( theme: Optional[str] = None, word_wrap: bool = False, show_locals: bool = False, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, ) -> None: """Prints a rich render of the last exception and traceback. Args: - width (Optional[int], optional): Number of characters used to render code. Defaults to 88. + width (Optional[int], optional): Number of characters used to render code. Defaults to 100. extra_lines (int, optional): Additional lines of code to render. Defaults to 3. theme (str, optional): Override pygments theme used in traceback word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. show_locals (bool, optional): Enable display of local variables. Defaults to False. + suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. """ from .traceback import Traceback @@ -1164,27 +1827,66 @@ def print_exception( theme=theme, word_wrap=word_wrap, show_locals=show_locals, + suppress=suppress, + max_frames=max_frames, ) self.print(traceback) + @staticmethod + def _caller_frame_info( + offset: int, + currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, + ) -> Tuple[str, int, Dict[str, Any]]: + """Get caller frame information. + + Args: + offset (int): the caller offset within the current frame stack. + currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to + retrieve the current frame. Defaults to ``inspect.currentframe``. + + Returns: + Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and + the dictionary of local variables associated with the caller frame. + + Raises: + RuntimeError: If the stack offset is invalid. + """ + # Ignore the frame of this local helper + offset += 1 + + frame = currentframe() + if frame is not None: + # Use the faster currentframe where implemented + while offset and frame is not None: + frame = frame.f_back + offset -= 1 + assert frame is not None + return frame.f_code.co_filename, frame.f_lineno, frame.f_locals + else: + # Fallback to the slower stack + frame_info = inspect.stack()[offset] + return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals + def log( self, *objects: Any, - sep=" ", - end="\n", - justify: JustifyMethod = None, - emoji: bool = None, - markup: bool = None, - highlight: bool = None, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, log_locals: bool = False, - _stack_offset=1, + _stack_offset: int = 1, ) -> None: """Log rich content to the terminal. Args: objects (positional args): Objects to log to the terminal. sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\n". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. @@ -1195,8 +1897,10 @@ def log( _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. """ if not objects: - self.line() - return + objects = (NewLine(),) + + render_hooks = self._render_hooks[:] + with self: renderables = self._collect_renderables( objects, @@ -1207,19 +1911,16 @@ def log( markup=markup, highlight=highlight, ) + if style is not None: + renderables = [Styled(renderable, style) for renderable in renderables] - caller = inspect.stack()[_stack_offset] - link_path = ( - None - if caller.filename.startswith("<") - else os.path.abspath(caller.filename) - ) - path = caller.filename.rpartition(os.sep)[-1] - line_no = caller.lineno + filename, line_no, locals = self._caller_frame_info(_stack_offset) + link_path = None if filename.startswith("<") else os.path.abspath(filename) + path = filename.rpartition(os.sep)[-1] if log_locals: locals_map = { key: value - for key, value in caller.frame.f_locals.items() + for key, value in locals.items() if not key.startswith("__") } renderables.append(render_scope(locals_map, title="[i]locals")) @@ -1234,7 +1935,7 @@ def log( link_path=link_path, ) ] - for hook in self._render_hooks: + for hook in render_hooks: renderables = hook.process_renderables(renderables) new_segments: List[Segment] = [] extend = new_segments.extend @@ -1249,42 +1950,76 @@ def log( buffer_extend(line) def _check_buffer(self) -> None: - """Check if the buffer may be rendered.""" + """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) + Rendering is supported on Windows, Unix and Jupyter environments. For + legacy Windows consoles, the win32 API is called directly. + This method will also record what it renders if recording is enabled via Console.record. + """ + if self.quiet: + del self._buffer[:] + return with self._lock: if self._buffer_index == 0: + + if self.record: + with self._record_buffer_lock: + self._record_buffer.extend(self._buffer[:]) + if self.is_jupyter: # pragma: no cover from .jupyter import display - display(self._buffer) + display(self._buffer, self._render_buffer(self._buffer[:])) del self._buffer[:] else: - text = self._render_buffer(self._buffer[:]) - del self._buffer[:] - if text: - try: - if WINDOWS: # pragma: no cover - # https://bugs.python.org/issue37871 - write = self.file.write - for line in text.splitlines(True): + if WINDOWS: + use_legacy_windows_render = False + if self.legacy_windows: + try: + use_legacy_windows_render = ( + self.file.fileno() in _STD_STREAMS_OUTPUT + ) + except (ValueError, io.UnsupportedOperation): + pass + + if use_legacy_windows_render: + from rich._win32_console import LegacyWindowsTerm + from rich._windows_renderer import legacy_windows_render + + legacy_windows_render( + self._buffer[:], LegacyWindowsTerm(self.file) + ) + else: + # Either a non-std stream on legacy Windows, or modern Windows. + text = self._render_buffer(self._buffer[:]) + # https://bugs.python.org/issue37871 + write = self.file.write + for line in text.splitlines(True): + try: write(line) - else: - self.file.write(text) - self.file.flush() + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + else: + text = self._render_buffer(self._buffer[:]) + try: + self.file.write(text) except UnicodeEncodeError as error: error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" raise + self.file.flush() + del self._buffer[:] + def _render_buffer(self, buffer: Iterable[Segment]) -> str: """Render buffered output, and clear buffer.""" output: List[str] = [] append = output.append color_system = self._color_system legacy_windows = self.legacy_windows - if self.record: - with self._record_buffer_lock: - self._record_buffer.extend(buffer) not_terminal = not self.is_terminal - for text, style, is_control in buffer: + if self.no_color and color_system: + buffer = Segment.remove_color(buffer) + for text, style, control in buffer: if style: append( style.render( @@ -1293,7 +2028,7 @@ def _render_buffer(self, buffer: Iterable[Segment]) -> str: legacy_windows=legacy_windows, ) ) - elif not (not_terminal and is_control): + elif not (not_terminal and control): append(text) rendered = "".join(output) @@ -1306,10 +2041,12 @@ def input( markup: bool = True, emoji: bool = True, password: bool = False, - stream: TextIO = None, + stream: Optional[TextIO] = None, ) -> str: """Displays a prompt and waits for input from the user. The prompt may contain color / style. + It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. + Args: prompt (Union[str, Text]): Text to render in the prompt. markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. @@ -1320,23 +2057,15 @@ def input( Returns: str: Text read from stdin. """ - prompt_str = "" if prompt: - with self.capture() as capture: - self.print(prompt, markup=markup, emoji=emoji, end="") - prompt_str = capture.get() - if self.legacy_windows: - # Legacy windows doesn't like ANSI codes in getpass or input (colorama bug)? - self.file.write(prompt_str) - prompt_str = "" + self.print(prompt, markup=markup, emoji=emoji, end="") if password: - result = getpass(prompt_str, stream=stream) + result = getpass("", stream=stream) else: if stream: - self.file.write(prompt_str) result = stream.readline() else: - result = input(prompt_str) + result = input() return result def export_text(self, *, clear: bool = True, styles: bool = False) -> str: @@ -1365,7 +2094,7 @@ def export_text(self, *, clear: bool = True, styles: bool = False) -> str: text = "".join( segment.text for segment in self._record_buffer - if not segment.is_control + if not segment.control ) if clear: del self._record_buffer[:] @@ -1388,9 +2117,9 @@ def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> N def export_html( self, *, - theme: TerminalTheme = None, + theme: Optional[TerminalTheme] = None, clear: bool = True, - code_format: str = None, + code_format: Optional[str] = None, inline_styles: bool = False, ) -> str: """Generate HTML from console contents (requires record=True argument in constructor). @@ -1398,8 +2127,8 @@ def export_html( Args: theme (TerminalTheme, optional): TerminalTheme object containing console colors. clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML, should contain {foreground} - {background} and {code}. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. Defaults to False. @@ -1415,10 +2144,6 @@ def export_html( _theme = theme or DEFAULT_TERMINAL_THEME stylesheet = "" - def escape(text: str) -> str: - """Escape html.""" - return text.replace("&", "&").replace("<", "<").replace(">", ">") - render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format with self._record_buffer_lock: @@ -1429,9 +2154,9 @@ def escape(text: str) -> str: text = escape(text) if style: rule = style.get_html_style(_theme) - text = f'{text}' if rule else text if style.link: text = f'{text}' + text = f'{text}' if rule else text append(text) else: styles: Dict[str, int] = {} @@ -1441,11 +2166,11 @@ def escape(text: str) -> str: text = escape(text) if style: rule = style.get_html_style(_theme) - if rule: - style_number = styles.setdefault(rule, len(styles) + 1) - text = f'{text}' + style_number = styles.setdefault(rule, len(styles) + 1) if style.link: - text = f'{text}' + text = f'{text}' + else: + text = f'{text}' append(text) stylesheet_rules: List[str] = [] stylesheet_append = stylesheet_rules.append @@ -1468,9 +2193,9 @@ def save_html( self, path: str, *, - theme: TerminalTheme = None, + theme: Optional[TerminalTheme] = None, clear: bool = True, - code_format=CONSOLE_HTML_FORMAT, + code_format: str = CONSOLE_HTML_FORMAT, inline_styles: bool = False, ) -> None: """Generate HTML from console contents and write to a file (requires record=True argument in constructor). @@ -1479,8 +2204,8 @@ def save_html( path (str): Path to write html file. theme (TerminalTheme, optional): TerminalTheme object containing console colors. clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML, should contain {foreground} - {background} and {code}. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. Defaults to False. @@ -1495,9 +2220,280 @@ def save_html( with open(path, "wt", encoding="utf-8") as write_file: write_file.write(html) + def export_svg( + self, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + ) -> str: + """ + Generate an SVG from the console contents (requires record=True in Console constructor). + + Args: + path (str): The path to write the SVG to. + title (str): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + """ + + from rich.cells import cell_len + + style_cache: Dict[Style, str] = {} + + def get_svg_style(style: Style) -> str: + """Convert a Style to CSS rules for SVG.""" + if style in style_cache: + return style_cache[style] + css_rules = [] + color = ( + _theme.foreground_color + if (style.color is None or style.color.is_default) + else style.color.get_truecolor(_theme) + ) + bgcolor = ( + _theme.background_color + if (style.bgcolor is None or style.bgcolor.is_default) + else style.bgcolor.get_truecolor(_theme) + ) + if style.reverse: + color, bgcolor = bgcolor, color + if style.dim: + color = blend_rgb(color, bgcolor, 0.4) + css_rules.append(f"fill: {color.hex}") + if style.bold: + css_rules.append("font-weight: bold") + if style.italic: + css_rules.append("font-style: italic;") + if style.underline: + css_rules.append("text-decoration: underline;") + if style.strike: + css_rules.append("text-decoration: line-through;") + + css = ";".join(css_rules) + style_cache[style] = css + return css + + _theme = theme or SVG_EXPORT_THEME + + width = self.width + char_height = 20 + char_width = char_height * 0.62 + line_height = char_height * 1.32 + + margin_top = 20 + margin_right = 16 + margin_bottom = 20 + margin_left = 16 + + padding_top = 40 + padding_right = 12 + padding_bottom = 12 + padding_left = 12 + + padding_width = padding_left + padding_right + padding_height = padding_top + padding_bottom + margin_width = margin_left + margin_right + margin_height = margin_top + margin_bottom + + text_backgrounds: List[str] = [] + text_group: List[str] = [] + classes: Dict[str, int] = {} + style_no = 1 + + def escape_text(text: str) -> str: + """HTML escape text and replace spaces with nbsp.""" + return escape(text).replace(" ", " ") + + def make_tag( + name: str, content: Optional[str] = None, **attribs: object + ) -> str: + """Make a tag from name, content, and attributes.""" + + def stringify(value: object) -> str: + if isinstance(value, (float)): + return format(value, "g") + return str(value) + + tag_attribs = " ".join( + f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' + for k, v in attribs.items() + ) + return ( + f"<{name} {tag_attribs}>{content}" + if content + else f"<{name} {tag_attribs}/>" + ) + + with self._record_buffer_lock: + segments = list( + Segment.filter_control( + Segment.simplify(self._record_buffer), + ) + ) + if clear: + self._record_buffer.clear() + + unique_id = "terminal-" + str( + zlib.adler32( + ("".join(segment.text for segment in segments)).encode( + "utf-8", "ignore" + ) + + title.encode("utf-8", "ignore") + ) + ) + y = 0 + for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): + x = 0 + for text, style, _control in line: + style = style or Style() + rules = get_svg_style(style) + if rules not in classes: + classes[rules] = style_no + style_no += 1 + class_name = f"r{classes[rules]}" + + if style.reverse: + has_background = True + background = ( + _theme.foreground_color.hex + if style.color is None + else style.color.get_truecolor(_theme).hex + ) + else: + bgcolor = style.bgcolor + has_background = bgcolor is not None and not bgcolor.is_default + background = ( + _theme.background_color.hex + if style.bgcolor is None + else style.bgcolor.get_truecolor(_theme).hex + ) + + text_length = cell_len(text) + if has_background: + text_backgrounds.append( + make_tag( + "rect", + fill=background, + x=x * char_width, + y=y * line_height, + width=char_width * text_length + 1, + height=line_height + 1, + ) + ) + text_group.append( + make_tag( + "tspan", + escape_text(text), + _class=f"{unique_id}-{class_name}", + x=x * char_width, + y=y * line_height + char_height, + textLength=char_width * len(text), + ) + ) + x += cell_len(text) + + styles = "\n".join( + f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() + ) + backgrounds = "".join(text_backgrounds) + matrix = "".join(text_group) + + terminal_width = ceil(width * char_width + padding_width) + terminal_height = (y + 1) * line_height + padding_height + chrome = make_tag( + "rect", + fill=_theme.background_color.hex, + stroke="rgba(255,255,255,0.35)", + stroke_width="1", + x=margin_left, + y=margin_top, + width=terminal_width, + height=terminal_height, + rx=12, + ) + + title_color = _theme.foreground_color.hex + if title: + chrome += make_tag( + "text", + title, + _class=f"{unique_id}-title", + fill=title_color, + text_anchor="middle", + x=terminal_width // 2, + y=margin_top + char_height + 6, + ) + chrome += f""" + + + + """ + + svg = code_format.format( + unique_id=unique_id, + char_width=char_width, + char_height=char_height, + line_height=line_height, + width=terminal_width + margin_width, + height=terminal_height + margin_height, + terminal_x=margin_left + padding_left, + terminal_y=margin_top + padding_top, + styles=styles, + chrome=chrome, + backgrounds=backgrounds, + matrix=matrix, + ) + return svg + + def save_svg( + self, + path: str, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + ) -> None: + """Generate an SVG file from the console contents (requires record=True in Console constructor). + + Args: + path (str): The path to write the SVG to. + title (str): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + """ + svg = self.export_svg( + title=title, + theme=theme, + clear=clear, + code_format=code_format, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(svg) + + +def _svg_hash(svg_main_code: str) -> str: + """Returns a unique hash for the given SVG main code. + + Args: + svg_main_code (str): The content we're going to inject in the SVG envelope. + + Returns: + str: a hash of the given content + """ + return str(zlib.adler32(svg_main_code.encode())) + if __name__ == "__main__": # pragma: no cover - console = Console() + console = Console(record=True) console.log( "JSONRPC [i]request[/i]", @@ -1550,4 +2546,3 @@ def save_html( }, } ) - console.log("foo") diff --git a/rich/constrain.py b/rich/constrain.py index c96233ae1c..65fdf56342 100644 --- a/rich/constrain.py +++ b/rich/constrain.py @@ -25,11 +25,13 @@ def __rich_console__( if self.width is None: yield self.renderable else: - child_options = options.update(width=min(self.width, options.max_width)) + child_options = options.update_width(min(self.width, options.max_width)) yield from console.render(self.renderable, child_options) - def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": if self.width is not None: - max_width = min(self.width, max_width) - measurement = Measurement.get(console, self.renderable, max_width) + options = options.update_width(self.width) + measurement = Measurement.get(console, options, self.renderable) return measurement diff --git a/rich/containers.py b/rich/containers.py index 4ef865a211..e29cf36899 100644 --- a/rich/containers.py +++ b/rich/containers.py @@ -3,13 +3,13 @@ Iterator, Iterable, List, + Optional, + Union, overload, TypeVar, TYPE_CHECKING, ) -from .style import Style - if TYPE_CHECKING: from .console import ( Console, @@ -30,7 +30,9 @@ class Renderables: """A list subclass which renders its contents to the console.""" - def __init__(self, renderables: Iterable["RenderableType"] = None) -> None: + def __init__( + self, renderables: Optional[Iterable["RenderableType"]] = None + ) -> None: self._renderables: List["RenderableType"] = ( list(renderables) if renderables is not None else [] ) @@ -41,9 +43,11 @@ def __rich_console__( """Console render method to insert line-breaks.""" yield from self._renderables - def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": dimensions = [ - Measurement.get(console, renderable, max_width) + Measurement.get(console, options, renderable) for renderable in self._renderables ] if not dimensions: @@ -76,10 +80,10 @@ def __getitem__(self, index: int) -> "Text": ... @overload - def __getitem__(self, index: slice) -> "Lines": + def __getitem__(self, index: slice) -> List["Text"]: ... - def __getitem__(self, index): + def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: return self._lines[index] def __setitem__(self, index: int, value: "Text") -> "Lines": @@ -101,6 +105,9 @@ def append(self, line: "Text") -> None: def extend(self, lines: Iterable["Text"]) -> None: self._lines.extend(lines) + def pop(self, index: int = -1) -> "Text": + return self._lines.pop(index) + def justify( self, console: "Console", diff --git a/rich/control.py b/rich/control.py index 8b189de3b8..747311fcea 100644 --- a/rich/control.py +++ b/rich/control.py @@ -1,6 +1,7 @@ -from typing import TYPE_CHECKING +import time +from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union -from .segment import Segment +from .segment import ControlCode, ControlType, Segment if TYPE_CHECKING: from .console import Console, ConsoleOptions, RenderResult @@ -14,28 +15,162 @@ _CONTROL_TRANSLATE = {_codepoint: None for _codepoint in STRIP_CONTROL_CODES} +CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { + ControlType.BELL: lambda: "\x07", + ControlType.CARRIAGE_RETURN: lambda: "\r", + ControlType.HOME: lambda: "\x1b[H", + ControlType.CLEAR: lambda: "\x1b[2J", + ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", + ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", + ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", + ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", + ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", + ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", + ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", + ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", + ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", + ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", + ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", + ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", +} + + class Control: """A renderable that inserts a control code (non printable but may move cursor). Args: - control_codes (str): A string containing control codes. + *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a + tuple of ControlType and an integer parameter """ - __slots__ = ["_control_codes"] - - def __init__(self, control_codes: str) -> None: - self._control_codes = Segment.control(control_codes) + __slots__ = ["segment"] + + def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: + control_codes: List[ControlCode] = [ + (code,) if isinstance(code, ControlType) else code for code in codes + ] + _format_map = CONTROL_CODES_FORMAT + rendered_codes = "".join( + _format_map[code](*parameters) for code, *parameters in control_codes + ) + self.segment = Segment(rendered_codes, None, control_codes) + + @classmethod + def bell(cls) -> "Control": + """Ring the 'bell'.""" + return cls(ControlType.BELL) + + @classmethod + def home(cls) -> "Control": + """Move cursor to 'home' position.""" + return cls(ControlType.HOME) + + @classmethod + def move(cls, x: int = 0, y: int = 0) -> "Control": + """Move cursor relative to current position. + + Args: + x (int): X offset. + y (int): Y offset. + + Returns: + ~Control: Control object. + + """ + + def get_codes() -> Iterable[ControlCode]: + control = ControlType + if x: + yield ( + control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, + abs(x), + ) + if y: + yield ( + control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, + abs(y), + ) + + control = cls(*get_codes()) + return control + + @classmethod + def move_to_column(cls, x: int, y: int = 0) -> "Control": + """Move to the given column, optionally add offset to row. + + Returns: + x (int): absolute x (column) + y (int): optional y offset (row) + + Returns: + ~Control: Control object. + """ + + return ( + cls( + (ControlType.CURSOR_MOVE_TO_COLUMN, x), + ( + ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, + abs(y), + ), + ) + if y + else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) + ) + + @classmethod + def move_to(cls, x: int, y: int) -> "Control": + """Move cursor to absolute position. + + Args: + x (int): x offset (column) + y (int): y offset (row) + + Returns: + ~Control: Control object. + """ + return cls((ControlType.CURSOR_MOVE_TO, x, y)) + + @classmethod + def clear(cls) -> "Control": + """Clear the screen.""" + return cls(ControlType.CLEAR) + + @classmethod + def show_cursor(cls, show: bool) -> "Control": + """Show or hide the cursor.""" + return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) + + @classmethod + def alt_screen(cls, enable: bool) -> "Control": + """Enable or disable alt screen.""" + if enable: + return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) + else: + return cls(ControlType.DISABLE_ALT_SCREEN) + + @classmethod + def title(cls, title: str) -> "Control": + """Set the terminal window title + + Args: + title (str): The new terminal window title + """ + return cls((ControlType.SET_WINDOW_TITLE, title)) def __str__(self) -> str: - return self._control_codes.text + return self.segment.text def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": - yield self._control_codes + if self.segment.text: + yield self.segment -def strip_control_codes(text: str, _translate_table=_CONTROL_TRANSLATE) -> str: +def strip_control_codes( + text: str, _translate_table: Dict[int, None] = _CONTROL_TRANSLATE +) -> str: """Remove control codes from text. Args: @@ -48,5 +183,11 @@ def strip_control_codes(text: str, _translate_table=_CONTROL_TRANSLATE) -> str: if __name__ == "__main__": # pragma: no cover - - print(strip_control_codes("hello\rWorld")) + from rich.console import Console + + console = Console() + console.print("Look at the title of your terminal window ^") + # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) + for i in range(10): + console.set_window_title("🚀 Loading" + "." * i) + time.sleep(0.5) diff --git a/rich/default_styles.py b/rich/default_styles.py index 4524aa270a..1969bb787b 100644 --- a/rich/default_styles.py +++ b/rich/default_styles.py @@ -40,10 +40,15 @@ "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), "inspect.callable": Style(bold=True, color="red"), "inspect.def": Style(italic=True, color="bright_cyan"), + "inspect.class": Style(italic=True, color="bright_cyan"), "inspect.error": Style(bold=True, color="red"), "inspect.equals": Style(), "inspect.help": Style(color="cyan"), "inspect.doc": Style(dim=True), + "inspect.value.border": Style(color="green"), + "live.ellipsis": Style(bold=True, color="red"), + "layout.tree.row": Style(dim=False, color="red"), + "layout.tree.column": Style(dim=False, color="blue"), "logging.keyword": Style(bold=True, color="yellow"), "logging.level.notset": Style(dim=True), "logging.level.debug": Style(color="green"), @@ -72,14 +77,25 @@ "repr.attrib_name": Style(color="yellow", italic=False), "repr.attrib_equal": Style(bold=True), "repr.attrib_value": Style(color="magenta", italic=False), - "repr.number": Style(color="blue", bold=True, italic=False), + "repr.number": Style(color="cyan", bold=True, italic=False), + "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same "repr.bool_true": Style(color="bright_green", italic=True), "repr.bool_false": Style(color="bright_red", italic=True), "repr.none": Style(color="magenta", italic=True), "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), "repr.uuid": Style(color="bright_yellow", bold=False), + "repr.call": Style(color="magenta", bold=True), + "repr.path": Style(color="magenta"), + "repr.filename": Style(color="bright_magenta"), "rule.line": Style(color="bright_green"), "rule.text": Style.null(), + "json.brace": Style(bold=True), + "json.bool_true": Style(color="bright_green", italic=True), + "json.bool_false": Style(color="bright_red", italic=True), + "json.null": Style(color="magenta", italic=True), + "json.number": Style(color="cyan", bold=True, italic=False), + "json.str": Style(color="green", italic=False, bold=False), + "json.key": Style(color="blue", bold=True), "prompt": Style.null(), "prompt.choices": Style(color="magenta", bold=True), "prompt.default": Style(color="cyan", bold=True), @@ -90,13 +106,12 @@ "scope.key": Style(color="yellow", italic=True), "scope.key.special": Style(color="yellow", italic=True, dim=True), "scope.equals": Style(color="red"), - "repr.path": Style(color="magenta"), - "repr.filename": Style(color="bright_magenta"), "table.header": Style(bold=True), "table.footer": Style(bold=True), "table.cell": Style.null(), "table.title": Style(italic=True), "table.caption": Style(italic=True, dim=True), + "traceback.error": Style(color="red", italic=True), "traceback.border.syntax_error": Style(color="bright_red"), "traceback.border": Style(color="red"), "traceback.text": Style.null(), @@ -112,12 +127,14 @@ "progress.filesize": Style(color="green"), "progress.filesize.total": Style(color="green"), "progress.download": Style(color="green"), + "progress.elapsed": Style(color="yellow"), "progress.percentage": Style(color="magenta"), "progress.remaining": Style(color="cyan"), "progress.data.speed": Style(color="red"), -} - -MARKDOWN_STYLES = { + "progress.spinner": Style(color="green"), + "status.spinner": Style(color="green"), + "tree": Style(), + "tree.line": Style(), "markdown.paragraph": Style(), "markdown.text": Style(), "markdown.emph": Style(italic=True), @@ -143,4 +160,25 @@ } -DEFAULT_STYLES.update(MARKDOWN_STYLES) +if __name__ == "__main__": # pragma: no cover + import argparse + import io + + from rich.console import Console + from rich.table import Table + from rich.text import Text + + parser = argparse.ArgumentParser() + parser.add_argument("--html", action="store_true", help="Export as HTML table") + args = parser.parse_args() + html: bool = args.html + console = Console(record=True, width=70, file=io.StringIO()) if html else Console() + + table = Table("Name", "Styling") + + for style_name, style in DEFAULT_STYLES.items(): + table.add_row(Text(style_name, style=style), str(style)) + + console.print(table) + if html: + print(console.export_html(inline_styles=True)) diff --git a/rich/diagnose.py b/rich/diagnose.py new file mode 100644 index 0000000000..09c4e0622b --- /dev/null +++ b/rich/diagnose.py @@ -0,0 +1,35 @@ +import os +import platform + +from rich import inspect +from rich.console import Console, get_windows_console_features +from rich.panel import Panel +from rich.pretty import Pretty + + +def report() -> None: # pragma: no cover + """Print a report to the terminal with debugging information""" + console = Console() + inspect(console) + features = get_windows_console_features() + inspect(features) + + env_names = ( + "TERM", + "COLORTERM", + "CLICOLOR", + "NO_COLOR", + "TERM_PROGRAM", + "COLUMNS", + "LINES", + "JPY_PARENT_PID", + "VSCODE_VERBOSE_LOGGING", + ) + env = {name: os.getenv(name) for name in env_names} + console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) + + console.print(f'platform="{platform.system()}"') + + +if __name__ == "__main__": # pragma: no cover + report() diff --git a/rich/emoji.py b/rich/emoji.py index 4c1e200c49..d5a1062a96 100644 --- a/rich/emoji.py +++ b/rich/emoji.py @@ -1,21 +1,40 @@ -from typing import Union +import sys +from typing import TYPE_CHECKING, Optional, Union -from .console import Console, ConsoleOptions, RenderResult from .jupyter import JupyterMixin from .segment import Segment from .style import Style from ._emoji_codes import EMOJI from ._emoji_replace import _emoji_replace +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal # pragma: no cover + + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + + +EmojiVariant = Literal["emoji", "text"] + class NoEmoji(Exception): """No emoji by that name.""" class Emoji(JupyterMixin): - __slots__ = ["name", "style", "_char"] + __slots__ = ["name", "style", "_char", "variant"] + + VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} - def __init__(self, name: str, style: Union[str, Style] = "none") -> None: + def __init__( + self, + name: str, + style: Union[str, Style] = "none", + variant: Optional[EmojiVariant] = None, + ) -> None: """A single emoji character. Args: @@ -27,10 +46,13 @@ def __init__(self, name: str, style: Union[str, Style] = "none") -> None: """ self.name = name self.style = style + self.variant = variant try: self._char = EMOJI[name] except KeyError: raise NoEmoji(f"No emoji called {name!r}") + if variant is not None: + self._char += self.VARIANTS.get(variant, "") @classmethod def replace(cls, text: str) -> str: @@ -51,8 +73,8 @@ def __str__(self) -> str: return self._char def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": yield Segment(self._char, console.get_style(self.style)) diff --git a/rich/errors.py b/rich/errors.py index f37deec496..0bcbe53ef5 100644 --- a/rich/errors.py +++ b/rich/errors.py @@ -24,3 +24,11 @@ class NotRenderableError(ConsoleError): class MarkupError(ConsoleError): """Markup was badly formatted.""" + + +class LiveError(ConsoleError): + """Error related to Live display.""" + + +class NoAltScreen(ConsoleError): + """Alt screen mode was required.""" diff --git a/rich/file_proxy.py b/rich/file_proxy.py new file mode 100644 index 0000000000..cc69f22f3c --- /dev/null +++ b/rich/file_proxy.py @@ -0,0 +1,54 @@ +import io +from typing import IO, TYPE_CHECKING, Any, List + +from .ansi import AnsiDecoder +from .text import Text + +if TYPE_CHECKING: + from .console import Console + + +class FileProxy(io.TextIOBase): + """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" + + def __init__(self, console: "Console", file: IO[str]) -> None: + self.__console = console + self.__file = file + self.__buffer: List[str] = [] + self.__ansi_decoder = AnsiDecoder() + + @property + def rich_proxied_file(self) -> IO[str]: + """Get proxied file.""" + return self.__file + + def __getattr__(self, name: str) -> Any: + return getattr(self.__file, name) + + def write(self, text: str) -> int: + if not isinstance(text, str): + raise TypeError(f"write() argument must be str, not {type(text).__name__}") + buffer = self.__buffer + lines: List[str] = [] + while text: + line, new_line, text = text.partition("\n") + if new_line: + lines.append("".join(buffer) + line) + del buffer[:] + else: + buffer.append(line) + break + if lines: + console = self.__console + with console: + output = Text("\n").join( + self.__ansi_decoder.decode_line(line) for line in lines + ) + console.print(output) + return len(text) + + def flush(self) -> None: + output = "".join(self.__buffer) + if output: + self.__console.print(output) + del self.__buffer[:] diff --git a/rich/filesize.py b/rich/filesize.py index 4876823303..61be47510f 100644 --- a/rich/filesize.py +++ b/rich/filesize.py @@ -13,32 +13,49 @@ __all__ = ["decimal"] -from typing import Iterable, List, Tuple +from typing import Iterable, List, Optional, Tuple -def _to_str(size: int, suffixes: Iterable[str], base: int) -> str: +def _to_str( + size: int, + suffixes: Iterable[str], + base: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: if size == 1: return "1 byte" elif size < base: return "{:,} bytes".format(size) for i, suffix in enumerate(suffixes, 2): # noqa: B007 - unit = base ** i + unit = base**i if size < unit: break - return "{:,.1f} {}".format((base * size / unit), suffix) + return "{:,.{precision}f}{separator}{}".format( + (base * size / unit), + suffix, + precision=precision, + separator=separator, + ) def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: """Pick a suffix and base for the given size.""" for i, suffix in enumerate(suffixes): - unit = base ** i + unit = base**i if size < unit * base: break return unit, suffix -def decimal(size: int) -> str: +def decimal( + size: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: """Convert a filesize in to a string (powers of 1000, SI prefixes). In this convention, ``1000 B = 1 kB``. @@ -50,6 +67,8 @@ def decimal(size: int) -> str: Arguments: int (size): A file size. + int (precision): The number of decimal places to include (default = 1). + str (separator): The string to separate the value from the units (default = " "). Returns: `str`: A string containing a abbreviated file size and units. @@ -57,6 +76,14 @@ def decimal(size: int) -> str: Example: >>> filesize.decimal(30000) '30.0 kB' + >>> filesize.decimal(30000, precision=2, separator="") + '30.00kB' """ - return _to_str(size, ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), 1000) + return _to_str( + size, + ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), + 1000, + precision=precision, + separator=separator, + ) diff --git a/rich/highlighter.py b/rich/highlighter.py index c992fd6f2e..193261c4c1 100644 --- a/rich/highlighter.py +++ b/rich/highlighter.py @@ -1,7 +1,8 @@ +import re from abc import ABC, abstractmethod from typing import List, Union -from .text import Text +from .text import Span, Text def _combine_regex(*regexes: str) -> str: @@ -81,25 +82,64 @@ class ReprHighlighter(RegexHighlighter): base_style = "repr." highlights = [ - r"(?P\<)(?P[\w\-\.\:]*)(?P.*?)(?P\>)", - r"(?P\w+?)=(?P\"?[\w_]+\"?)?", + r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*?)(?P>)", + r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', + r"(?P[][{}()])", _combine_regex( r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", - r"(?P[\{\[\(\)\]\}])", - r"(?PTrue)|(?PFalse)|(?PNone)", + r"(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", + r"(?P[\w.]*?)\(", + r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b", r"(?P\.\.\.)", - r"(?P(?\B(\/[\w\.\-\_\+]+)*\/)(?P[\w\.\-\_\+]*)?", - r"(?b?\'\'\'.*?(?[a-fA-F0-9]{8}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{12})", - r"(?Phttps?:\/\/[0-9a-zA-Z\$\-\_\+\!`\(\)\,\.\?\/\;\:\&\=\%\#]*)", + r"(?P(?(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", + r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", ), ] +class JSONHighlighter(RegexHighlighter): + """Highlights JSON""" + + # Captures the start and end of JSON strings, handling escaped quotes + JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", + r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", + r"(?P(? None: + super().highlight(text) + + # Additional work to handle highlighting JSON keys + plain = text.plain + append = text.spans.append + whitespace = self.JSON_WHITESPACE + for match in re.finditer(self.JSON_STR, plain): + start, end = match.span() + cursor = end + while cursor < len(plain): + char = plain[cursor] + cursor += 1 + if char == ":": + append(Span(start, end, "json.key")) + elif char in whitespace: + continue + break + + if __name__ == "__main__": # pragma: no cover from .console import Console @@ -129,3 +169,6 @@ class ReprHighlighter(RegexHighlighter): console.print( "127.0.1.1 bar 192.168.1.4 2001:0db8:85a3:0000:0000:8a2e:0370:7334 foo" ) + import json + + console.print_json(json.dumps(obj={"name": "apple", "count": 1}), indent=None) diff --git a/rich/json.py b/rich/json.py new file mode 100644 index 0000000000..1fc115a952 --- /dev/null +++ b/rich/json.py @@ -0,0 +1,140 @@ +from json import loads, dumps +from typing import Any, Callable, Optional, Union + +from .text import Text +from .highlighter import JSONHighlighter, NullHighlighter + + +class JSON: + """A renderable which pretty prints JSON. + + Args: + json (str): JSON encoded data. + indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2. + highlight (bool, optional): Enable highlighting. Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + + def __init__( + self, + json: str, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = True, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, + ) -> None: + data = loads(json) + json = dumps( + data, + indent=indent, + skipkeys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + highlighter = JSONHighlighter() if highlight else NullHighlighter() + self.text = highlighter(json) + self.text.no_wrap = True + self.text.overflow = None + + @classmethod + def from_data( + cls, + data: Any, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = True, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, + ) -> "JSON": + """Encodes a JSON object from arbitrary data. + + Args: + data (Any): An object that may be encoded in to JSON + indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2. + highlight (bool, optional): Enable highlighting. Defaults to True. + default (Callable, optional): Optional callable which will be called for objects that cannot be serialized. Defaults to None. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + + Returns: + JSON: New JSON object from the given data. + """ + json_instance: "JSON" = cls.__new__(cls) + json = dumps( + data, + indent=indent, + skipkeys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + highlighter = JSONHighlighter() if highlight else NullHighlighter() + json_instance.text = highlighter(json) + json_instance.text.no_wrap = True + json_instance.text.overflow = None + return json_instance + + def __rich__(self) -> Text: + return self.text + + +if __name__ == "__main__": + + import argparse + import sys + + parser = argparse.ArgumentParser(description="Pretty print json") + parser.add_argument( + "path", + metavar="PATH", + help="path to file, or - for stdin", + ) + parser.add_argument( + "-i", + "--indent", + metavar="SPACES", + type=int, + help="Number of spaces in an indent", + default=2, + ) + args = parser.parse_args() + + from rich.console import Console + + console = Console() + error_console = Console(stderr=True) + + try: + if args.path == "-": + json_data = sys.stdin.read() + else: + with open(args.path, "rt") as json_file: + json_data = json_file.read() + except Exception as error: + error_console.print(f"Unable to read {args.path!r}; {error}") + sys.exit(-1) + + console.print(JSON(json_data, indent=args.indent), soft_wrap=True) diff --git a/rich/jupyter.py b/rich/jupyter.py index 5aecf1c738..7608bd0177 100644 --- a/rich/jupyter.py +++ b/rich/jupyter.py @@ -1,12 +1,14 @@ -from typing import Iterable, List, TYPE_CHECKING +from typing import Any, Dict, Iterable, List, TYPE_CHECKING, Sequence + +if TYPE_CHECKING: + from rich.console import ConsoleRenderable -# from .console import Console as BaseConsole from . import get_console from .segment import Segment from .terminal_theme import DEFAULT_TERMINAL_THEME if TYPE_CHECKING: - from .console import RenderableType + from rich.console import ConsoleRenderable JUPYTER_HTML_FORMAT = """\
{code}
@@ -16,28 +18,42 @@ class JupyterRenderable: """A shim to write html to Jupyter notebook.""" - def __init__(self, html: str) -> None: + def __init__(self, html: str, text: str) -> None: self.html = html + self.text = text - @classmethod - def render(cls, rich_renderable: "RenderableType") -> str: - console = get_console() - segments = console.render(rich_renderable, console.options) - html = _render_segments(segments) - return html - - def _repr_html_(self) -> str: - return self.html + def _repr_mimebundle_( + self, include: Sequence[str], exclude: Sequence[str], **kwargs: Any + ) -> Dict[str, str]: + data = {"text/plain": self.text, "text/html": self.html} + if include: + data = {k: v for (k, v) in data.items() if k in include} + if exclude: + data = {k: v for (k, v) in data.items() if k not in exclude} + return data class JupyterMixin: """Add to an Rich renderable to make it render in Jupyter notebook.""" - def _repr_html_(self) -> str: + __slots__ = () + + def _repr_mimebundle_( + self: "ConsoleRenderable", + include: Sequence[str], + exclude: Sequence[str], + **kwargs: Any, + ) -> Dict[str, str]: console = get_console() - segments = list(console.render(self, console.options)) # type: ignore + segments = list(console.render(self, console.options)) html = _render_segments(segments) - return html + text = console._render_buffer(segments) + data = {"text/plain": text, "text/html": html} + if include: + data = {k: v for (k, v) in data.items() if k in include} + if exclude: + data = {k: v for (k, v) in data.items() if k not in exclude} + return data def _render_segments(segments: Iterable[Segment]) -> str: @@ -48,15 +64,15 @@ def escape(text: str) -> str: fragments: List[str] = [] append_fragment = fragments.append theme = DEFAULT_TERMINAL_THEME - for text, style, is_control in Segment.simplify(segments): - if is_control: + for text, style, control in Segment.simplify(segments): + if control: continue text = escape(text) if style: rule = style.get_html_style(theme) text = f'{text}' if rule else text if style.link: - text = f'{text}' + text = f'{text}' append_fragment(text) code = "".join(fragments) @@ -65,16 +81,21 @@ def escape(text: str) -> str: return html -def display(segments: Iterable[Segment]) -> None: +def display(segments: Iterable[Segment], text: str) -> None: """Render segments to Jupyter.""" - from IPython.display import display as ipython_display - html = _render_segments(segments) - jupyter_renderable = JupyterRenderable(html) - ipython_display(jupyter_renderable) + jupyter_renderable = JupyterRenderable(html, text) + try: + from IPython.display import display as ipython_display + + ipython_display(jupyter_renderable) + except ModuleNotFoundError: + # Handle the case where the Console has force_jupyter=True, + # but IPython is not installed. + pass -def print(*args, **kwargs) -> None: +def print(*args: Any, **kwargs: Any) -> None: """Proxy for Console print.""" console = get_console() return console.print(*args, **kwargs) diff --git a/rich/layout.py b/rich/layout.py new file mode 100644 index 0000000000..2030c04018 --- /dev/null +++ b/rich/layout.py @@ -0,0 +1,445 @@ +from abc import ABC, abstractmethod +from itertools import islice +from operator import itemgetter +from threading import RLock +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Sequence, + Tuple, + Union, +) + +from ._ratio import ratio_resolve +from .align import Align +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .highlighter import ReprHighlighter +from .panel import Panel +from .pretty import Pretty +from .repr import rich_repr, Result +from .region import Region +from .segment import Segment +from .style import StyleType + +if TYPE_CHECKING: + from rich.tree import Tree + + +class LayoutRender(NamedTuple): + """An individual layout render.""" + + region: Region + render: List[List[Segment]] + + +RegionMap = Dict["Layout", Region] +RenderMap = Dict["Layout", LayoutRender] + + +class LayoutError(Exception): + """Layout related error.""" + + +class NoSplitter(LayoutError): + """Requested splitter does not exist.""" + + +class _Placeholder: + """An internal renderable used as a Layout placeholder.""" + + highlighter = ReprHighlighter() + + def __init__(self, layout: "Layout", style: StyleType = "") -> None: + self.layout = layout + self.style = style + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + width = options.max_width + height = options.height or options.size.height + layout = self.layout + title = ( + f"{layout.name!r} ({width} x {height})" + if layout.name + else f"({width} x {height})" + ) + yield Panel( + Align.center(Pretty(layout), vertical="middle"), + style=self.style, + title=self.highlighter(title), + border_style="blue", + height=height, + ) + + +class Splitter(ABC): + """Base class for a splitter.""" + + name: str = "" + + @abstractmethod + def get_tree_icon(self) -> str: + """Get the icon (emoji) used in layout.tree""" + + @abstractmethod + def divide( + self, children: Sequence["Layout"], region: Region + ) -> Iterable[Tuple["Layout", Region]]: + """Divide a region amongst several child layouts. + + Args: + children (Sequence(Layout)): A number of child layouts. + region (Region): A rectangular region to divide. + """ + + +class RowSplitter(Splitter): + """Split a layout region in to rows.""" + + name = "row" + + def get_tree_icon(self) -> str: + return "[layout.tree.row]⬌" + + def divide( + self, children: Sequence["Layout"], region: Region + ) -> Iterable[Tuple["Layout", Region]]: + x, y, width, height = region + render_widths = ratio_resolve(width, children) + offset = 0 + _Region = Region + for child, child_width in zip(children, render_widths): + yield child, _Region(x + offset, y, child_width, height) + offset += child_width + + +class ColumnSplitter(Splitter): + """Split a layout region in to columns.""" + + name = "column" + + def get_tree_icon(self) -> str: + return "[layout.tree.column]⬍" + + def divide( + self, children: Sequence["Layout"], region: Region + ) -> Iterable[Tuple["Layout", Region]]: + x, y, width, height = region + render_heights = ratio_resolve(height, children) + offset = 0 + _Region = Region + for child, child_height in zip(children, render_heights): + yield child, _Region(x, y + offset, width, child_height) + offset += child_height + + +@rich_repr +class Layout: + """A renderable to divide a fixed height in to rows or columns. + + Args: + renderable (RenderableType, optional): Renderable content, or None for placeholder. Defaults to None. + name (str, optional): Optional identifier for Layout. Defaults to None. + size (int, optional): Optional fixed size of layout. Defaults to None. + minimum_size (int, optional): Minimum size of layout. Defaults to 1. + ratio (int, optional): Optional ratio for flexible layout. Defaults to 1. + visible (bool, optional): Visibility of layout. Defaults to True. + """ + + splitters = {"row": RowSplitter, "column": ColumnSplitter} + + def __init__( + self, + renderable: Optional[RenderableType] = None, + *, + name: Optional[str] = None, + size: Optional[int] = None, + minimum_size: int = 1, + ratio: int = 1, + visible: bool = True, + height: Optional[int] = None, + ) -> None: + self._renderable = renderable or _Placeholder(self) + self.size = size + self.minimum_size = minimum_size + self.ratio = ratio + self.name = name + self.visible = visible + self.height = height + self.splitter: Splitter = self.splitters["column"]() + self._children: List[Layout] = [] + self._render_map: RenderMap = {} + self._lock = RLock() + + def __rich_repr__(self) -> Result: + yield "name", self.name, None + yield "size", self.size, None + yield "minimum_size", self.minimum_size, 1 + yield "ratio", self.ratio, 1 + + @property + def renderable(self) -> RenderableType: + """Layout renderable.""" + return self if self._children else self._renderable + + @property + def children(self) -> List["Layout"]: + """Gets (visible) layout children.""" + return [child for child in self._children if child.visible] + + @property + def map(self) -> RenderMap: + """Get a map of the last render.""" + return self._render_map + + def get(self, name: str) -> Optional["Layout"]: + """Get a named layout, or None if it doesn't exist. + + Args: + name (str): Name of layout. + + Returns: + Optional[Layout]: Layout instance or None if no layout was found. + """ + if self.name == name: + return self + else: + for child in self._children: + named_layout = child.get(name) + if named_layout is not None: + return named_layout + return None + + def __getitem__(self, name: str) -> "Layout": + layout = self.get(name) + if layout is None: + raise KeyError(f"No layout with name {name!r}") + return layout + + @property + def tree(self) -> "Tree": + """Get a tree renderable to show layout structure.""" + from rich.styled import Styled + from rich.table import Table + from rich.tree import Tree + + def summary(layout: "Layout") -> Table: + + icon = layout.splitter.get_tree_icon() + + table = Table.grid(padding=(0, 1, 0, 0)) + + text: RenderableType = ( + Pretty(layout) if layout.visible else Styled(Pretty(layout), "dim") + ) + table.add_row(icon, text) + _summary = table + return _summary + + layout = self + tree = Tree( + summary(layout), + guide_style=f"layout.tree.{layout.splitter.name}", + highlight=True, + ) + + def recurse(tree: "Tree", layout: "Layout") -> None: + for child in layout._children: + recurse( + tree.add( + summary(child), + guide_style=f"layout.tree.{child.splitter.name}", + ), + child, + ) + + recurse(tree, self) + return tree + + def split( + self, + *layouts: Union["Layout", RenderableType], + splitter: Union[Splitter, str] = "column", + ) -> None: + """Split the layout in to multiple sub-layouts. + + Args: + *layouts (Layout): Positional arguments should be (sub) Layout instances. + splitter (Union[Splitter, str]): Splitter instance or name of splitter. + """ + _layouts = [ + layout if isinstance(layout, Layout) else Layout(layout) + for layout in layouts + ] + try: + self.splitter = ( + splitter + if isinstance(splitter, Splitter) + else self.splitters[splitter]() + ) + except KeyError: + raise NoSplitter(f"No splitter called {splitter!r}") + self._children[:] = _layouts + + def add_split(self, *layouts: Union["Layout", RenderableType]) -> None: + """Add a new layout(s) to existing split. + + Args: + *layouts (Union[Layout, RenderableType]): Positional arguments should be renderables or (sub) Layout instances. + + """ + _layouts = ( + layout if isinstance(layout, Layout) else Layout(layout) + for layout in layouts + ) + self._children.extend(_layouts) + + def split_row(self, *layouts: Union["Layout", RenderableType]) -> None: + """Split the layout in to a row (layouts side by side). + + Args: + *layouts (Layout): Positional arguments should be (sub) Layout instances. + """ + self.split(*layouts, splitter="row") + + def split_column(self, *layouts: Union["Layout", RenderableType]) -> None: + """Split the layout in to a column (layouts stacked on top of each other). + + Args: + *layouts (Layout): Positional arguments should be (sub) Layout instances. + """ + self.split(*layouts, splitter="column") + + def unsplit(self) -> None: + """Reset splits to initial state.""" + del self._children[:] + + def update(self, renderable: RenderableType) -> None: + """Update renderable. + + Args: + renderable (RenderableType): New renderable object. + """ + with self._lock: + self._renderable = renderable + + def refresh_screen(self, console: "Console", layout_name: str) -> None: + """Refresh a sub-layout. + + Args: + console (Console): Console instance where Layout is to be rendered. + layout_name (str): Name of layout. + """ + with self._lock: + layout = self[layout_name] + region, _lines = self._render_map[layout] + (x, y, width, height) = region + lines = console.render_lines( + layout, console.options.update_dimensions(width, height) + ) + self._render_map[layout] = LayoutRender(region, lines) + console.update_screen_lines(lines, x, y) + + def _make_region_map(self, width: int, height: int) -> RegionMap: + """Create a dict that maps layout on to Region.""" + stack: List[Tuple[Layout, Region]] = [(self, Region(0, 0, width, height))] + push = stack.append + pop = stack.pop + layout_regions: List[Tuple[Layout, Region]] = [] + append_layout_region = layout_regions.append + while stack: + append_layout_region(pop()) + layout, region = layout_regions[-1] + children = layout.children + if children: + for child_and_region in layout.splitter.divide(children, region): + push(child_and_region) + + region_map = { + layout: region + for layout, region in sorted(layout_regions, key=itemgetter(1)) + } + return region_map + + def render(self, console: Console, options: ConsoleOptions) -> RenderMap: + """Render the sub_layouts. + + Args: + console (Console): Console instance. + options (ConsoleOptions): Console options. + + Returns: + RenderMap: A dict that maps Layout on to a tuple of Region, lines + """ + render_width = options.max_width + render_height = options.height or console.height + region_map = self._make_region_map(render_width, render_height) + layout_regions = [ + (layout, region) + for layout, region in region_map.items() + if not layout.children + ] + render_map: Dict["Layout", "LayoutRender"] = {} + render_lines = console.render_lines + update_dimensions = options.update_dimensions + + for layout, region in layout_regions: + lines = render_lines( + layout.renderable, update_dimensions(region.width, region.height) + ) + render_map[layout] = LayoutRender(region, lines) + return render_map + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + with self._lock: + width = options.max_width or console.width + height = options.height or console.height + render_map = self.render(console, options.update_dimensions(width, height)) + self._render_map = render_map + layout_lines: List[List[Segment]] = [[] for _ in range(height)] + _islice = islice + for (region, lines) in render_map.values(): + _x, y, _layout_width, layout_height = region + for row, line in zip( + _islice(layout_lines, y, y + layout_height), lines + ): + row.extend(line) + + new_line = Segment.line() + for layout_row in layout_lines: + yield from layout_row + yield new_line + + +if __name__ == "__main__": + from rich.console import Console + + console = Console() + layout = Layout() + + layout.split_column( + Layout(name="header", size=3), + Layout(ratio=1, name="main"), + Layout(size=10, name="footer"), + ) + + layout["main"].split_row(Layout(name="side"), Layout(name="body", ratio=2)) + + layout["body"].split_row(Layout(name="content", ratio=2), Layout(name="s2")) + + layout["s2"].split_column( + Layout(name="top"), Layout(name="middle"), Layout(name="bottom") + ) + + layout["side"].split_column(Layout(layout.tree, name="left1"), Layout(name="left2")) + + layout["content"].update("foo") + + console.print(layout) diff --git a/rich/live.py b/rich/live.py new file mode 100644 index 0000000000..6db5b605f9 --- /dev/null +++ b/rich/live.py @@ -0,0 +1,365 @@ +import sys +from threading import Event, RLock, Thread +from types import TracebackType +from typing import IO, Any, Callable, List, Optional, TextIO, Type, cast + +from . import get_console +from .console import Console, ConsoleRenderable, RenderableType, RenderHook +from .control import Control +from .file_proxy import FileProxy +from .jupyter import JupyterMixin +from .live_render import LiveRender, VerticalOverflowMethod +from .screen import Screen +from .text import Text + + +class _RefreshThread(Thread): + """A thread that calls refresh() at regular intervals.""" + + def __init__(self, live: "Live", refresh_per_second: float) -> None: + self.live = live + self.refresh_per_second = refresh_per_second + self.done = Event() + super().__init__(daemon=True) + + def stop(self) -> None: + self.done.set() + + def run(self) -> None: + while not self.done.wait(1 / self.refresh_per_second): + with self.live._lock: + if not self.done.is_set(): + self.live.refresh() + + +class Live(JupyterMixin, RenderHook): + """Renders an auto-updating live display of any given renderable. + + Args: + renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing. + console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. + screen (bool, optional): Enable alternate screen mode. Defaults to False. + auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True + refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4. + transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). Defaults to False. + redirect_stdout (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. + redirect_stderr (bool, optional): Enable redirection of stderr. Defaults to True. + vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis". + get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None. + """ + + def __init__( + self, + renderable: Optional[RenderableType] = None, + *, + console: Optional[Console] = None, + screen: bool = False, + auto_refresh: bool = True, + refresh_per_second: float = 4, + transient: bool = False, + redirect_stdout: bool = True, + redirect_stderr: bool = True, + vertical_overflow: VerticalOverflowMethod = "ellipsis", + get_renderable: Optional[Callable[[], RenderableType]] = None, + ) -> None: + assert refresh_per_second > 0, "refresh_per_second must be > 0" + self._renderable = renderable + self.console = console if console is not None else get_console() + self._screen = screen + self._alt_screen = False + + self._redirect_stdout = redirect_stdout + self._redirect_stderr = redirect_stderr + self._restore_stdout: Optional[IO[str]] = None + self._restore_stderr: Optional[IO[str]] = None + + self._lock = RLock() + self.ipy_widget: Optional[Any] = None + self.auto_refresh = auto_refresh + self._started: bool = False + self.transient = True if screen else transient + + self._refresh_thread: Optional[_RefreshThread] = None + self.refresh_per_second = refresh_per_second + + self.vertical_overflow = vertical_overflow + self._get_renderable = get_renderable + self._live_render = LiveRender( + self.get_renderable(), vertical_overflow=vertical_overflow + ) + + @property + def is_started(self) -> bool: + """Check if live display has been started.""" + return self._started + + def get_renderable(self) -> RenderableType: + renderable = ( + self._get_renderable() + if self._get_renderable is not None + else self._renderable + ) + return renderable or "" + + def start(self, refresh: bool = False) -> None: + """Start live rendering display. + + Args: + refresh (bool, optional): Also refresh. Defaults to False. + """ + with self._lock: + if self._started: + return + self.console.set_live(self) + self._started = True + if self._screen: + self._alt_screen = self.console.set_alt_screen(True) + self.console.show_cursor(False) + self._enable_redirect_io() + self.console.push_render_hook(self) + if refresh: + self.refresh() + if self.auto_refresh: + self._refresh_thread = _RefreshThread(self, self.refresh_per_second) + self._refresh_thread.start() + + def stop(self) -> None: + """Stop live rendering display.""" + with self._lock: + if not self._started: + return + self.console.clear_live() + self._started = False + + if self.auto_refresh and self._refresh_thread is not None: + self._refresh_thread.stop() + self._refresh_thread = None + # allow it to fully render on the last even if overflow + self.vertical_overflow = "visible" + with self.console: + try: + if not self._alt_screen and not self.console.is_jupyter: + self.refresh() + finally: + self._disable_redirect_io() + self.console.pop_render_hook() + if not self._alt_screen and self.console.is_terminal: + self.console.line() + self.console.show_cursor(True) + if self._alt_screen: + self.console.set_alt_screen(False) + + if self.transient and not self._alt_screen: + self.console.control(self._live_render.restore_cursor()) + if self.ipy_widget is not None and self.transient: + self.ipy_widget.close() # pragma: no cover + + def __enter__(self) -> "Live": + self.start(refresh=self._renderable is not None) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.stop() + + def _enable_redirect_io(self) -> None: + """Enable redirecting of stdout / stderr.""" + if self.console.is_terminal or self.console.is_jupyter: + if self._redirect_stdout and not isinstance(sys.stdout, FileProxy): + self._restore_stdout = sys.stdout + sys.stdout = cast("TextIO", FileProxy(self.console, sys.stdout)) + if self._redirect_stderr and not isinstance(sys.stderr, FileProxy): + self._restore_stderr = sys.stderr + sys.stderr = cast("TextIO", FileProxy(self.console, sys.stderr)) + + def _disable_redirect_io(self) -> None: + """Disable redirecting of stdout / stderr.""" + if self._restore_stdout: + sys.stdout = cast("TextIO", self._restore_stdout) + self._restore_stdout = None + if self._restore_stderr: + sys.stderr = cast("TextIO", self._restore_stderr) + self._restore_stderr = None + + @property + def renderable(self) -> RenderableType: + """Get the renderable that is being displayed + + Returns: + RenderableType: Displayed renderable. + """ + renderable = self.get_renderable() + return Screen(renderable) if self._alt_screen else renderable + + def update(self, renderable: RenderableType, *, refresh: bool = False) -> None: + """Update the renderable that is being displayed + + Args: + renderable (RenderableType): New renderable to use. + refresh (bool, optional): Refresh the display. Defaults to False. + """ + with self._lock: + self._renderable = renderable + if refresh: + self.refresh() + + def refresh(self) -> None: + """Update the display of the Live Render.""" + with self._lock: + self._live_render.set_renderable(self.renderable) + if self.console.is_jupyter: # pragma: no cover + try: + from IPython.display import display + from ipywidgets import Output + except ImportError: + import warnings + + warnings.warn('install "ipywidgets" for Jupyter support') + else: + if self.ipy_widget is None: + self.ipy_widget = Output() + display(self.ipy_widget) + + with self.ipy_widget: + self.ipy_widget.clear_output(wait=True) + self.console.print(self._live_render.renderable) + elif self.console.is_terminal and not self.console.is_dumb_terminal: + with self.console: + self.console.print(Control()) + elif ( + not self._started and not self.transient + ): # if it is finished allow files or dumb-terminals to see final result + with self.console: + self.console.print(Control()) + + def process_renderables( + self, renderables: List[ConsoleRenderable] + ) -> List[ConsoleRenderable]: + """Process renderables to restore cursor and display progress.""" + self._live_render.vertical_overflow = self.vertical_overflow + if self.console.is_interactive: + # lock needs acquiring as user can modify live_render renderable at any time unlike in Progress. + with self._lock: + reset = ( + Control.home() + if self._alt_screen + else self._live_render.position_cursor() + ) + renderables = [reset, *renderables, self._live_render] + elif ( + not self._started and not self.transient + ): # if it is finished render the final output for files or dumb_terminals + renderables = [*renderables, self._live_render] + + return renderables + + +if __name__ == "__main__": # pragma: no cover + import random + import time + from itertools import cycle + from typing import Dict, List, Tuple + + from .align import Align + from .console import Console + from .live import Live as Live + from .panel import Panel + from .rule import Rule + from .syntax import Syntax + from .table import Table + + console = Console() + + syntax = Syntax( + '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value''', + "python", + line_numbers=True, + ) + + table = Table("foo", "bar", "baz") + table.add_row("1", "2", "3") + + progress_renderables = [ + "You can make the terminal shorter and taller to see the live table hide" + "Text may be printed while the progress bars are rendering.", + Panel("In fact, [i]any[/i] renderable will work"), + "Such as [magenta]tables[/]...", + table, + "Pretty printed structures...", + {"type": "example", "text": "Pretty printed"}, + "Syntax...", + syntax, + Rule("Give it a try!"), + ] + + examples = cycle(progress_renderables) + + exchanges = [ + "SGD", + "MYR", + "EUR", + "USD", + "AUD", + "JPY", + "CNH", + "HKD", + "CAD", + "INR", + "DKK", + "GBP", + "RUB", + "NZD", + "MXN", + "IDR", + "TWD", + "THB", + "VND", + ] + with Live(console=console) as live_table: + exchange_rate_dict: Dict[Tuple[str, str], float] = {} + + for index in range(100): + select_exchange = exchanges[index % len(exchanges)] + + for exchange in exchanges: + if exchange == select_exchange: + continue + time.sleep(0.4) + if random.randint(0, 10) < 1: + console.log(next(examples)) + exchange_rate_dict[(select_exchange, exchange)] = 200 / ( + (random.random() * 320) + 1 + ) + if len(exchange_rate_dict) > len(exchanges) - 1: + exchange_rate_dict.pop(list(exchange_rate_dict.keys())[0]) + table = Table(title="Exchange Rates") + + table.add_column("Source Currency") + table.add_column("Destination Currency") + table.add_column("Exchange Rate") + + for ((source, dest), exchange_rate) in exchange_rate_dict.items(): + table.add_row( + source, + dest, + Text( + f"{exchange_rate:.4f}", + style="red" if exchange_rate < 1.0 else "green", + ), + ) + + live_table.update(Align.center(table)) diff --git a/rich/live_render.py b/rich/live_render.py index 1c2a80194a..f6fa7b2daa 100644 --- a/rich/live_render.py +++ b/rich/live_render.py @@ -1,10 +1,20 @@ +import sys from typing import Optional, Tuple +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal # pragma: no cover + + +from ._loop import loop_last from .console import Console, ConsoleOptions, RenderableType, RenderResult from .control import Control -from .segment import Segment +from .segment import ControlType, Segment from .style import StyleType -from ._loop import loop_last +from .text import Text + +VerticalOverflowMethod = Literal["crop", "ellipsis", "visible"] class LiveRender: @@ -15,9 +25,15 @@ class LiveRender: style (StyleType, optional): An optional style to apply to the renderable. Defaults to "". """ - def __init__(self, renderable: RenderableType, style: StyleType = "") -> None: + def __init__( + self, + renderable: RenderableType, + style: StyleType = "", + vertical_overflow: VerticalOverflowMethod = "ellipsis", + ) -> None: self.renderable = renderable self.style = style + self.vertical_overflow = vertical_overflow self._shape: Optional[Tuple[int, int]] = None def set_renderable(self, renderable: RenderableType) -> None: @@ -36,8 +52,18 @@ def position_cursor(self) -> Control: """ if self._shape is not None: _, height = self._shape - return Control("\r\x1b[2K" + "\x1b[1A\x1b[2K" * (height - 1)) - return Control("") + return Control( + ControlType.CARRIAGE_RETURN, + (ControlType.ERASE_IN_LINE, 2), + *( + ( + (ControlType.CURSOR_UP, 1), + (ControlType.ERASE_IN_LINE, 2), + ) + * (height - 1) + ) + ) + return Control() def restore_cursor(self) -> Control: """Get control codes to clear the render and restore the cursor to its previous position. @@ -47,29 +73,41 @@ def restore_cursor(self) -> Control: """ if self._shape is not None: _, height = self._shape - return Control("\r" + "\x1b[1A\x1b[2K" * height) - return Control("") + return Control( + ControlType.CARRIAGE_RETURN, + *((ControlType.CURSOR_UP, 1), (ControlType.ERASE_IN_LINE, 2)) * height + ) + return Control() def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: + + renderable = self.renderable style = console.get_style(self.style) - lines = console.render_lines(self.renderable, options, style=style, pad=False) - _Segment = Segment - shape = _Segment.get_shape(lines) - if self._shape is None: - self._shape = shape - else: - width1, height1 = shape - width2, height2 = self._shape - self._shape = ( - max(width1, min(options.max_width, width2)), - max(height1, height2), - ) + lines = console.render_lines(renderable, options, style=style, pad=False) + shape = Segment.get_shape(lines) + + _, height = shape + if height > options.size.height: + if self.vertical_overflow == "crop": + lines = lines[: options.size.height] + shape = Segment.get_shape(lines) + elif self.vertical_overflow == "ellipsis": + lines = lines[: (options.size.height - 1)] + overflow_text = Text( + "...", + overflow="crop", + justify="center", + end="", + style="live.ellipsis", + ) + lines.append(list(console.render(overflow_text))) + shape = Segment.get_shape(lines) + self._shape = shape - width, height = self._shape - lines = _Segment.set_shape(lines, width, height) + new_line = Segment.line() for last, line in loop_last(lines): - yield from _Segment.make_control(line) + yield from line if not last: - yield _Segment.line(is_control=True) + yield new_line diff --git a/rich/logging.py b/rich/logging.py index 6239d44f69..58188fd8a8 100644 --- a/rich/logging.py +++ b/rich/logging.py @@ -2,11 +2,12 @@ from datetime import datetime from logging import Handler, LogRecord from pathlib import Path -from typing import ClassVar, List, Optional, Type +from types import ModuleType +from typing import ClassVar, List, Optional, Iterable, Type, Union from . import get_console -from ._log_render import LogRender -from .console import Console +from ._log_render import LogRender, FormatTimeCallable +from .console import Console, ConsoleRenderable from .highlighter import Highlighter, ReprHighlighter from .text import Text from .traceback import Traceback @@ -21,10 +22,11 @@ class RichHandler(Handler): under your control. If a dependency writes messages containing square brackets, it may not produce the intended output. Args: - level (int, optional): Log level. Defaults to logging.NOTSET. + level (Union[int, str], optional): Log level. Defaults to logging.NOTSET. console (:class:`~rich.console.Console`, optional): Optional console instance to write logs. Default will use a global console instance writing to stdout. show_time (bool, optional): Show a column for the time. Defaults to True. + omit_repeated_times (bool, optional): Omit repetition of the same time. Defaults to True. show_level (bool, optional): Show a column for the level. Defaults to True. show_path (bool, optional): Show the path to the original log call. Defaults to True. enable_link_path (bool, optional): Enable terminal link of path column to file. Defaults to True. @@ -34,11 +36,14 @@ class RichHandler(Handler): tracebacks_width (Optional[int], optional): Number of characters used to render tracebacks, or None for full width. Defaults to None. tracebacks_extra_lines (int, optional): Additional lines of code to render tracebacks, or None for full width. Defaults to None. tracebacks_theme (str, optional): Override pygments theme used in traceback. - tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to False. + tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True. tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False. + tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%x %X] ". + keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``. """ KEYWORDS: ClassVar[Optional[List[str]]] = [ @@ -55,14 +60,15 @@ class RichHandler(Handler): def __init__( self, - level: int = logging.NOTSET, - console: Console = None, + level: Union[int, str] = logging.NOTSET, + console: Optional[Console] = None, *, show_time: bool = True, + omit_repeated_times: bool = True, show_level: bool = True, show_path: bool = True, enable_link_path: bool = True, - highlighter: Highlighter = None, + highlighter: Optional[Highlighter] = None, markup: bool = False, rich_tracebacks: bool = False, tracebacks_width: Optional[int] = None, @@ -70,8 +76,11 @@ def __init__( tracebacks_theme: Optional[str] = None, tracebacks_word_wrap: bool = True, tracebacks_show_locals: bool = False, + tracebacks_suppress: Iterable[Union[str, ModuleType]] = (), locals_max_length: int = 10, locals_max_string: int = 80, + log_time_format: Union[str, FormatTimeCallable] = "[%x %X]", + keywords: Optional[List[str]] = None, ) -> None: super().__init__(level=level) self.console = console or get_console() @@ -80,6 +89,8 @@ def __init__( show_time=show_time, show_level=show_level, show_path=show_path, + time_format=log_time_format, + omit_repeated_times=omit_repeated_times, level_width=None, ) self.enable_link_path = enable_link_path @@ -90,8 +101,10 @@ def __init__( self.tracebacks_theme = tracebacks_theme self.tracebacks_word_wrap = tracebacks_word_wrap self.tracebacks_show_locals = tracebacks_show_locals + self.tracebacks_suppress = tracebacks_suppress self.locals_max_length = locals_max_length self.locals_max_string = locals_max_string + self.keywords = keywords def get_level_text(self, record: LogRecord) -> Text: """Get the level name from the record. @@ -110,12 +123,7 @@ def get_level_text(self, record: LogRecord) -> Text: def emit(self, record: LogRecord) -> None: """Invoked by logging.""" - path = Path(record.pathname).name - level = self.get_level_text(record) message = self.format(record) - time_format = None if self.formatter is None else self.formatter.datefmt - log_time = datetime.fromtimestamp(record.created) - traceback = None if ( self.rich_tracebacks @@ -136,41 +144,89 @@ def emit(self, record: LogRecord) -> None: show_locals=self.tracebacks_show_locals, locals_max_length=self.locals_max_length, locals_max_string=self.locals_max_string, + suppress=self.tracebacks_suppress, ) message = record.getMessage() + if self.formatter: + record.message = record.getMessage() + formatter = self.formatter + if hasattr(formatter, "usesTime") and formatter.usesTime(): + record.asctime = formatter.formatTime(record, formatter.datefmt) + message = formatter.formatMessage(record) - use_markup = ( - getattr(record, "markup") if hasattr(record, "markup") else self.markup + message_renderable = self.render_message(record, message) + log_renderable = self.render( + record=record, traceback=traceback, message_renderable=message_renderable ) - if use_markup: - message_text = Text.from_markup(message) - else: - message_text = Text(message) - - if self.highlighter: - message_text = self.highlighter(message_text) - if self.KEYWORDS: - message_text.highlight_words(self.KEYWORDS, "logging.keyword") - - self.console.print( - self._log_render( - self.console, - [message_text] if not traceback else [message_text, traceback], - log_time=log_time, - time_format=time_format, - level=level, - path=path, - line_no=record.lineno, - link_path=record.pathname if self.enable_link_path else None, - ) + try: + self.console.print(log_renderable) + except Exception: + self.handleError(record) + + def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable": + """Render message text in to Text. + + record (LogRecord): logging Record. + message (str): String containing log message. + + Returns: + ConsoleRenderable: Renderable to display log message. + """ + use_markup = getattr(record, "markup", self.markup) + message_text = Text.from_markup(message) if use_markup else Text(message) + + highlighter = getattr(record, "highlighter", self.highlighter) + if highlighter: + message_text = highlighter(message_text) + + if self.keywords is None: + self.keywords = self.KEYWORDS + + if self.keywords: + message_text.highlight_words(self.keywords, "logging.keyword") + + return message_text + + def render( + self, + *, + record: LogRecord, + traceback: Optional[Traceback], + message_renderable: "ConsoleRenderable", + ) -> "ConsoleRenderable": + """Render log for display. + + Args: + record (LogRecord): logging Record. + traceback (Optional[Traceback]): Traceback instance or None for no Traceback. + message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents. + + Returns: + ConsoleRenderable: Renderable to display log. + """ + path = Path(record.pathname).name + level = self.get_level_text(record) + time_format = None if self.formatter is None else self.formatter.datefmt + log_time = datetime.fromtimestamp(record.created) + + log_renderable = self._log_render( + self.console, + [message_renderable] if not traceback else [message_renderable, traceback], + log_time=log_time, + time_format=time_format, + level=level, + path=path, + line_no=record.lineno, + link_path=record.pathname if self.enable_link_path else None, ) + return log_renderable if __name__ == "__main__": # pragma: no cover from time import sleep FORMAT = "%(message)s" - # FORMAT = "%(asctime)-15s - %(level) - %(message)s" + # FORMAT = "%(asctime)-15s - %(levelname)s - %(message)s" logging.basicConfig( level="NOTSET", format=FORMAT, @@ -207,7 +263,7 @@ def emit(self, record: LogRecord) -> None: log.info("POST /admin/ 401 42234") log.warning("password was rejected for admin site.") - def divide(): + def divide() -> None: number = 1 divisor = 0 foos = ["foo"] * 100 diff --git a/rich/markdown.py b/rich/markdown.py index 0d2d2f2589..b3e6504197 100644 --- a/rich/markdown.py +++ b/rich/markdown.py @@ -5,11 +5,12 @@ from . import box from ._loop import loop_first from ._stack import Stack -from .console import Console, ConsoleOptions, JustifyMethod, RenderResult, Segment +from .console import Console, ConsoleOptions, JustifyMethod, RenderResult from .containers import Renderables from .jupyter import JupyterMixin from .panel import Panel from .rule import Rule +from .segment import Segment from .style import Style, StyleStack from .syntax import Syntax from .text import Text, TextType @@ -24,7 +25,7 @@ def create(cls, markdown: "Markdown", node: Any) -> "MarkdownElement": """Factory to create markdown element, Args: - markdown (Markdown): THe parent Markdown object. + markdown (Markdown): The parent Markdown object. node (Any): A node from Pygments. Returns: @@ -32,7 +33,7 @@ def create(cls, markdown: "Markdown", node: Any) -> "MarkdownElement": """ return cls() - def on_enter(self, context: "MarkdownContext"): + def on_enter(self, context: "MarkdownContext") -> None: """Called when the node is entered. Args: @@ -107,7 +108,7 @@ class Paragraph(TextElement): justify: JustifyMethod @classmethod - def create(cls, markdown: "Markdown", node) -> "Paragraph": + def create(cls, markdown: "Markdown", node: MarkdownElement) -> "Paragraph": return cls(justify=markdown.justify or "left") def __init__(self, justify: JustifyMethod) -> None: @@ -176,7 +177,7 @@ def __rich_console__( ) -> RenderResult: code = str(self.text).rstrip() syntax = Panel( - Syntax(code, self.lexer_name, theme=self.theme), + Syntax(code, self.lexer_name, theme=self.theme, word_wrap=True), border_style="dim", box=box.SQUARE, ) @@ -311,7 +312,7 @@ def create(cls, markdown: "Markdown", node: Any) -> "MarkdownElement": """Factory to create markdown element, Args: - markdown (Markdown): THe parent Markdown object. + markdown (Markdown): The parent Markdown object. node (Any): A node from Pygments. Returns: @@ -348,7 +349,7 @@ def __init__( console: Console, options: ConsoleOptions, style: Style, - inline_code_lexer: str = None, + inline_code_lexer: Optional[str] = None, inline_code_theme: str = "monokai", ) -> None: self.console = console @@ -367,7 +368,7 @@ def current_style(self) -> Style: def on_text(self, text: str, node_type: str) -> None: """Called when the parser visits text.""" - if node_type == "code" and self._syntax is not None: + if node_type in "code" and self._syntax is not None: highlight_text = self._syntax.highlight(text) highlight_text.rstrip() self.stack.top.on_text( @@ -398,7 +399,7 @@ class Markdown(JupyterMixin): style (Union[str, Style], optional): Optional style to apply to markdown. hyperlinks (bool, optional): Enable hyperlinks. Defaults to ``True``. inline_code_lexer: (str, optional): Lexer to use if inline code highlighting is - enabled. Defaults to "python". + enabled. Defaults to None. inline_code_theme: (Optional[str], optional): Pygments theme for inline code highlighting, or None for no highlighting. Defaults to None. """ @@ -419,17 +420,17 @@ def __init__( self, markup: str, code_theme: str = "monokai", - justify: JustifyMethod = None, + justify: Optional[JustifyMethod] = None, style: Union[str, Style] = "none", hyperlinks: bool = True, - inline_code_lexer: str = None, - inline_code_theme: str = None, + inline_code_lexer: Optional[str] = None, + inline_code_theme: Optional[str] = None, ) -> None: self.markup = markup parser = Parser() self.parsed = parser.parse(markup) self.code_theme = code_theme - self.justify = justify + self.justify: Optional[JustifyMethod] = justify self.style = style self.hyperlinks = hyperlinks self.inline_code_lexer = inline_code_lexer @@ -440,6 +441,7 @@ def __rich_console__( ) -> RenderResult: """Render markdown to the console.""" style = console.get_style(self.style, default="none") + options = options.update(height=None) context = MarkdownContext( console, options, @@ -517,21 +519,29 @@ def __rich_console__( if current.literal: element.on_text(context, current.literal.rstrip()) context.stack.pop() - if new_line: - yield Segment("\n") - yield from console.render(element, context.options) - element.on_leave(context) + if context.stack.top.on_child_close(context, element): + if new_line: + yield Segment("\n") + yield from console.render(element, context.options) + element.on_leave(context) + else: + element.on_leave(context) new_line = element.new_line if __name__ == "__main__": # pragma: no cover import argparse + import sys parser = argparse.ArgumentParser( description="Render Markdown to the console with Rich" ) - parser.add_argument("path", metavar="PATH", help="path to markdown file") + parser.add_argument( + "path", + metavar="PATH", + help="path to markdown file, or - for stdin", + ) parser.add_argument( "-c", "--force-color", @@ -587,23 +597,28 @@ def __rich_console__( from rich.console import Console - with open(args.path, "rt", encoding="utf-8") as markdown_file: - markdown = Markdown( - markdown_file.read(), - justify="full" if args.justify else "left", - code_theme=args.code_theme, - hyperlinks=args.hyperlinks, - inline_code_lexer=args.inline_code_lexer, - ) + if args.path == "-": + markdown_body = sys.stdin.read() + else: + with open(args.path, "rt", encoding="utf-8") as markdown_file: + markdown_body = markdown_file.read() + markdown = Markdown( + markdown_body, + justify="full" if args.justify else "left", + code_theme=args.code_theme, + hyperlinks=args.hyperlinks, + inline_code_lexer=args.inline_code_lexer, + ) if args.page: import pydoc import io + fileio = io.StringIO() console = Console( - file=io.StringIO(), force_terminal=args.force_color, width=args.width + file=fileio, force_terminal=args.force_color, width=args.width ) console.print(markdown) - pydoc.pager(console.file.getvalue()) # type: ignore + pydoc.pager(fileio.getvalue()) else: console = Console(force_terminal=args.force_color, width=args.width) diff --git a/rich/markup.py b/rich/markup.py index 61fb103e19..0ffd056dde 100644 --- a/rich/markup.py +++ b/rich/markup.py @@ -1,20 +1,21 @@ import re -from typing import Iterable, List, NamedTuple, Optional, Tuple, Union +from ast import literal_eval +from operator import attrgetter +from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union +from ._emoji_replace import _emoji_replace +from .emoji import EmojiVariant from .errors import MarkupError from .style import Style from .text import Span, Text -from ._emoji_replace import _emoji_replace - RE_TAGS = re.compile( - r""" -(\\\[)| -\[([a-z#\/].*?)\] -""", + r"""((\\*)\[([a-z#/@][^[]*?)])""", re.VERBOSE, ) +RE_HANDLER = re.compile(r"^([\w.]*?)(\(.*?\))?$") + class Tag(NamedTuple): """A tag in console markup.""" @@ -39,7 +40,15 @@ def markup(self) -> str: ) -def escape(markup: str) -> str: +_ReStringMatch = Match[str] # regex match object +_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub +_EscapeSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re + + +def escape( + markup: str, + _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@][^[]*?])").sub, +) -> str: """Escapes text so that it won't be interpreted as markup. Args: @@ -48,7 +57,14 @@ def escape(markup: str) -> str: Returns: str: Markup with square brackets escaped. """ - return markup.replace("[", r"\[") + + def escape_backslashes(match: Match[str]) -> str: + """Called by re.sub replace matches.""" + backslashes, text = match.groups() + return f"{backslashes}{backslashes}\\{text}" + + markup = _escape(escape_backslashes, markup) + return markup def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]: @@ -59,25 +75,37 @@ def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]: """ position = 0 + _divmod = divmod + _Tag = Tag for match in RE_TAGS.finditer(markup): - (escape_open, tag_text) = match.groups() + full_text, escapes, tag_text = match.groups() start, end = match.span() if start > position: yield start, markup[position:start], None - if escape_open: - yield start, "[", None - else: - text, equals, parameters = tag_text.partition("=") - if equals: - yield start, None, Tag(text, parameters) - else: - yield start, None, Tag(tag_text.strip(), None) + if escapes: + backslashes, escaped = _divmod(len(escapes), 2) + if backslashes: + # Literal backslashes + yield start, "\\" * backslashes, None + start += backslashes * 2 + if escaped: + # Escape of tag + yield start, full_text[len(escapes) :], None + position = end + continue + text, equals, parameters = tag_text.partition("=") + yield start, None, _Tag(text, parameters if equals else None) position = end if position < len(markup): yield position, markup[position:], None -def render(markup: str, style: Union[str, Style] = "", emoji: bool = True) -> Text: +def render( + markup: str, + style: Union[str, Style] = "", + emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, +) -> Text: """Render console markup in to a Text instance. Args: @@ -92,7 +120,10 @@ def render(markup: str, style: Union[str, Style] = "", emoji: bool = True) -> Te """ emoji_replace = _emoji_replace if "[" not in markup: - return Text(emoji_replace(markup) if emoji else markup, style=style) + return Text( + emoji_replace(markup, default_variant=emoji_variant) if emoji else markup, + style=style, + ) text = Text(style=style) append = text.append normalize = Style.normalize @@ -104,6 +135,7 @@ def render(markup: str, style: Union[str, Style] = "", emoji: bool = True) -> Te append_span = spans.append _Span = Span + _Tag = Tag def pop_style(style_name: str) -> Tuple[int, Tag]: """Pop tag matching given style name.""" @@ -114,10 +146,13 @@ def pop_style(style_name: str) -> Tuple[int, Tag]: for position, plain_text, tag in _parse(markup): if plain_text is not None: + # Handle open brace escapes, where the brace is not part of a tag. + plain_text = plain_text.replace("\\[", "[") append(emoji_replace(plain_text) if emoji else plain_text) elif tag is not None: if tag.name.startswith("/"): # Closing tag style_name = tag.name[1:].strip() + if style_name: # explicit close style_name = normalize(style_name) try: @@ -125,43 +160,87 @@ def pop_style(style_name: str) -> Tuple[int, Tag]: except KeyError: raise MarkupError( f"closing tag '{tag.markup}' at position {position} doesn't match any open tag" - ) + ) from None else: # implicit close try: start, open_tag = pop() except IndexError: raise MarkupError( f"closing tag '[/]' at position {position} has nothing to close" + ) from None + + if open_tag.name.startswith("@"): + if open_tag.parameters: + handler_name = "" + parameters = open_tag.parameters.strip() + handler_match = RE_HANDLER.match(parameters) + if handler_match is not None: + handler_name, match_parameters = handler_match.groups() + parameters = ( + "()" if match_parameters is None else match_parameters + ) + + try: + meta_params = literal_eval(parameters) + except SyntaxError as error: + raise MarkupError( + f"error parsing {parameters!r} in {open_tag.parameters!r}; {error.msg}" + ) + except Exception as error: + raise MarkupError( + f"error parsing {open_tag.parameters!r}; {error}" + ) from None + + if handler_name: + meta_params = ( + handler_name, + meta_params + if isinstance(meta_params, tuple) + else (meta_params,), + ) + + else: + meta_params = () + + append_span( + _Span( + start, len(text), Style(meta={open_tag.name: meta_params}) ) + ) + else: + append_span(_Span(start, len(text), str(open_tag))) - append_span(_Span(start, len(text), str(open_tag))) else: # Opening tag - normalized_tag = Tag(normalize(tag.name), tag.parameters) + normalized_tag = _Tag(normalize(tag.name), tag.parameters) style_stack.append((len(text), normalized_tag)) text_length = len(text) while style_stack: start, tag = style_stack.pop() - append_span(_Span(start, text_length, str(tag))) + style = str(tag) + if style: + append_span(_Span(start, text_length, style)) - text.spans = sorted(spans) + text.spans = sorted(spans[::-1], key=attrgetter("start")) return text if __name__ == "__main__": # pragma: no cover - # from rich import print - from rich.console import Console - from rich.text import Text - console = Console(highlight=False) + MARKUP = [ + "[red]Hello World[/red]", + "[magenta]Hello [b]World[/b]", + "[bold]Bold[italic] bold and italic [/bold]italic[/italic]", + "Click [link=https://www.willmcgugan.com]here[/link] to visit my Blog", + ":warning-emoji: [bold red blink] DANGER![/]", + ] - # t = Text.from_markup('Hello [link="https://www.willmcgugan.com"]W[b]o[/b]rld[/]!') - # print(repr(t._spans)) + from rich import print + from rich.table import Table - console.print("Hello [1], [1,2,3] ['hello']") - console.print("foo") - console.print("Hello [link=https://www.willmcgugan.com]W[b]o[/b]rld[/]!") + grid = Table("Markup", "Result", padding=(0, 1)) - # console.print("[bold]1 [not bold]2[/] 3[/]") + for markup in MARKUP: + grid.add_row(Text(markup), markup) - # console.print("[green]XXX[blue]XXX[/]XXX[/]") + print(grid) diff --git a/rich/measure.py b/rich/measure.py index 8089bf0794..a508ffa80b 100644 --- a/rich/measure.py +++ b/rich/measure.py @@ -1,11 +1,11 @@ from operator import itemgetter -from typing import Iterable, NamedTuple, TYPE_CHECKING +from typing import TYPE_CHECKING, Callable, NamedTuple, Optional, Sequence from . import errors -from .protocol import is_renderable +from .protocol import is_renderable, rich_cast if TYPE_CHECKING: - from .console import Console, RenderableType + from .console import Console, ConsoleOptions, RenderableType class Measurement(NamedTuple): @@ -56,7 +56,9 @@ def with_minimum(self, width: int) -> "Measurement": width = max(0, width) return Measurement(max(minimum, width), max(maximum, width)) - def clamp(self, min_width: int = None, max_width: int = None) -> "Measurement": + def clamp( + self, min_width: Optional[int] = None, max_width: Optional[int] = None + ) -> "Measurement": """Clamp a measurement within the specified range. Args: @@ -75,15 +77,14 @@ def clamp(self, min_width: int = None, max_width: int = None) -> "Measurement": @classmethod def get( - cls, console: "Console", renderable: "RenderableType", max_width: int = None + cls, console: "Console", options: "ConsoleOptions", renderable: "RenderableType" ) -> "Measurement": """Get a measurement for a renderable. Args: console (~rich.console.Console): Console instance. + options (~rich.console.ConsoleOptions): Console options. renderable (RenderableType): An object that may be rendered with Rich. - max_width (int, optional): The maximum width available, or None to use console.width. - Defaults to None. Raises: errors.NotRenderableError: If the object is not renderable. @@ -91,22 +92,21 @@ def get( Returns: Measurement: Measurement object containing range of character widths required to render the object. """ - from rich.console import RichCast - - _max_width = console.width if max_width is None else max_width + _max_width = options.max_width if _max_width < 1: return Measurement(0, 0) if isinstance(renderable, str): - renderable = console.render_str(renderable) - - if isinstance(renderable, RichCast): - renderable = renderable.__rich__() - + renderable = console.render_str( + renderable, markup=options.markup, highlight=False + ) + renderable = rich_cast(renderable) if is_renderable(renderable): - get_console_width = getattr(renderable, "__rich_measure__", None) + get_console_width: Optional[ + Callable[["Console", "ConsoleOptions"], "Measurement"] + ] = getattr(renderable, "__rich_measure__", None) if get_console_width is not None: render_width = ( - get_console_width(console, _max_width) + get_console_width(console, options) .normalize() .with_maximum(_max_width) ) @@ -123,24 +123,26 @@ def get( def measure_renderables( - console: "Console", renderables: Iterable["RenderableType"], max_width: int + console: "Console", + options: "ConsoleOptions", + renderables: Sequence["RenderableType"], ) -> "Measurement": """Get a measurement that would fit a number of renderables. Args: console (~rich.console.Console): Console instance. + options (~rich.console.ConsoleOptions): Console options. renderables (Iterable[RenderableType]): One or more renderable objects. - max_width (int): The maximum width available. Returns: Measurement: Measurement object containing range of character widths required to - contain all given renderables. + contain all given renderables. """ if not renderables: return Measurement(0, 0) get_measurement = Measurement.get measurements = [ - get_measurement(console, renderable, max_width) for renderable in renderables + get_measurement(console, options, renderable) for renderable in renderables ] measured_width = Measurement( max(measurements, key=itemgetter(0)).minimum, diff --git a/rich/padding.py b/rich/padding.py index 522c6cf800..1d1f4a553c 100644 --- a/rich/padding.py +++ b/rich/padding.py @@ -1,4 +1,4 @@ -from typing import cast, Tuple, TYPE_CHECKING, Union +from typing import cast, List, Optional, Tuple, TYPE_CHECKING, Union if TYPE_CHECKING: from .console import ( @@ -79,46 +79,63 @@ def __repr__(self) -> str: def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": - style = console.get_style(self.style) if self.expand: width = options.max_width else: width = min( - Measurement.get(console, self.renderable, options.max_width).maximum + Measurement.get(console, options, self.renderable).maximum + self.left + self.right, options.max_width, ) - child_options = options.update(width=width - self.left - self.right) + render_options = options.update_width(width - self.left - self.right) + if render_options.height is not None: + render_options = render_options.update_height( + height=render_options.height - self.top - self.bottom + ) lines = console.render_lines( - self.renderable, child_options, style=style, pad=False + self.renderable, render_options, style=style, pad=True ) - lines = Segment.set_shape(lines, child_options.max_width, style=style) - - blank_line = Segment(" " * width + "\n", style) - top = [blank_line] * self.top - bottom = [blank_line] * self.bottom - left = Segment(" " * self.left, style) if self.left else None - right = Segment(" " * self.right, style) if self.right else None - new_line = Segment.line() - yield from top - for line in lines: - if left is not None: - yield left - yield from line - if right is not None: - yield right - yield new_line - yield from bottom + _Segment = Segment - def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": + left = _Segment(" " * self.left, style) if self.left else None + right = ( + [_Segment(f'{" " * self.right}', style), _Segment.line()] + if self.right + else [_Segment.line()] + ) + blank_line: Optional[List[Segment]] = None + if self.top: + blank_line = [_Segment(f'{" " * width}\n', style)] + yield from blank_line * self.top + if left: + for line in lines: + yield left + yield from line + yield from right + else: + for line in lines: + yield from line + yield from right + if self.bottom: + blank_line = blank_line or [_Segment(f'{" " * width}\n', style)] + yield from blank_line * self.bottom + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + max_width = options.max_width extra_width = self.left + self.right if max_width - extra_width < 1: return Measurement(max_width, max_width) - measure_min, measure_max = Measurement.get( - console, self.renderable, max(0, max_width - extra_width) - ) + measure_min, measure_max = Measurement.get(console, options, self.renderable) measurement = Measurement(measure_min + extra_width, measure_max + extra_width) measurement = measurement.with_maximum(max_width) return measurement + + +if __name__ == "__main__": # pragma: no cover + from rich import print + + print(Padding("Hello, World", (2, 4), style="on blue")) diff --git a/rich/pager.py b/rich/pager.py index 52e77ef6da..a3f7aa62af 100644 --- a/rich/pager.py +++ b/rich/pager.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -import pydoc +from typing import Any class Pager(ABC): @@ -17,7 +17,8 @@ def show(self, content: str) -> None: class SystemPager(Pager): """Uses the pager installed on the system.""" - _pager = lambda self, content: pydoc.pager(content) + def _pager(self, content: str) -> Any: #  pragma: no cover + return __import__("pydoc").pager(content) def show(self, content: str) -> None: """Use the same pager used by pydoc.""" diff --git a/rich/palette.py b/rich/palette.py index 3faa23fa93..f29587945c 100644 --- a/rich/palette.py +++ b/rich/palette.py @@ -1,9 +1,12 @@ from math import sqrt from functools import lru_cache -from typing import Sequence, Tuple +from typing import Sequence, Tuple, TYPE_CHECKING from .color_triplet import ColorTriplet +if TYPE_CHECKING: + from rich.table import Table + class Palette: """A palette of available colors.""" @@ -14,6 +17,29 @@ def __init__(self, colors: Sequence[Tuple[int, int, int]]): def __getitem__(self, number: int) -> ColorTriplet: return ColorTriplet(*self._colors[number]) + def __rich__(self) -> "Table": + from rich.color import Color + from rich.style import Style + from rich.text import Text + from rich.table import Table + + table = Table( + "index", + "RGB", + "Color", + title="Palette", + caption=f"{len(self._colors)} colors", + highlight=True, + caption_justify="right", + ) + for index, color in enumerate(self._colors): + table.add_row( + str(index), + repr(color), + Text(" " * 16, style=Style(bgcolor=Color.from_rgb(*color))), + ) + return table + # This is somewhat inefficient and needs caching @lru_cache(maxsize=1024) def match(self, color: Tuple[int, int, int]) -> int: @@ -27,11 +53,12 @@ def match(self, color: Tuple[int, int, int]) -> int: """ red1, green1, blue1 = color _sqrt = sqrt + get_color = self._colors.__getitem__ def get_color_distance(index: int) -> float: """Get the distance to a color.""" - red2, green2, blue2 = self._colors[index] - red_mean = int((red1 + red2) / 2) + red2, green2, blue2 = get_color(index) + red_mean = (red1 + red2) // 2 red = red1 - red2 green = green1 - green2 blue = blue1 - blue2 @@ -43,3 +70,31 @@ def get_color_distance(index: int) -> float: min_index = min(range(len(self._colors)), key=get_color_distance) return min_index + + +if __name__ == "__main__": # pragma: no cover + import colorsys + from typing import Iterable + from rich.color import Color + from rich.console import Console, ConsoleOptions + from rich.segment import Segment + from rich.style import Style + + class ColorBox: + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> Iterable[Segment]: + height = console.size.height - 3 + for y in range(0, height): + for x in range(options.max_width): + h = x / options.max_width + l = y / (height + 1) + r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) + r2, g2, b2 = colorsys.hls_to_rgb(h, l + (1 / height / 2), 1.0) + bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) + color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) + yield Segment("▄", Style(color=color, bgcolor=bgcolor)) + yield Segment.line() + + console = Console() + console.print(ColorBox()) diff --git a/rich/panel.py b/rich/panel.py index 082c6c8c75..fc2807c313 100644 --- a/rich/panel.py +++ b/rich/panel.py @@ -1,14 +1,13 @@ -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional -from .box import Box, ROUNDED - -from .align import AlignValues +from .align import AlignMethod +from .box import ROUNDED, Box from .jupyter import JupyterMixin from .measure import Measurement, measure_renderables from .padding import Padding, PaddingDimensions +from .segment import Segment from .style import StyleType from .text import Text, TextType -from .segment import Segment if TYPE_CHECKING: from .console import Console, ConsoleOptions, RenderableType, RenderResult @@ -30,7 +29,9 @@ class Panel(JupyterMixin): style (str, optional): The style of the panel (border and contents). Defaults to "none". border_style (str, optional): The style of the border. Defaults to "none". width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect. + height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect. padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0. + highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False. """ def __init__( @@ -38,25 +39,33 @@ def __init__( renderable: "RenderableType", box: Box = ROUNDED, *, - title: TextType = None, - title_align: AlignValues = "center", + title: Optional[TextType] = None, + title_align: AlignMethod = "center", + subtitle: Optional[TextType] = None, + subtitle_align: AlignMethod = "center", safe_box: Optional[bool] = None, expand: bool = True, style: StyleType = "none", border_style: StyleType = "none", width: Optional[int] = None, + height: Optional[int] = None, padding: PaddingDimensions = (0, 1), + highlight: bool = False, ) -> None: self.renderable = renderable self.box = box self.title = title - self.title_align = title_align + self.title_align: AlignMethod = title_align + self.subtitle = subtitle + self.subtitle_align = subtitle_align self.safe_box = safe_box self.expand = expand self.style = style self.border_style = border_style self.width = width + self.height = height self.padding = padding + self.highlight = highlight @classmethod def fit( @@ -64,20 +73,24 @@ def fit( renderable: "RenderableType", box: Box = ROUNDED, *, - title: TextType = None, - title_align: AlignValues = "center", + title: Optional[TextType] = None, + title_align: AlignMethod = "center", + subtitle: Optional[TextType] = None, + subtitle_align: AlignMethod = "center", safe_box: Optional[bool] = None, style: StyleType = "none", border_style: StyleType = "none", width: Optional[int] = None, padding: PaddingDimensions = (0, 1), - ): + ) -> "Panel": """An alternative constructor that sets expand=False.""" return cls( renderable, box, title=title, title_align=title_align, + subtitle=subtitle, + subtitle_align=subtitle_align, safe_box=safe_box, style=style, border_style=border_style, @@ -96,11 +109,28 @@ def _title(self) -> Optional[Text]: ) title_text.end = "" title_text.plain = title_text.plain.replace("\n", " ") + title_text.no_wrap = True title_text.expand_tabs() title_text.pad(1) return title_text return None + @property + def _subtitle(self) -> Optional[Text]: + if self.subtitle: + subtitle_text = ( + Text.from_markup(self.subtitle) + if isinstance(self.subtitle, str) + else self.subtitle.copy() + ) + subtitle_text.end = "" + subtitle_text.plain = subtitle_text.plain.replace("\n", " ") + subtitle_text.no_wrap = True + subtitle_text.expand_tabs() + subtitle_text.pad(1) + return subtitle_text + return None + def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": @@ -110,9 +140,13 @@ def __rich_console__( ) style = console.get_style(self.style) border_style = style + console.get_style(self.border_style) - width = options.max_width if self.width is None else self.width + width = ( + options.max_width + if self.width is None + else min(options.max_width, self.width) + ) - safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box # type: ignore + safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box box = self.box.substitute(options, safe=safe_box) title_text = self._title @@ -122,26 +156,33 @@ def __rich_console__( child_width = ( width - 2 if self.expand - else Measurement.get(console, renderable, width - 2).maximum + else console.measure( + renderable, options=options.update_width(width - 2) + ).maximum ) + child_height = self.height or options.height or None + if child_height: + child_height -= 2 if title_text is not None: child_width = min( - options.max_width, max(child_width, title_text.cell_len + 2) + options.max_width - 2, max(child_width, title_text.cell_len + 2) ) width = child_width + 2 - child_options = options.update(width=child_width) + child_options = options.update( + width=child_width, height=child_height, highlight=self.highlight + ) lines = console.render_lines(renderable, child_options, style=style) line_start = Segment(box.mid_left, border_style) line_end = Segment(f"{box.mid_right}", border_style) new_line = Segment.line() - if title_text is None: + if title_text is None or width <= 4: yield Segment(box.get_top([width - 2]), border_style) else: title_text.align(self.title_align, width - 4, character=box.top) yield Segment(box.top_left + box.top, border_style) - yield from console.render(title_text) + yield from console.render(title_text, child_options.update_width(width - 4)) yield Segment(box.top + box.top_right, border_style) yield new_line @@ -150,10 +191,26 @@ def __rich_console__( yield from line yield line_end yield new_line - yield Segment(box.get_bottom([width - 2]), border_style) + + subtitle_text = self._subtitle + if subtitle_text is not None: + subtitle_text.style = border_style + + if subtitle_text is None or width <= 4: + yield Segment(box.get_bottom([width - 2]), border_style) + else: + subtitle_text.align(self.subtitle_align, width - 4, character=box.bottom) + yield Segment(box.bottom_left + box.bottom, border_style) + yield from console.render( + subtitle_text, child_options.update_width(width - 4) + ) + yield Segment(box.bottom + box.bottom_right, border_style) + yield new_line - def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": _title = self._title _, right, _, left = Padding.unpack(self.padding) padding = left + right @@ -162,7 +219,9 @@ def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": if self.width is None: width = ( measure_renderables( - console, renderables, max_width - padding - 2 + console, + options.update_width(options.max_width - padding - 2), + renderables, ).maximum + padding + 2 @@ -177,19 +236,16 @@ def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": c = Console() + from .box import DOUBLE, ROUNDED from .padding import Padding - from .box import ROUNDED, DOUBLE p = Panel( - Panel.fit( - Text.from_markup("[bold magenta]Hello World!"), - box=ROUNDED, - safe_box=True, - style="on red", - ), - title="[b]Hello, World", + "Hello, World!", + title="rich.Panel", + style="white on blue", box=DOUBLE, + padding=1, ) - print(p) + c.print() c.print(p) diff --git a/rich/pretty.py b/rich/pretty.py index 751228a157..1c6b167166 100644 --- a/rich/pretty.py +++ b/rich/pretty.py @@ -1,29 +1,46 @@ import builtins +import collections +import dataclasses +import inspect import os import sys from array import array -from collections import Counter, defaultdict, deque -from dataclasses import dataclass +from collections import Counter, UserDict, UserList, defaultdict, deque +from dataclasses import dataclass, fields, is_dataclass +from inspect import isclass from itertools import islice +from types import MappingProxyType from typing import ( TYPE_CHECKING, Any, Callable, + DefaultDict, Dict, Iterable, List, Optional, + Sequence, Set, Tuple, + Union, ) -from rich.highlighter import ReprHighlighter +from rich.repr import RichReprResult + +try: + import attr as _attr_module + + _has_attrs = True +except ImportError: # pragma: no cover + _has_attrs = False -from .abc import RichRenderable from . import get_console +from ._loop import loop_last from ._pick import pick_bool +from .abc import RichRenderable from .cells import cell_len from .highlighter import ReprHighlighter +from .jupyter import JupyterMixin, JupyterRenderable from .measure import Measurement from .text import Text @@ -38,13 +55,137 @@ ) +def _is_attr_object(obj: Any) -> bool: + """Check if an object was created with attrs module.""" + return _has_attrs and _attr_module.has(type(obj)) + + +def _get_attr_fields(obj: Any) -> Sequence["_attr_module.Attribute[Any]"]: + """Get fields for an attrs object.""" + return _attr_module.fields(type(obj)) if _has_attrs else [] + + +def _is_dataclass_repr(obj: object) -> bool: + """Check if an instance of a dataclass contains the default repr. + + Args: + obj (object): A dataclass instance. + + Returns: + bool: True if the default repr is used, False if there is a custom repr. + """ + # Digging in to a lot of internals here + # Catching all exceptions in case something is missing on a non CPython implementation + try: + return obj.__repr__.__code__.co_filename == dataclasses.__file__ + except Exception: # pragma: no coverage + return False + + +_dummy_namedtuple = collections.namedtuple("_dummy_namedtuple", []) + + +def _has_default_namedtuple_repr(obj: object) -> bool: + """Check if an instance of namedtuple contains the default repr + + Args: + obj (object): A namedtuple + + Returns: + bool: True if the default repr is used, False if there's a custom repr. + """ + obj_file = None + try: + obj_file = inspect.getfile(obj.__repr__) + except (OSError, TypeError): + # OSError handles case where object is defined in __main__ scope, e.g. REPL - no filename available. + # TypeError trapped defensively, in case of object without filename slips through. + pass + default_repr_file = inspect.getfile(_dummy_namedtuple.__repr__) + return obj_file == default_repr_file + + +def _ipy_display_hook( + value: Any, + console: Optional["Console"] = None, + overflow: "OverflowMethod" = "ignore", + crop: bool = False, + indent_guides: bool = False, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + expand_all: bool = False, +) -> None: + from .console import ConsoleRenderable # needed here to prevent circular import + + # always skip rich generated jupyter renderables or None values + if _safe_isinstance(value, JupyterRenderable) or value is None: + return + + console = console or get_console() + if console.is_jupyter: + # Delegate rendering to IPython if the object (and IPython) supports it + # https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display + ipython_repr_methods = [ + "_repr_html_", + "_repr_markdown_", + "_repr_json_", + "_repr_latex_", + "_repr_jpeg_", + "_repr_png_", + "_repr_svg_", + "_repr_mimebundle_", + ] + for repr_method in ipython_repr_methods: + method = getattr(value, repr_method, None) + if inspect.ismethod(method): + # Calling the method ourselves isn't ideal. The interface for the `_repr_*_` methods + # specifies that if they return None, then they should not be rendered + # by the notebook. + try: + repr_result = method() + except Exception: + continue # If the method raises, treat it as if it doesn't exist, try any others + if repr_result is not None: + return # Delegate rendering to IPython + + # certain renderables should start on a new line + if _safe_isinstance(value, ConsoleRenderable): + console.line() + + console.print( + value + if _safe_isinstance(value, RichRenderable) + else Pretty( + value, + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + expand_all=expand_all, + margin=12, + ), + crop=crop, + new_line_start=True, + ) + + +def _safe_isinstance( + obj: object, class_or_tuple: Union[type, Tuple[type, ...]] +) -> bool: + """isinstance can fail in rare cases, for example types with no __class__""" + try: + return isinstance(obj, class_or_tuple) + except Exception: + return False + + def install( - console: "Console" = None, + console: Optional["Console"] = None, overflow: "OverflowMethod" = "ignore", crop: bool = False, indent_guides: bool = False, - max_length: int = None, - max_string: int = None, + max_length: Optional[int] = None, + max_string: Optional[int] = None, expand_all: bool = False, ) -> None: """Install automatic pretty printing in the Python REPL. @@ -57,20 +198,22 @@ def install( max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to None. max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. - expand_all (bool, optional): Expand all containers. Defaults to False + expand_all (bool, optional): Expand all containers. Defaults to False. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. """ from rich import get_console console = console or get_console() + assert console is not None def display_hook(value: Any) -> None: """Replacement sys.displayhook which prettifies objects with Rich.""" if value is not None: assert console is not None - builtins._ = None # type: ignore + builtins._ = None # type: ignore[attr-defined] console.print( value - if isinstance(value, RichRenderable) + if _safe_isinstance(value, RichRenderable) else Pretty( value, overflow=overflow, @@ -81,12 +224,37 @@ def display_hook(value: Any) -> None: ), crop=crop, ) - builtins._ = value # type: ignore + builtins._ = value # type: ignore[attr-defined] + + try: # pragma: no cover + ip = get_ipython() # type: ignore[name-defined] + from IPython.core.formatters import BaseFormatter + + class RichFormatter(BaseFormatter): # type: ignore[misc] + pprint: bool = True + + def __call__(self, value: Any) -> Any: + if self.pprint: + return _ipy_display_hook( + value, + console=get_console(), + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + expand_all=expand_all, + ) + else: + return repr(value) - sys.displayhook = display_hook + # replace plain text formatter with rich formatter + rich_formatter = RichFormatter() + ip.display_formatter.formatters["text/plain"] = rich_formatter + except Exception: + sys.displayhook = display_hook -class Pretty: +class Pretty(JupyterMixin): """A rich renderable that pretty prints an object. Args: @@ -100,43 +268,53 @@ class Pretty: max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to None. max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. + max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. expand_all (bool, optional): Expand all containers. Defaults to False. + margin (int, optional): Subtrace a margin from width to force containers to expand earlier. Defaults to 0. + insert_line (bool, optional): Insert a new line if the output has multiple new lines. Defaults to False. """ def __init__( self, _object: Any, - highlighter: "HighlighterType" = None, + highlighter: Optional["HighlighterType"] = None, *, indent_size: int = 4, - justify: "JustifyMethod" = None, - overflow: Optional["OverflowMethod"] = "crop", + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, no_wrap: Optional[bool] = False, indent_guides: bool = False, - max_length: int = None, - max_string: int = None, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, expand_all: bool = False, + margin: int = 0, + insert_line: bool = False, ) -> None: self._object = _object self.highlighter = highlighter or ReprHighlighter() self.indent_size = indent_size - self.justify = justify - self.overflow = overflow + self.justify: Optional["JustifyMethod"] = justify + self.overflow: Optional["OverflowMethod"] = overflow self.no_wrap = no_wrap self.indent_guides = indent_guides self.max_length = max_length self.max_string = max_string + self.max_depth = max_depth self.expand_all = expand_all + self.margin = margin + self.insert_line = insert_line def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": pretty_str = pretty_repr( self._object, - max_width=options.max_width, + max_width=options.max_width - self.margin, indent_size=self.indent_size, max_length=self.max_length, max_string=self.max_string, + max_depth=self.max_depth, expand_all=self.expand_all, ) pretty_text = Text( @@ -146,26 +324,40 @@ def __rich_console__( no_wrap=pick_bool(self.no_wrap, options.no_wrap), style="pretty", ) - pretty_text = self.highlighter(pretty_text) + pretty_text = ( + self.highlighter(pretty_text) + if pretty_text + else Text( + f"{type(self._object)}.__repr__ returned empty string", + style="dim italic", + ) + ) if self.indent_guides and not options.ascii_only: pretty_text = pretty_text.with_indent_guides( self.indent_size, style="repr.indent" ) + if self.insert_line and "\n" in pretty_text: + yield "" yield pretty_text - def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": pretty_str = pretty_repr( self._object, - max_width=max_width, + max_width=options.max_width, indent_size=self.indent_size, max_length=self.max_length, max_string=self.max_string, + expand_all=self.expand_all, + ) + text_width = ( + max(cell_len(line) for line in pretty_str.splitlines()) if pretty_str else 0 ) - text_width = max(cell_len(line) for line in pretty_str.splitlines()) return Measurement(text_width, text_width) -def _get_braces_for_defaultdict(_object: defaultdict) -> Tuple[str, str, str]: +def _get_braces_for_defaultdict(_object: DefaultDict[Any, Any]) -> Tuple[str, str, str]: return ( f"defaultdict({_object.default_factory!r}, {{", "})", @@ -173,8 +365,8 @@ def _get_braces_for_defaultdict(_object: defaultdict) -> Tuple[str, str, str]: ) -def _get_braces_for_array(_object: array) -> Tuple[str, str, str]: - return (f"array({_object.typecode!r}, [", "])", "array({_object.typecode!r})") +def _get_braces_for_array(_object: "array[Any]") -> Tuple[str, str, str]: + return (f"array({_object.typecode!r}, [", "])", f"array({_object.typecode!r})") _BRACES: Dict[type, Callable[[Any], Tuple[str, str, str]]] = { @@ -184,13 +376,26 @@ def _get_braces_for_array(_object: array) -> Tuple[str, str, str]: Counter: lambda _object: ("Counter({", "})", "Counter()"), deque: lambda _object: ("deque([", "])", "deque()"), dict: lambda _object: ("{", "}", "{}"), + UserDict: lambda _object: ("{", "}", "{}"), frozenset: lambda _object: ("frozenset({", "})", "frozenset()"), list: lambda _object: ("[", "]", "[]"), + UserList: lambda _object: ("[", "]", "[]"), set: lambda _object: ("{", "}", "set()"), - tuple: lambda _object: ("(", ")", "tuple()"), + tuple: lambda _object: ("(", ")", "()"), + MappingProxyType: lambda _object: ("mappingproxy({", "})", "mappingproxy({})"), } _CONTAINERS = tuple(_BRACES.keys()) -_MAPPING_CONTAINERS = (dict, os._Environ) +_MAPPING_CONTAINERS = (dict, os._Environ, MappingProxyType, UserDict) + + +def is_expandable(obj: Any) -> bool: + """Check if an object may be expanded by pretty print.""" + return ( + _safe_isinstance(obj, _CONTAINERS) + or (is_dataclass(obj)) + or (hasattr(obj, "__rich_repr__")) + or _is_attr_object(obj) + ) and not isclass(obj) @dataclass @@ -204,31 +409,29 @@ class Node: empty: str = "" last: bool = False is_tuple: bool = False + is_namedtuple: bool = False children: Optional[List["Node"]] = None - - @property - def separator(self) -> str: - """Get separator between items.""" - return "" if self.last else "," + key_separator = ": " + separator: str = ", " def iter_tokens(self) -> Iterable[str]: """Generate tokens for this node.""" if self.key_repr: yield self.key_repr - yield ": " + yield self.key_separator if self.value_repr: yield self.value_repr elif self.children is not None: if self.children: yield self.open_brace - if self.is_tuple and len(self.children) == 1: + if self.is_tuple and not self.is_namedtuple and len(self.children) == 1: yield from self.children[0].iter_tokens() yield "," else: for child in self.children: yield from child.iter_tokens() if not child.last: - yield ", " + yield self.separator yield self.close_brace else: yield self.empty @@ -284,12 +487,14 @@ def render( class _Line: """A line in repr output.""" + parent: Optional["_Line"] = None is_root: bool = False node: Optional[Node] = None text: str = "" suffix: str = "" whitespace: str = "" expanded: bool = False + last: bool = False @property def expandable(self) -> bool: @@ -311,33 +516,66 @@ def expand(self, indent_size: int) -> Iterable["_Line"]: whitespace = self.whitespace assert node.children if node.key_repr: - yield _Line( - text=f"{node.key_repr}: {node.open_brace}", whitespace=whitespace + new_line = yield _Line( + text=f"{node.key_repr}{node.key_separator}{node.open_brace}", + whitespace=whitespace, ) else: - yield _Line(text=node.open_brace, whitespace=whitespace) + new_line = yield _Line(text=node.open_brace, whitespace=whitespace) child_whitespace = self.whitespace + " " * indent_size tuple_of_one = node.is_tuple and len(node.children) == 1 - for child in node.children: - separator = "," if tuple_of_one else child.separator + for last, child in loop_last(node.children): + separator = "," if tuple_of_one else node.separator line = _Line( + parent=new_line, node=child, whitespace=child_whitespace, suffix=separator, + last=last and not tuple_of_one, ) yield line yield _Line( text=node.close_brace, whitespace=whitespace, - suffix="," if (tuple_of_one and not self.is_root) else node.separator, + suffix=self.suffix, + last=self.last, ) def __str__(self) -> str: - return f"{self.whitespace}{self.text}{self.node or ''}{self.suffix}" + if self.last: + return f"{self.whitespace}{self.text}{self.node or ''}" + else: + return ( + f"{self.whitespace}{self.text}{self.node or ''}{self.suffix.rstrip()}" + ) + + +def _is_namedtuple(obj: Any) -> bool: + """Checks if an object is most likely a namedtuple. It is possible + to craft an object that passes this check and isn't a namedtuple, but + there is only a minuscule chance of this happening unintentionally. + + Args: + obj (Any): The object to test + + Returns: + bool: True if the object is a namedtuple. False otherwise. + """ + try: + fields = getattr(obj, "_fields", None) + except Exception: + # Being very defensive - if we cannot get the attr then its not a namedtuple + return False + return isinstance(obj, tuple) and isinstance(fields, tuple) -def traverse(_object: Any, max_length: int = None, max_string: int = None) -> Node: +def traverse( + _object: Any, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, +) -> Node: """Traverse object and generate a tree. Args: @@ -346,6 +584,8 @@ def traverse(_object: Any, max_length: int = None, max_string: int = None) -> No Defaults to None. max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. Defaults to None. + max_depth (int, optional): Maximum depth of data structures, or None for no maximum. + Defaults to None. Returns: Node: The root of a tree structure which can be used to render a pretty repr. @@ -355,7 +595,7 @@ def to_repr(obj: Any) -> str: """Get repr string for an object, but catch errors.""" if ( max_string is not None - and isinstance(obj, (bytes, str)) + and _safe_isinstance(obj, (bytes, str)) and len(obj) > max_string ): truncated = len(obj) - max_string @@ -364,27 +604,218 @@ def to_repr(obj: Any) -> str: try: obj_repr = repr(obj) except Exception as error: - obj_repr = f"" + obj_repr = f"" return obj_repr visited_ids: Set[int] = set() push_visited = visited_ids.add pop_visited = visited_ids.remove - def _traverse(obj: Any, root: bool = False) -> Node: + def _traverse(obj: Any, root: bool = False, depth: int = 0) -> Node: """Walk the object depth first.""" + obj_type = type(obj) - if obj_type in _CONTAINERS: + py_version = (sys.version_info.major, sys.version_info.minor) + children: List[Node] + reached_max_depth = max_depth is not None and depth >= max_depth + + def iter_rich_args(rich_args: Any) -> Iterable[Union[Any, Tuple[str, Any]]]: + for arg in rich_args: + if _safe_isinstance(arg, tuple): + if len(arg) == 3: + key, child, default = arg + if default == child: + continue + yield key, child + elif len(arg) == 2: + key, child = arg + yield key, child + elif len(arg) == 1: + yield arg[0] + else: + yield arg + + try: + fake_attributes = hasattr( + obj, "awehoi234_wdfjwljet234_234wdfoijsdfmmnxpi492" + ) + except Exception: + fake_attributes = False + + rich_repr_result: Optional[RichReprResult] = None + if not fake_attributes: + try: + if hasattr(obj, "__rich_repr__") and not isclass(obj): + rich_repr_result = obj.__rich_repr__() + except Exception: + pass + + if rich_repr_result is not None: + angular = getattr(obj.__rich_repr__, "angular", False) + args = list(iter_rich_args(rich_repr_result)) + class_name = obj.__class__.__name__ + + if args: + children = [] + append = children.append + + if reached_max_depth: + node = Node(value_repr=f"...") + else: + if angular: + node = Node( + open_brace=f"<{class_name} ", + close_brace=">", + children=children, + last=root, + separator=" ", + ) + else: + node = Node( + open_brace=f"{class_name}(", + close_brace=")", + children=children, + last=root, + ) + for last, arg in loop_last(args): + if _safe_isinstance(arg, tuple): + key, child = arg + child_node = _traverse(child, depth=depth + 1) + child_node.last = last + child_node.key_repr = key + child_node.key_separator = "=" + append(child_node) + else: + child_node = _traverse(arg, depth=depth + 1) + child_node.last = last + append(child_node) + else: + node = Node( + value_repr=f"<{class_name}>" if angular else f"{class_name}()", + children=[], + last=root, + ) + elif _is_attr_object(obj) and not fake_attributes: + children = [] + append = children.append + + attr_fields = _get_attr_fields(obj) + if attr_fields: + if reached_max_depth: + node = Node(value_repr=f"...") + else: + node = Node( + open_brace=f"{obj.__class__.__name__}(", + close_brace=")", + children=children, + last=root, + ) + + def iter_attrs() -> Iterable[ + Tuple[str, Any, Optional[Callable[[Any], str]]] + ]: + """Iterate over attr fields and values.""" + for attr in attr_fields: + if attr.repr: + try: + value = getattr(obj, attr.name) + except Exception as error: + # Can happen, albeit rarely + yield (attr.name, error, None) + else: + yield ( + attr.name, + value, + attr.repr if callable(attr.repr) else None, + ) + + for last, (name, value, repr_callable) in loop_last(iter_attrs()): + if repr_callable: + child_node = Node(value_repr=str(repr_callable(value))) + else: + child_node = _traverse(value, depth=depth + 1) + child_node.last = last + child_node.key_repr = name + child_node.key_separator = "=" + append(child_node) + else: + node = Node( + value_repr=f"{obj.__class__.__name__}()", children=[], last=root + ) + + elif ( + is_dataclass(obj) + and not _safe_isinstance(obj, type) + and not fake_attributes + and (_is_dataclass_repr(obj) or py_version == (3, 6)) + ): obj_id = id(obj) + if obj_id in visited_ids: + # Recursion detected + return Node(value_repr="...") + push_visited(obj_id) + children = [] + append = children.append + if reached_max_depth: + node = Node(value_repr=f"...") + else: + node = Node( + open_brace=f"{obj.__class__.__name__}(", + close_brace=")", + children=children, + last=root, + ) + + for last, field in loop_last( + field for field in fields(obj) if field.repr + ): + child_node = _traverse(getattr(obj, field.name), depth=depth + 1) + child_node.key_repr = field.name + child_node.last = last + child_node.key_separator = "=" + append(child_node) + + pop_visited(obj_id) + elif _is_namedtuple(obj) and _has_default_namedtuple_repr(obj): + if reached_max_depth: + node = Node(value_repr="...") + else: + children = [] + class_name = obj.__class__.__name__ + node = Node( + open_brace=f"{class_name}(", + close_brace=")", + children=children, + empty=f"{class_name}()", + ) + append = children.append + for last, (key, value) in loop_last(obj._asdict().items()): + child_node = _traverse(value, depth=depth + 1) + child_node.key_repr = key + child_node.last = last + child_node.key_separator = "=" + append(child_node) + elif _safe_isinstance(obj, _CONTAINERS): + for container_type in _CONTAINERS: + if _safe_isinstance(obj, container_type): + obj_type = container_type + break + + obj_id = id(obj) if obj_id in visited_ids: # Recursion detected return Node(value_repr="...") push_visited(obj_id) + open_brace, close_brace, empty = _BRACES[obj_type](obj) - if obj: - children: List[Node] = [] + if reached_max_depth: + node = Node(value_repr=f"...", last=root) + elif obj_type.__repr__ != type(obj).__repr__: + node = Node(value_repr=to_repr(obj), last=root) + elif obj: + children = [] node = Node( open_brace=open_brace, close_brace=close_brace, @@ -395,12 +826,12 @@ def _traverse(obj: Any, root: bool = False) -> Node: num_items = len(obj) last_item_index = num_items - 1 - if isinstance(obj, _MAPPING_CONTAINERS): + if _safe_isinstance(obj, _MAPPING_CONTAINERS): iter_items = iter(obj.items()) if max_length is not None: iter_items = islice(iter_items, max_length) for index, (key, child) in enumerate(iter_items): - child_node = _traverse(child) + child_node = _traverse(child, depth=depth + 1) child_node.key_repr = to_repr(key) child_node.last = index == last_item_index append(child_node) @@ -409,18 +840,19 @@ def _traverse(obj: Any, root: bool = False) -> Node: if max_length is not None: iter_values = islice(iter_values, max_length) for index, child in enumerate(iter_values): - child_node = _traverse(child) + child_node = _traverse(child, depth=depth + 1) child_node.last = index == last_item_index append(child_node) if max_length is not None and num_items > max_length: - append(Node(value_repr=f"... +{num_items-max_length}", last=True)) + append(Node(value_repr=f"... +{num_items - max_length}", last=True)) else: node = Node(empty=empty, children=[], last=root) pop_visited(obj_id) else: node = Node(value_repr=to_repr(obj), last=root) - node.is_tuple = isinstance(obj, tuple) + node.is_tuple = _safe_isinstance(obj, tuple) + node.is_namedtuple = _is_namedtuple(obj) return node node = _traverse(_object, root=True) @@ -432,8 +864,9 @@ def pretty_repr( *, max_width: int = 80, indent_size: int = 4, - max_length: int = None, - max_string: int = None, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, expand_all: bool = False, ) -> str: """Prettify repr string by expanding on to new lines to fit within a given width. @@ -446,17 +879,21 @@ def pretty_repr( Defaults to None. max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. Defaults to None. + max_depth (int, optional): Maximum depth of nested data structure, or None for no depth. + Defaults to None. expand_all (bool, optional): Expand all containers regardless of available width. Defaults to False. Returns: str: A possibly multi-line representation of the object. """ - if isinstance(_object, Node): + if _safe_isinstance(_object, Node): node = _object else: - node = traverse(_object, max_length=max_length, max_string=max_string) - repr_str = node.render( + node = traverse( + _object, max_length=max_length, max_string=max_string, max_depth=max_depth + ) + repr_str: str = node.render( max_width=max_width, indent_size=indent_size, expand_all=expand_all ) return repr_str @@ -465,12 +902,13 @@ def pretty_repr( def pprint( _object: Any, *, - console: "Console" = None, + console: Optional["Console"] = None, indent_guides: bool = True, - max_length: int = None, - max_string: int = None, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, expand_all: bool = False, -): +) -> None: """A convenience function for pretty printing. Args: @@ -479,6 +917,7 @@ def pprint( max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to None. max_string (int, optional): Maximum length of strings before truncating, or None to disable. Defaults to None. + max_depth (int, optional): Maximum depth for nested data structures, or None for unlimited depth. Defaults to None. indent_guides (bool, optional): Enable indentation guides. Defaults to True. expand_all (bool, optional): Expand all containers. Defaults to False. """ @@ -488,6 +927,7 @@ def pprint( _object, max_length=max_length, max_string=max_string, + max_depth=max_depth, indent_guides=indent_guides, expand_all=expand_all, overflow="ignore", @@ -499,8 +939,18 @@ def pprint( if __name__ == "__main__": # pragma: no cover class BrokenRepr: - def __repr__(self): + def __repr__(self) -> str: 1 / 0 + return "this will fail" + + from typing import NamedTuple + + class StockKeepingUnit(NamedTuple): + name: str + description: str + price: float + category: str + reviews: List[str] d = defaultdict(int) d["foo"] = 5 @@ -528,9 +978,16 @@ def __repr__(self): ] ), "atomic": (False, True, None), + "namedtuple": StockKeepingUnit( + "Sparkling British Spring Water", + "Carbonated spring water", + 0.9, + "water", + ["its amazing!", "its terrible!"], + ), "Broken": BrokenRepr(), } - data["foo"].append(data) # type: ignore + data["foo"].append(data) # type: ignore[attr-defined] from rich import print diff --git a/rich/progress.py b/rich/progress.py index 218725971a..ca52c4b98b 100644 --- a/rich/progress.py +++ b/rich/progress.py @@ -1,47 +1,54 @@ import io import sys +import typing +import warnings from abc import ABC, abstractmethod from collections import deque from collections.abc import Sized from dataclasses import dataclass, field from datetime import timedelta +from io import RawIOBase, UnsupportedOperation from math import ceil +from mmap import mmap +from os import PathLike, stat from threading import Event, RLock, Thread +from types import TracebackType from typing import ( - IO, Any, + BinaryIO, Callable, + ContextManager, Deque, Dict, + Generic, Iterable, List, NamedTuple, NewType, Optional, Sequence, + TextIO, Tuple, + Type, TypeVar, Union, ) +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal # pragma: no cover + from . import filesize, get_console -from .ansi import AnsiDecoder -from .console import ( - Console, - ConsoleRenderable, - JustifyMethod, - RenderableType, - RenderGroup, - RenderHook, -) -from .control import Control +from .console import Console, Group, JustifyMethod, RenderableType from .highlighter import Highlighter from .jupyter import JupyterMixin -from .live_render import LiveRender +from .live import Live from .progress_bar import ProgressBar +from .spinner import Spinner from .style import StyleType -from .table import Table -from .text import Text +from .table import Column, Table +from .text import Text, TextType TaskID = NewType("TaskID", int) @@ -50,6 +57,9 @@ GetTimeCallable = Callable[[], float] +_I = typing.TypeVar("_I", TextIO, BinaryIO) + + class _TrackThread(Thread): """A thread to periodically update progress.""" @@ -80,41 +90,50 @@ def __enter__(self) -> "_TrackThread": self.start() return self - def __exit__(self, exc_type, exc_val, exc_tb) -> None: + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: self.done.set() self.join() def track( sequence: Union[Sequence[ProgressType], Iterable[ProgressType]], - description="Working...", - total: int = None, - auto_refresh=True, + description: str = "Working...", + total: Optional[float] = None, + auto_refresh: bool = True, console: Optional[Console] = None, transient: bool = False, - get_time: Callable[[], float] = None, - refresh_per_second: int = None, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, style: StyleType = "bar.back", complete_style: StyleType = "bar.complete", finished_style: StyleType = "bar.finished", pulse_style: StyleType = "bar.pulse", update_period: float = 0.1, + disable: bool = False, + show_speed: bool = True, ) -> Iterable[ProgressType]: """Track progress by iterating over a sequence. Args: sequence (Iterable[ProgressType]): A sequence (must support "len") you wish to iterate over. description (str, optional): Description of task show next to progress bar. Defaults to "Working". - total: (int, optional): Total number of steps. Default is len(sequence). + total: (float, optional): Total number of steps. Default is len(sequence). auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. transient: (bool, optional): Clear the progress on exit. Defaults to False. console (Console, optional): Console to write to. Default creates internal Console instance. - refresh_per_second (Optional[int], optional): Number of times per second to refresh the progress information, or None to use default. Defaults to None. + refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. style (StyleType, optional): Style for the bar background. Defaults to "bar.back". complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. + disable (bool, optional): Disable display of progress. + show_speed (bool, optional): Show speed if total isn't known. Defaults to True. Returns: Iterable[ProgressType]: An iterable of the values in the sequence. @@ -131,7 +150,7 @@ def track( finished_style=finished_style, pulse_style=pulse_style, ), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), + TaskProgressColumn(show_speed=show_speed), TimeRemainingColumn(), ) ) @@ -141,7 +160,8 @@ def track( console=console, transient=transient, get_time=get_time, - refresh_per_second=refresh_per_second, + refresh_per_second=refresh_per_second or 10, + disable=disable, ) with progress: @@ -150,15 +170,334 @@ def track( ) +class _Reader(RawIOBase, BinaryIO): + """A reader that tracks progress while it's being read from.""" + + def __init__( + self, + handle: BinaryIO, + progress: "Progress", + task: TaskID, + close_handle: bool = True, + ) -> None: + self.handle = handle + self.progress = progress + self.task = task + self.close_handle = close_handle + self._closed = False + + def __enter__(self) -> "_Reader": + self.handle.__enter__() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.close() + + def __iter__(self) -> BinaryIO: + return self + + def __next__(self) -> bytes: + line = next(self.handle) + self.progress.advance(self.task, advance=len(line)) + return line + + @property + def closed(self) -> bool: + return self._closed + + def fileno(self) -> int: + return self.handle.fileno() + + def isatty(self) -> bool: + return self.handle.isatty() + + def readable(self) -> bool: + return self.handle.readable() + + def seekable(self) -> bool: + return self.handle.seekable() + + def writable(self) -> bool: + return False + + def read(self, size: int = -1) -> bytes: + block = self.handle.read(size) + self.progress.advance(self.task, advance=len(block)) + return block + + def readinto(self, b: Union[bytearray, memoryview, mmap]): # type: ignore[no-untyped-def, override] + n = self.handle.readinto(b) # type: ignore[attr-defined] + self.progress.advance(self.task, advance=n) + return n + + def readline(self, size: int = -1) -> bytes: # type: ignore[override] + line = self.handle.readline(size) + self.progress.advance(self.task, advance=len(line)) + return line + + def readlines(self, hint: int = -1) -> List[bytes]: + lines = self.handle.readlines(hint) + self.progress.advance(self.task, advance=sum(map(len, lines))) + return lines + + def close(self) -> None: + if self.close_handle: + self.handle.close() + self._closed = True + + def seek(self, offset: int, whence: int = 0) -> int: + pos = self.handle.seek(offset, whence) + self.progress.update(self.task, completed=pos) + return pos + + def tell(self) -> int: + return self.handle.tell() + + def write(self, s: Any) -> int: + raise UnsupportedOperation("write") + + +class _ReadContext(ContextManager[_I], Generic[_I]): + """A utility class to handle a context for both a reader and a progress.""" + + def __init__(self, progress: "Progress", reader: _I) -> None: + self.progress = progress + self.reader: _I = reader + + def __enter__(self) -> _I: + self.progress.start() + return self.reader.__enter__() + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.progress.stop() + self.reader.__exit__(exc_type, exc_val, exc_tb) + + +def wrap_file( + file: BinaryIO, + total: int, + *, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> ContextManager[BinaryIO]: + """Read bytes from a file while tracking progress. + + Args: + file (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. + total (int): Total number of bytes to read. + description (str, optional): Description of task show next to progress bar. Defaults to "Reading". + auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. + transient: (bool, optional): Clear the progress on exit. Defaults to False. + console (Console, optional): Console to write to. Default creates internal Console instance. + refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. + style (StyleType, optional): Style for the bar background. Defaults to "bar.back". + complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". + pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". + disable (bool, optional): Disable display of progress. + Returns: + ContextManager[BinaryIO]: A context manager yielding a progress reader. + + """ + + columns: List["ProgressColumn"] = ( + [TextColumn("[progress.description]{task.description}")] if description else [] + ) + columns.extend( + ( + BarColumn( + style=style, + complete_style=complete_style, + finished_style=finished_style, + pulse_style=pulse_style, + ), + DownloadColumn(), + TimeRemainingColumn(), + ) + ) + progress = Progress( + *columns, + auto_refresh=auto_refresh, + console=console, + transient=transient, + get_time=get_time, + refresh_per_second=refresh_per_second or 10, + disable=disable, + ) + + reader = progress.wrap_file(file, total=total, description=description) + return _ReadContext(progress, reader) + + +@typing.overload +def open( + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["rt"], Literal["r"]], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> ContextManager[TextIO]: + pass + + +@typing.overload +def open( + file: Union[str, "PathLike[str]", bytes], + mode: Literal["rb"], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> ContextManager[BinaryIO]: + pass + + +def open( + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> Union[ContextManager[BinaryIO], ContextManager[TextIO]]: + """Read bytes from a file while tracking progress. + + Args: + path (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. + mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". + buffering (int): The buffering strategy to use, see :func:`io.open`. + encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. + errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. + newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open` + total: (int, optional): Total number of bytes to read. Must be provided if reading from a file handle. Default for a path is os.stat(file).st_size. + description (str, optional): Description of task show next to progress bar. Defaults to "Reading". + auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. + transient: (bool, optional): Clear the progress on exit. Defaults to False. + console (Console, optional): Console to write to. Default creates internal Console instance. + refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. + style (StyleType, optional): Style for the bar background. Defaults to "bar.back". + complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". + pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". + disable (bool, optional): Disable display of progress. + encoding (str, optional): The encoding to use when reading in text mode. + + Returns: + ContextManager[BinaryIO]: A context manager yielding a progress reader. + + """ + + columns: List["ProgressColumn"] = ( + [TextColumn("[progress.description]{task.description}")] if description else [] + ) + columns.extend( + ( + BarColumn( + style=style, + complete_style=complete_style, + finished_style=finished_style, + pulse_style=pulse_style, + ), + DownloadColumn(), + TimeRemainingColumn(), + ) + ) + progress = Progress( + *columns, + auto_refresh=auto_refresh, + console=console, + transient=transient, + get_time=get_time, + refresh_per_second=refresh_per_second or 10, + disable=disable, + ) + + reader = progress.open( + file, + mode=mode, + buffering=buffering, + encoding=encoding, + errors=errors, + newline=newline, + total=total, + description=description, + ) + return _ReadContext(progress, reader) # type: ignore[return-value, type-var] + + class ProgressColumn(ABC): """Base class for a widget to use in progress display.""" max_refresh: Optional[float] = None - def __init__(self) -> None: + def __init__(self, table_column: Optional[Column] = None) -> None: + self._table_column = table_column self._renderable_cache: Dict[TaskID, Tuple[float, RenderableType]] = {} self._update_time: Optional[float] = None + def get_table_column(self) -> Column: + """Get a table column, used to build tasks table.""" + return self._table_column or Column() + def __call__(self, task: "Task") -> RenderableType: """Called by the Progress object to return a renderable for the given task. @@ -168,7 +507,7 @@ def __call__(self, task: "Task") -> RenderableType: Returns: RenderableType: Anything renderable (including str). """ - current_time = task.get_time() # type: ignore + current_time = task.get_time() if self.max_refresh is not None and not task.completed: try: timestamp, renderable = self._renderable_cache[task.id] @@ -187,6 +526,73 @@ def render(self, task: "Task") -> RenderableType: """Should return a renderable object.""" +class RenderableColumn(ProgressColumn): + """A column to insert an arbitrary column. + + Args: + renderable (RenderableType, optional): Any renderable. Defaults to empty string. + """ + + def __init__( + self, renderable: RenderableType = "", *, table_column: Optional[Column] = None + ): + self.renderable = renderable + super().__init__(table_column=table_column) + + def render(self, task: "Task") -> RenderableType: + return self.renderable + + +class SpinnerColumn(ProgressColumn): + """A column with a 'spinner' animation. + + Args: + spinner_name (str, optional): Name of spinner animation. Defaults to "dots". + style (StyleType, optional): Style of spinner. Defaults to "progress.spinner". + speed (float, optional): Speed factor of spinner. Defaults to 1.0. + finished_text (TextType, optional): Text used when task is finished. Defaults to " ". + """ + + def __init__( + self, + spinner_name: str = "dots", + style: Optional[StyleType] = "progress.spinner", + speed: float = 1.0, + finished_text: TextType = " ", + table_column: Optional[Column] = None, + ): + self.spinner = Spinner(spinner_name, style=style, speed=speed) + self.finished_text = ( + Text.from_markup(finished_text) + if isinstance(finished_text, str) + else finished_text + ) + super().__init__(table_column=table_column) + + def set_spinner( + self, + spinner_name: str, + spinner_style: Optional[StyleType] = "progress.spinner", + speed: float = 1.0, + ) -> None: + """Set a new spinner. + + Args: + spinner_name (str): Spinner name, see python -m rich.spinner. + spinner_style (Optional[StyleType], optional): Spinner style. Defaults to "progress.spinner". + speed (float, optional): Speed factor of spinner. Defaults to 1.0. + """ + self.spinner = Spinner(spinner_name, style=spinner_style, speed=speed) + + def render(self, task: "Task") -> RenderableType: + text = ( + self.finished_text + if task.finished + else self.spinner.render(task.get_time()) + ) + return text + + class TextColumn(ProgressColumn): """A column containing text.""" @@ -196,14 +602,15 @@ def __init__( style: StyleType = "none", justify: JustifyMethod = "left", markup: bool = True, - highlighter: Highlighter = None, + highlighter: Optional[Highlighter] = None, + table_column: Optional[Column] = None, ) -> None: self.text_format = text_format - self.justify = justify + self.justify: JustifyMethod = justify self.style = style self.markup = markup self.highlighter = highlighter - super().__init__() + super().__init__(table_column=table_column or Column(no_wrap=True)) def render(self, task: "Task") -> Text: _text = self.text_format.format(task=task) @@ -234,18 +641,19 @@ def __init__( complete_style: StyleType = "bar.complete", finished_style: StyleType = "bar.finished", pulse_style: StyleType = "bar.pulse", + table_column: Optional[Column] = None, ) -> None: self.bar_width = bar_width self.style = style self.complete_style = complete_style self.finished_style = finished_style self.pulse_style = pulse_style - super().__init__() + super().__init__(table_column=table_column) def render(self, task: "Task") -> ProgressBar: """Gets a progress bar widget for a task.""" return ProgressBar( - total=max(0, task.total), + total=max(0, task.total) if task.total is not None else None, completed=max(0, task.completed), width=None if self.bar_width is None else max(1, self.bar_width), pulse=not task.started, @@ -257,19 +665,137 @@ def render(self, task: "Task") -> ProgressBar: ) +class TimeElapsedColumn(ProgressColumn): + """Renders time elapsed.""" + + def render(self, task: "Task") -> Text: + """Show time remaining.""" + elapsed = task.finished_time if task.finished else task.elapsed + if elapsed is None: + return Text("-:--:--", style="progress.elapsed") + delta = timedelta(seconds=int(elapsed)) + return Text(str(delta), style="progress.elapsed") + + +class TaskProgressColumn(TextColumn): + """Show task progress as a percentage. + + Args: + text_format (str, optional): Format for percentage display. Defaults to "[progress.percentage]{task.percentage:>3.0f}%". + text_format_no_percentage (str, optional): Format if percentage is unknown. Defaults to "". + style (StyleType, optional): Style of output. Defaults to "none". + justify (JustifyMethod, optional): Text justification. Defaults to "left". + markup (bool, optional): Enable markup. Defaults to True. + highlighter (Optional[Highlighter], optional): Highlighter to apply to output. Defaults to None. + table_column (Optional[Column], optional): Table Column to use. Defaults to None. + show_speed (bool, optional): Show speed if total is unknown. Defaults to False. + """ + + def __init__( + self, + text_format: str = "[progress.percentage]{task.percentage:>3.0f}%", + text_format_no_percentage: str = "", + style: StyleType = "none", + justify: JustifyMethod = "left", + markup: bool = True, + highlighter: Optional[Highlighter] = None, + table_column: Optional[Column] = None, + show_speed: bool = False, + ) -> None: + + self.text_format_no_percentage = text_format_no_percentage + self.show_speed = show_speed + super().__init__( + text_format=text_format, + style=style, + justify=justify, + markup=markup, + highlighter=highlighter, + table_column=table_column, + ) + + @classmethod + def render_speed(cls, speed: Optional[float]) -> Text: + """Render the speed in iterations per second. + + Args: + task (Task): A Task object. + + Returns: + Text: Text object containing the task speed. + """ + if speed is None: + return Text("", style="progress.percentage") + unit, suffix = filesize.pick_unit_and_suffix( + int(speed), + ["", "×10³", "×10⁶", "×10⁹", "×10¹²"], + 1000, + ) + data_speed = speed / unit + return Text(f"{data_speed:.1f}{suffix} it/s", style="progress.percentage") + + def render(self, task: "Task") -> Text: + if task.total is None and self.show_speed: + return self.render_speed(task.finished_speed or task.speed) + text_format = ( + self.text_format_no_percentage if task.total is None else self.text_format + ) + _text = text_format.format(task=task) + if self.markup: + text = Text.from_markup(_text, style=self.style, justify=self.justify) + else: + text = Text(_text, style=self.style, justify=self.justify) + if self.highlighter: + self.highlighter.highlight(text) + return text + + class TimeRemainingColumn(ProgressColumn): - """Renders estimated time remaining.""" + """Renders estimated time remaining. + + Args: + compact (bool, optional): Render MM:SS when time remaining is less than an hour. Defaults to False. + elapsed_when_finished (bool, optional): Render time elapsed when the task is finished. Defaults to False. + """ # Only refresh twice a second to prevent jitter max_refresh = 0.5 + def __init__( + self, + compact: bool = False, + elapsed_when_finished: bool = False, + table_column: Optional[Column] = None, + ): + self.compact = compact + self.elapsed_when_finished = elapsed_when_finished + super().__init__(table_column=table_column) + def render(self, task: "Task") -> Text: """Show time remaining.""" - remaining = task.time_remaining - if remaining is None: - return Text("-:--:--", style="progress.remaining") - remaining_delta = timedelta(seconds=int(remaining)) - return Text(str(remaining_delta), style="progress.remaining") + if self.elapsed_when_finished and task.finished: + task_time = task.finished_time + style = "progress.elapsed" + else: + task_time = task.time_remaining + style = "progress.remaining" + + if task.total is None: + return Text("", style=style) + + if task_time is None: + return Text("--:--" if self.compact else "-:--:--", style=style) + + # Based on https://github.com/tqdm/tqdm/blob/master/tqdm/std.py + minutes, seconds = divmod(int(task_time), 60) + hours, minutes = divmod(minutes, 60) + + if self.compact and not hours: + formatted = f"{minutes:02d}:{seconds:02d}" + else: + formatted = f"{hours:d}:{minutes:02d}:{seconds:02d}" + + return Text(formatted, style=style) class FileSizeColumn(ProgressColumn): @@ -286,10 +812,37 @@ class TotalFileSizeColumn(ProgressColumn): def render(self, task: "Task") -> Text: """Show data completed.""" - data_size = filesize.decimal(int(task.total)) + data_size = filesize.decimal(int(task.total)) if task.total is not None else "" return Text(data_size, style="progress.filesize.total") +class MofNCompleteColumn(ProgressColumn): + """Renders completed count/total, e.g. ' 10/1000'. + + Best for bounded tasks with int quantities. + + Space pads the completed count so that progress length does not change as task progresses + past powers of 10. + + Args: + separator (str, optional): Text to separate completed and total values. Defaults to "/". + """ + + def __init__(self, separator: str = "/", table_column: Optional[Column] = None): + self.separator = separator + super().__init__(table_column=table_column) + + def render(self, task: "Task") -> Text: + """Show completed/total.""" + completed = int(task.completed) + total = int(task.total) if task.total is not None else "?" + total_width = len(str(total)) + return Text( + f"{completed:{total_width}d}{self.separator}{total}", + style="progress.download", + ) + + class DownloadColumn(ProgressColumn): """Renders file size downloaded and total, e.g. '0.5/2.3 GB'. @@ -297,29 +850,43 @@ class DownloadColumn(ProgressColumn): binary_units (bool, optional): Use binary units, KiB, MiB etc. Defaults to False. """ - def __init__(self, binary_units: bool = False) -> None: + def __init__( + self, binary_units: bool = False, table_column: Optional[Column] = None + ) -> None: self.binary_units = binary_units - super().__init__() + super().__init__(table_column=table_column) def render(self, task: "Task") -> Text: """Calculate common unit for completed and total.""" completed = int(task.completed) - total = int(task.total) + + unit_and_suffix_calculation_base = ( + int(task.total) if task.total is not None else completed + ) if self.binary_units: unit, suffix = filesize.pick_unit_and_suffix( - total, + unit_and_suffix_calculation_base, ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"], 1024, ) else: unit, suffix = filesize.pick_unit_and_suffix( - total, ["bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], 1000 + unit_and_suffix_calculation_base, + ["bytes", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], + 1000, ) - completed_ratio = completed / unit - total_ratio = total / unit precision = 0 if unit == 1 else 1 + + completed_ratio = completed / unit completed_str = f"{completed_ratio:,.{precision}f}" - total_str = f"{total_ratio:,.{precision}f}" + + if task.total is not None: + total = int(task.total) + total_ratio = total / unit + total_str = f"{total_ratio:,.{precision}f}" + else: + total_str = "?" + download_status = f"{completed_str}/{total_str} {suffix}" download_text = Text(download_status, style="progress.download") return download_text @@ -330,7 +897,7 @@ class TransferSpeedColumn(ProgressColumn): def render(self, task: "Task") -> Text: """Show data transfer speed.""" - speed = task.speed + speed = task.finished_speed or task.speed if speed is None: return Text("?", style="progress.data.speed") data_speed = filesize.decimal(int(speed)) @@ -360,8 +927,8 @@ class Task: description: str """str: Description of the task.""" - total: float - """str: Total number of steps in this task.""" + total: Optional[float] + """Optional[float]: Total number of steps in this task.""" completed: float """float: Number of steps completed""" @@ -369,6 +936,9 @@ class Task: _get_time: GetTimeCallable """Callable to get the current time.""" + finished_time: Optional[float] = None + """float: Time task was finished.""" + visible: bool = True """bool: Indicates if this task is visible in the progress display.""" @@ -381,13 +951,19 @@ class Task: stop_time: Optional[float] = field(default=None, init=False, repr=False) """Optional[float]: Time this task was stopped, or None if not stopped.""" + finished_speed: Optional[float] = None + """Optional[float]: The last speed for a finished task.""" + _progress: Deque[ProgressSample] = field( - default_factory=deque, init=False, repr=False + default_factory=lambda: deque(maxlen=1000), init=False, repr=False ) + _lock: RLock = field(repr=False, default_factory=RLock) + """Thread lock.""" + def get_time(self) -> float: """float: Get the current time, in seconds.""" - return self._get_time() # type: ignore + return self._get_time() @property def started(self) -> bool: @@ -395,8 +971,10 @@ def started(self) -> bool: return self.start_time is not None @property - def remaining(self) -> float: - """float: Get the number of steps remaining.""" + def remaining(self) -> Optional[float]: + """Optional[float]: Get the number of steps remaining, if a non-None total was set.""" + if self.total is None: + return None return self.total - self.completed @property @@ -410,12 +988,12 @@ def elapsed(self) -> Optional[float]: @property def finished(self) -> bool: - """bool: Check if the task has completed.""" - return self.completed >= self.total + """Check if the task has finished.""" + return self.finished_time is not None @property def percentage(self) -> float: - """float: Get progress of task as a percentage.""" + """float: Get progress of task as a percentage. If a None total was set, returns 0""" if not self.total: return 0.0 completed = (self.completed / self.total) * 100.0 @@ -427,17 +1005,18 @@ def speed(self) -> Optional[float]: """Optional[float]: Get the estimated speed in steps per second.""" if self.start_time is None: return None - progress = self._progress - if not progress: - return None - total_time = progress[-1].timestamp - progress[0].timestamp - if total_time == 0: - return None - iter_progress = iter(progress) - next(iter_progress) - total_completed = sum(sample.completed for sample in iter_progress) - speed = total_completed / total_time - return speed + with self._lock: + progress = self._progress + if not progress: + return None + total_time = progress[-1].timestamp - progress[0].timestamp + if total_time == 0: + return None + iter_progress = iter(progress) + next(iter_progress) + total_completed = sum(sample.completed for sample in iter_progress) + speed = total_completed / total_time + return speed @property def time_remaining(self) -> Optional[float]: @@ -447,127 +1026,105 @@ def time_remaining(self) -> Optional[float]: speed = self.speed if not speed: return None - estimate = ceil(self.remaining / speed) + remaining = self.remaining + if remaining is None: + return None + estimate = ceil(remaining / speed) return estimate def _reset(self) -> None: """Reset progress.""" self._progress.clear() + self.finished_time = None + self.finished_speed = None -class _RefreshThread(Thread): - """A thread that calls refresh() on the Process object at regular intervals.""" - - def __init__(self, progress: "Progress", refresh_per_second: int = 10) -> None: - self.progress = progress - self.refresh_per_second = refresh_per_second - self.done = Event() - super().__init__() - - def stop(self) -> None: - self.done.set() - - def run(self) -> None: - while not self.done.wait(1.0 / self.refresh_per_second): - self.progress.refresh() - - -class _FileProxy(io.TextIOBase): - """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" - - def __init__(self, console: Console, file: IO[str]) -> None: - self.__console = console - self.__file = file - self.__buffer: List[str] = [] - self.__ansi_decoder = AnsiDecoder() - - def __getattr__(self, name: str) -> Any: - return getattr(self.__file, name) - - def write(self, text: str) -> int: - buffer = self.__buffer - lines: List[str] = [] - while text: - line, new_line, text = text.partition("\n") - if new_line: - lines.append("".join(buffer) + line) - del buffer[:] - else: - buffer.append(line) - break - if lines: - console = self.__console - with console: - output = Text("\n").join( - self.__ansi_decoder.decode_line(line) for line in lines - ) - console.print(output, markup=False, emoji=False, highlight=False) - return len(text) - - def flush(self) -> None: - buffer = self.__buffer - if buffer: - self.__console.print("".join(buffer)) - del buffer[:] - - -class Progress(JupyterMixin, RenderHook): +class Progress(JupyterMixin): """Renders an auto-updating progress bar(s). Args: console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`. - refresh_per_second (Optional[int], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None. + refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None. speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30. transient: (bool, optional): Clear the progress on exit. Defaults to False. redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. redirect_stderr: (bool, optional): Enable redirection of stderr. Defaults to True. get_time: (Callable, optional): A callable that gets the current time, or None to use Console.get_time. Defaults to None. disable (bool, optional): Disable progress display. Defaults to False + expand (bool, optional): Expand tasks table to fit width. Defaults to False. """ def __init__( self, *columns: Union[str, ProgressColumn], - console: Console = None, + console: Optional[Console] = None, auto_refresh: bool = True, - refresh_per_second: int = None, + refresh_per_second: float = 10, speed_estimate_period: float = 30.0, transient: bool = False, redirect_stdout: bool = True, redirect_stderr: bool = True, - get_time: GetTimeCallable = None, + get_time: Optional[GetTimeCallable] = None, disable: bool = False, + expand: bool = False, ) -> None: - assert ( - refresh_per_second is None or refresh_per_second > 0 - ), "refresh_per_second must be > 0" + assert refresh_per_second > 0, "refresh_per_second must be > 0" self._lock = RLock() - self.columns = columns or ( - TextColumn("[progress.description]{task.description}"), - BarColumn(), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), - TimeRemainingColumn(), - ) - self.console = console or get_console() - self.auto_refresh = auto_refresh and not self.console.is_jupyter - self.refresh_per_second = refresh_per_second or 10 + self.columns = columns or self.get_default_columns() self.speed_estimate_period = speed_estimate_period - self.transient = transient - self._redirect_stdout = redirect_stdout - self._redirect_stderr = redirect_stderr - self.get_time = get_time or self.console.get_time + self.disable = disable + self.expand = expand self._tasks: Dict[TaskID, Task] = {} - self._live_render = LiveRender(self.get_renderable()) self._task_index: TaskID = TaskID(0) - self._refresh_thread: Optional[_RefreshThread] = None - self._started = False + self.live = Live( + console=console or get_console(), + auto_refresh=auto_refresh, + refresh_per_second=refresh_per_second, + transient=transient, + redirect_stdout=redirect_stdout, + redirect_stderr=redirect_stderr, + get_renderable=self.get_renderable, + ) + self.get_time = get_time or self.console.get_time self.print = self.console.print self.log = self.console.log - self._restore_stdout: Optional[IO[str]] = None - self._restore_stderr: Optional[IO[str]] = None - self.ipy_widget: Optional[Any] = None + + @classmethod + def get_default_columns(cls) -> Tuple[ProgressColumn, ...]: + """Get the default columns used for a new Progress instance: + - a text column for the description (TextColumn) + - the bar itself (BarColumn) + - a text column showing completion percentage (TextColumn) + - an estimated-time-remaining column (TimeRemainingColumn) + If the Progress instance is created without passing a columns argument, + the default columns defined here will be used. + + You can also create a Progress instance using custom columns before + and/or after the defaults, as in this example: + + progress = Progress( + SpinnerColumn(), + *Progress.default_columns(), + "Elapsed:", + TimeElapsedColumn(), + ) + + This code shows the creation of a Progress display, containing + a spinner to the left, the default columns, and a labeled elapsed + time column. + """ + return ( + TextColumn("[progress.description]{task.description}"), + BarColumn(), + TaskProgressColumn(), + TimeRemainingColumn(), + ) + + @property + def console(self) -> Console: + return self.live.console @property def tasks(self) -> List[Task]: @@ -589,84 +1146,42 @@ def finished(self) -> bool: return True return all(task.finished for task in self._tasks.values()) - def _enable_redirect_io(self): - """Enable redirecting of stdout / stderr.""" - if self.console.is_terminal: - if self._redirect_stdout: - self._restore_stdout = sys.stdout - sys.stdout = _FileProxy(self.console, sys.stdout) - if self._redirect_stderr: - self._restore_stderr = sys.stderr - sys.stderr = _FileProxy(self.console, sys.stderr) - - def _disable_redirect_io(self): - """Disable redirecting of stdout / stderr.""" - if self._restore_stdout: - sys.stdout = self._restore_stdout - self._restore_stdout = None - if self._restore_stderr: - sys.stderr = self._restore_stderr - self._restore_stderr = None - def start(self) -> None: """Start the progress display.""" - with self._lock: - if self._started: - return - self._started = True - self.console.show_cursor(False) - self._enable_redirect_io() - self.console.push_render_hook(self) - self.refresh() - if self.auto_refresh: - self._refresh_thread = _RefreshThread(self, self.refresh_per_second) - self._refresh_thread.start() + if not self.disable: + self.live.start(refresh=True) def stop(self) -> None: """Stop the progress display.""" - with self._lock: - if not self._started: - return - self._started = False - try: - if self.auto_refresh and self._refresh_thread is not None: - self._refresh_thread.stop() - self.refresh() - if self.console.is_terminal: - self.console.line() - finally: - self.console.show_cursor(True) - self._disable_redirect_io() - self.console.pop_render_hook() - if self._refresh_thread is not None: - self._refresh_thread.join() - self._refresh_thread = None - if self.transient: - self.console.control(self._live_render.restore_cursor()) - if self.ipy_widget is not None and self.transient: # pragma: no cover - self.ipy_widget.clear_output() - self.ipy_widget.close() + self.live.stop() + if not self.console.is_interactive: + self.console.print() def __enter__(self) -> "Progress": self.start() return self - def __exit__(self, exc_type, exc_val, exc_tb) -> None: + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: self.stop() def track( self, sequence: Union[Iterable[ProgressType], Sequence[ProgressType]], - total: int = None, + total: Optional[float] = None, task_id: Optional[TaskID] = None, - description="Working...", + description: str = "Working...", update_period: float = 0.1, ) -> Iterable[ProgressType]: """Track progress by iterating over a sequence. Args: sequence (Sequence[ProgressType]): A sequence of values you want to iterate over and track progress. - total: (int, optional): Total number of steps. Default is len(sequence). + total: (float, optional): Total number of steps. Default is len(sequence). task_id: (TaskID): Task to track. Default is new task. description: (str, optional): Description of task, if new task is created. update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. @@ -674,13 +1189,11 @@ def track( Returns: Iterable[ProgressType]: An iterable of values taken from the provided sequence. """ + + task_total: Optional[float] = None if total is None: if isinstance(sequence, Sized): - task_total = len(sequence) - else: - raise ValueError( - f"unable to get size of {sequence!r}, please specify 'total'" - ) + task_total = float(len(sequence)) else: task_total = total @@ -689,7 +1202,7 @@ def track( else: self.update(task_id, total=task_total) - if self.auto_refresh: + if self.live.auto_refresh: with _TrackThread(self, task_id, update_period) as track_thread: for value in sequence: yield value @@ -702,6 +1215,157 @@ def track( advance(task_id, 1) refresh() + def wrap_file( + self, + file: BinaryIO, + total: Optional[int] = None, + *, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> BinaryIO: + """Track progress file reading from a binary file. + + Args: + file (BinaryIO): A file-like object opened in binary mode. + total (int, optional): Total number of bytes to read. This must be provided unless a task with a total is also given. + task_id (TaskID): Task to track. Default is new task. + description (str, optional): Description of task, if new task is created. + + Returns: + BinaryIO: A readable file-like object in binary mode. + + Raises: + ValueError: When no total value can be extracted from the arguments or the task. + """ + # attempt to recover the total from the task + total_bytes: Optional[float] = None + if total is not None: + total_bytes = total + elif task_id is not None: + with self._lock: + total_bytes = self._tasks[task_id].total + if total_bytes is None: + raise ValueError( + f"unable to get the total number of bytes, please specify 'total'" + ) + + # update total of task or create new task + if task_id is None: + task_id = self.add_task(description, total=total_bytes) + else: + self.update(task_id, total=total_bytes) + + return _Reader(file, self, task_id, close_handle=False) + + @typing.overload + def open( + self, + file: Union[str, "PathLike[str]", bytes], + mode: Literal["rb"], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> BinaryIO: + pass + + @typing.overload + def open( + self, + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["r"], Literal["rt"]], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> TextIO: + pass + + def open( + self, + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> Union[BinaryIO, TextIO]: + """Track progress while reading from a binary file. + + Args: + path (Union[str, PathLike[str]]): The path to the file to read. + mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". + buffering (int): The buffering strategy to use, see :func:`io.open`. + encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. + errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. + newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open`. + total (int, optional): Total number of bytes to read. If none given, os.stat(path).st_size is used. + task_id (TaskID): Task to track. Default is new task. + description (str, optional): Description of task, if new task is created. + + Returns: + BinaryIO: A readable file-like object in binary mode. + + Raises: + ValueError: When an invalid mode is given. + """ + # normalize the mode (always rb, rt) + _mode = "".join(sorted(mode, reverse=False)) + if _mode not in ("br", "rt", "r"): + raise ValueError("invalid mode {!r}".format(mode)) + + # patch buffering to provide the same behaviour as the builtin `open` + line_buffering = buffering == 1 + if _mode == "br" and buffering == 1: + warnings.warn( + "line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used", + RuntimeWarning, + ) + buffering = -1 + elif _mode == "rt" or _mode == "r": + if buffering == 0: + raise ValueError("can't have unbuffered text I/O") + elif buffering == 1: + buffering = -1 + + # attempt to get the total with `os.stat` + if total is None: + total = stat(file).st_size + + # update total of task or create new task + if task_id is None: + task_id = self.add_task(description, total=total) + else: + self.update(task_id, total=total) + + # open the file in binary mode, + handle = io.open(file, "rb", buffering=buffering) + reader = _Reader(handle, self, task_id, close_handle=True) + + # wrap the reader in a `TextIOWrapper` if text mode + if mode == "r" or mode == "rt": + return io.TextIOWrapper( + reader, + encoding=encoding, + errors=errors, + newline=newline, + line_buffering=line_buffering, + ) + + return reader + def start_task(self, task_id: TaskID) -> None: """Start a task. @@ -735,11 +1399,11 @@ def update( self, task_id: TaskID, *, - total: float = None, - completed: float = None, - advance: float = None, - description: str = None, - visible: bool = None, + total: Optional[float] = None, + completed: Optional[float] = None, + advance: Optional[float] = None, + description: Optional[str] = None, + visible: Optional[bool] = None, refresh: bool = False, **fields: Any, ) -> None: @@ -759,7 +1423,7 @@ def update( task = self._tasks[task_id] completed_start = task.completed - if total is not None: + if total is not None and total != task.total: task.total = total task._reset() if advance is not None: @@ -773,9 +1437,6 @@ def update( task.fields.update(fields) update_completed = task.completed - completed_start - if refresh: - self.refresh() - current_time = self.get_time() old_sample_time = current_time - self.speed_estimate_period _progress = task._progress @@ -783,17 +1444,24 @@ def update( popleft = _progress.popleft while _progress and _progress[0].timestamp < old_sample_time: popleft() - while len(_progress) > 1000: - popleft() if update_completed > 0: _progress.append(ProgressSample(current_time, update_completed)) + if ( + task.total is not None + and task.completed >= task.total + and task.finished_time is None + ): + task.finished_time = task.elapsed + + if refresh: + self.refresh() def reset( self, task_id: TaskID, *, start: bool = True, - total: Optional[int] = None, + total: Optional[float] = None, completed: int = 0, visible: Optional[bool] = None, description: Optional[str] = None, @@ -804,7 +1472,7 @@ def reset( Args: task_id (TaskID): ID of task. start (bool, optional): Start the task after reset. Defaults to True. - total (int, optional): New total steps in task, or None to use current total. Defaults to None. + total (float, optional): New total steps in task, or None to use current total. Defaults to None. completed (int, optional): Number of steps completed. Defaults to 0. **fields (str): Additional data fields required for rendering. """ @@ -822,7 +1490,8 @@ def reset( task.fields = fields if description is not None: task.description = description - self.refresh() + task.finished_time = None + self.refresh() def advance(self, task_id: TaskID, advance: float = 1) -> None: """Advance task by a number of steps. @@ -846,40 +1515,22 @@ def advance(self, task_id: TaskID, advance: float = 1) -> None: while len(_progress) > 1000: popleft() _progress.append(ProgressSample(current_time, update_completed)) + if ( + task.total is not None + and task.completed >= task.total + and task.finished_time is None + ): + task.finished_time = task.elapsed + task.finished_speed = task.speed def refresh(self) -> None: """Refresh (render) the progress information.""" - if self.console.is_jupyter: # pragma: no cover - try: - from IPython.display import display - from ipywidgets import Output - except ImportError: - import warnings - - warnings.warn('install "ipywidgets" for Jupyter support') - else: - with self._lock: - if self.ipy_widget is None: - self.ipy_widget = Output() - display(self.ipy_widget) - - with self.ipy_widget: - self.ipy_widget.clear_output(wait=True) - self.console.print(self.get_renderable()) - - elif ( - self.console.is_terminal - and not self.console.is_dumb_terminal - and not self.disable - ): - with self._lock: - self._live_render.set_renderable(self.get_renderable()) - with self.console: - self.console.print(Control("")) + if not self.disable and self.live.is_started: + self.live.refresh() def get_renderable(self) -> RenderableType: """Get a renderable for the progress display.""" - renderable = RenderGroup(*self.get_renderables()) + renderable = Group(*self.get_renderables()) return renderable def get_renderables(self) -> Iterable[RenderableType]: @@ -896,31 +1547,40 @@ def make_tasks_table(self, tasks: Iterable[Task]) -> Table: Returns: Table: A table instance. """ + table_columns = ( + ( + Column(no_wrap=True) + if isinstance(_column, str) + else _column.get_table_column().copy() + ) + for _column in self.columns + ) + table = Table.grid(*table_columns, padding=(0, 1), expand=self.expand) - table = Table.grid(padding=(0, 1)) - for _ in self.columns: - table.add_column() for task in tasks: if task.visible: - row: List[RenderableType] = [] - append = row.append - for index, column in enumerate(self.columns): - if isinstance(column, str): - append(column.format(task=task)) - table.columns[index].no_wrap = True - else: - widget = column(task) - append(widget) - if isinstance(widget, (str, Text)): - table.columns[index].no_wrap = True - table.add_row(*row) + table.add_row( + *( + ( + column.format(task=task) + if isinstance(column, str) + else column(task) + ) + for column in self.columns + ) + ) return table + def __rich__(self) -> RenderableType: + """Makes the Progress class itself renderable.""" + with self._lock: + return self.get_renderable() + def add_task( self, description: str, start: bool = True, - total: int = 100, + total: Optional[float] = 100.0, completed: int = 0, visible: bool = True, **fields: Any, @@ -931,7 +1591,8 @@ def add_task( description (str): A description of the task. start (bool, optional): Start the task immediately (to calculate elapsed time). If set to False, you will need to call `start` manually. Defaults to True. - total (int, optional): Number of total steps in the progress if know. Defaults to 100. + total (float, optional): Number of total steps in the progress if known. + Set to None to render a pulsing animation. Defaults to 100. completed (int, optional): Number of steps completed so far.. Defaults to 0. visible (bool, optional): Enable display of the task. Defaults to True. **fields (str): Additional data fields required for rendering. @@ -948,15 +1609,15 @@ def add_task( visible=visible, fields=fields, _get_time=self.get_time, + _lock=self._lock, ) self._tasks[self._task_index] = task if start: self.start_task(self._task_index) - self.refresh() - try: - return self._task_index - finally: - self._task_index = TaskID(int(self._task_index) + 1) + new_task_index = self._task_index + self._task_index = TaskID(int(self._task_index) + 1) + self.refresh() + return new_task_index def remove_task(self, task_id: TaskID) -> None: """Delete a task if it exists. @@ -968,18 +1629,6 @@ def remove_task(self, task_id: TaskID) -> None: with self._lock: del self._tasks[task_id] - def process_renderables( - self, renderables: List[ConsoleRenderable] - ) -> List[ConsoleRenderable]: - """Process renderables to restore cursor and display progress.""" - if self.console.is_terminal: - renderables = [ - self._live_render.position_cursor(), - *renderables, - self._live_render, - ] - return renderables - if __name__ == "__main__": # pragma: no coverage @@ -1027,19 +1676,22 @@ def process_renderables( examples = cycle(progress_renderables) console = Console(record=True) - try: - with Progress(console=console, transient=True) as progress: - - task1 = progress.add_task("[red]Downloading", total=1000) - task2 = progress.add_task("[green]Processing", total=1000) - task3 = progress.add_task("[yellow]Thinking", total=1000, start=False) - - while not progress.finished: - progress.update(task1, advance=0.5) - progress.update(task2, advance=0.3) - time.sleep(0.01) - if random.randint(0, 100) < 1: - progress.log(next(examples)) - except: - console.save_html("progress.html") - print("wrote progress.html") + + with Progress( + SpinnerColumn(), + *Progress.get_default_columns(), + TimeElapsedColumn(), + console=console, + transient=False, + ) as progress: + + task1 = progress.add_task("[red]Downloading", total=1000) + task2 = progress.add_task("[green]Processing", total=1000) + task3 = progress.add_task("[yellow]Thinking", total=None) + + while not progress.finished: + progress.update(task1, advance=0.5) + progress.update(task2, advance=0.3) + time.sleep(0.01) + if random.randint(0, 100) < 1: + progress.log(next(examples)) diff --git a/rich/progress_bar.py b/rich/progress_bar.py index c1e3be6e9e..9c3a4f25a2 100644 --- a/rich/progress_bar.py +++ b/rich/progress_bar.py @@ -19,10 +19,10 @@ class ProgressBar(JupyterMixin): """Renders a (progress) bar. Used by rich.progress. Args: - total (float, optional): Number of steps in the bar. Defaults to 100. + total (float, optional): Number of steps in the bar. Defaults to 100. Set to None to render a pulsing animation. completed (float, optional): Number of steps completed. Defaults to 0. width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. - pulse (bool, optional): Enable pulse effect. Defaults to False. + pulse (bool, optional): Enable pulse effect. Defaults to False. Will pulse if a None total was passed. style (StyleType, optional): Style for the bar background. Defaults to "bar.back". complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done". @@ -32,15 +32,15 @@ class ProgressBar(JupyterMixin): def __init__( self, - total: float = 100, + total: Optional[float] = 100.0, completed: float = 0, - width: int = None, + width: Optional[int] = None, pulse: bool = False, style: StyleType = "bar.back", complete_style: StyleType = "bar.complete", finished_style: StyleType = "bar.finished", pulse_style: StyleType = "bar.pulse", - animation_time: float = None, + animation_time: Optional[float] = None, ): self.total = total self.completed = completed @@ -58,8 +58,10 @@ def __repr__(self) -> str: return f"" @property - def percentage_completed(self) -> float: + def percentage_completed(self) -> Optional[float]: """Calculate percentage complete.""" + if self.total is None: + return None completed = (self.completed / self.total) * 100.0 completed = min(100, max(0.0, completed)) return completed @@ -70,6 +72,7 @@ def _get_pulse_segments( fore_style: Style, back_style: Style, color_system: str, + no_color: bool, ascii: bool = False, ) -> List[Segment]: """Get a list of segments to render a pulse animation. @@ -79,10 +82,9 @@ def _get_pulse_segments( """ bar = "-" if ascii else "━" segments: List[Segment] = [] - - if color_system != "truecolor": + if color_system not in ("standard", "eight_bit", "truecolor") or no_color: segments += [Segment(bar, fore_style)] * (PULSE_SIZE // 2) - segments += [Segment(bar if color_system else " ", back_style)] * ( + segments += [Segment(" " if no_color else bar, back_style)] * ( PULSE_SIZE - (PULSE_SIZE // 2) ) return segments @@ -111,7 +113,7 @@ def _get_pulse_segments( append(_Segment(bar, _Style(color=from_triplet(color)))) return segments - def update(self, completed: float, total: float = None) -> None: + def update(self, completed: float, total: Optional[float] = None) -> None: """Update progress with new values. Args: @@ -140,7 +142,7 @@ def _render_pulse( back_style = console.get_style(self.style, default="black") pulse_segments = self._get_pulse_segments( - fore_style, back_style, console.color_system, ascii=ascii + fore_style, back_style, console.color_system, console.no_color, ascii=ascii ) segment_count = len(pulse_segments) current_time = ( @@ -157,23 +159,29 @@ def __rich_console__( width = min(self.width or options.max_width, options.max_width) ascii = options.legacy_windows or options.ascii_only - if self.pulse: + should_pulse = self.pulse or self.total is None + if should_pulse: yield from self._render_pulse(console, width, ascii=ascii) return - completed = min(self.total, max(0, self.completed)) + completed: Optional[float] = ( + min(self.total, max(0, self.completed)) if self.total is not None else None + ) bar = "-" if ascii else "━" half_bar_right = " " if ascii else "╸" half_bar_left = " " if ascii else "╺" complete_halves = ( - int(width * 2 * completed / self.total) if self.total else width * 2 + int(width * 2 * completed / self.total) + if self.total and completed is not None + else width * 2 ) bar_count = complete_halves // 2 half_bar_count = complete_halves % 2 style = console.get_style(self.style) + is_finished = self.total is None or self.completed >= self.total complete_style = console.get_style( - self.complete_style if self.completed < self.total else self.finished_style + self.finished_style if is_finished else self.complete_style ) _Segment = Segment if bar_count: @@ -181,19 +189,22 @@ def __rich_console__( if half_bar_count: yield _Segment(half_bar_right * half_bar_count, complete_style) - remaining_bars = width - bar_count - half_bar_count - if remaining_bars and console.color_system is not None: - if not half_bar_count and bar_count: - yield _Segment(half_bar_left, style) - remaining_bars -= 1 - if remaining_bars: - yield _Segment(bar * remaining_bars, style) + if not console.no_color: + remaining_bars = width - bar_count - half_bar_count + if remaining_bars and console.color_system is not None: + if not half_bar_count and bar_count: + yield _Segment(half_bar_left, style) + remaining_bars -= 1 + if remaining_bars: + yield _Segment(bar * remaining_bars, style) - def __rich_measure__(self, console: Console, max_width: int) -> Measurement: + def __rich_measure__( + self, console: Console, options: ConsoleOptions + ) -> Measurement: return ( Measurement(self.width, self.width) if self.width is not None - else Measurement(4, max_width) + else Measurement(4, options.max_width) ) diff --git a/rich/prompt.py b/rich/prompt.py index 1a3cacd9e1..064c959b10 100644 --- a/rich/prompt.py +++ b/rich/prompt.py @@ -1,4 +1,4 @@ -from typing import IO, Any, Generic, List, Optional, TextIO, TypeVar, Union, overload +from typing import Any, Generic, List, Optional, TextIO, TypeVar, Union, overload from . import get_console from .console import Console @@ -16,8 +16,8 @@ class InvalidResponse(PromptError): """Exception to indicate a response was invalid. Raise this within process_response() to indicate an error and provide an error message. - Args: - message (Union[str, Text]): Error message. + Args: + message (Union[str, Text]): Error message. """ def __init__(self, message: TextType) -> None: @@ -54,9 +54,9 @@ def __init__( self, prompt: TextType = "", *, - console: Console = None, + console: Optional[Console] = None, password: bool = False, - choices: List[str] = None, + choices: Optional[List[str]] = None, show_default: bool = True, show_choices: bool = True, ) -> None: @@ -78,13 +78,13 @@ def ask( cls, prompt: TextType = "", *, - console: Console = None, + console: Optional[Console] = None, password: bool = False, - choices: List[str] = None, + choices: Optional[List[str]] = None, show_default: bool = True, show_choices: bool = True, default: DefaultType, - stream: TextIO = None, + stream: Optional[TextIO] = None, ) -> Union[DefaultType, PromptType]: ... @@ -94,12 +94,12 @@ def ask( cls, prompt: TextType = "", *, - console: Console = None, + console: Optional[Console] = None, password: bool = False, - choices: List[str] = None, + choices: Optional[List[str]] = None, show_default: bool = True, show_choices: bool = True, - stream: TextIO = None, + stream: Optional[TextIO] = None, ) -> PromptType: ... @@ -108,13 +108,13 @@ def ask( cls, prompt: TextType = "", *, - console: Console = None, + console: Optional[Console] = None, password: bool = False, - choices: List[str] = None, + choices: Optional[List[str]] = None, show_default: bool = True, show_choices: bool = True, default: Any = ..., - stream: TextIO = None, + stream: Optional[TextIO] = None, ) -> Any: """Shortcut to construct and run a prompt loop and return the result. @@ -188,7 +188,7 @@ def get_input( console: Console, prompt: TextType, password: bool, - stream: TextIO = None, + stream: Optional[TextIO] = None, ) -> str: """Get input from user. @@ -228,7 +228,7 @@ def process_response(self, value: str) -> PromptType: """ value = value.strip() try: - return_value = self.response_type(value) + return_value: PromptType = self.response_type(value) except ValueError: raise InvalidResponse(self.validate_error_message) @@ -250,16 +250,16 @@ def pre_prompt(self) -> None: """Hook to display something before the prompt.""" @overload - def __call__(self, *, stream: TextIO = None) -> PromptType: + def __call__(self, *, stream: Optional[TextIO] = None) -> PromptType: ... @overload def __call__( - self, *, default: DefaultType, stream: TextIO = None + self, *, default: DefaultType, stream: Optional[TextIO] = None ) -> Union[PromptType, DefaultType]: ... - def __call__(self, *, default: Any = ..., stream: TextIO = None) -> Any: + def __call__(self, *, default: Any = ..., stream: Optional[TextIO] = None) -> Any: """Run the prompt loop. Args: @@ -299,7 +299,7 @@ class IntPrompt(PromptBase[int]): """A prompt that returns an integer. Example: - >>> burrito_count = IntPrompt.ask("How many burritos do you want to order", prompt_suffix="? ") + >>> burrito_count = IntPrompt.ask("How many burritos do you want to order") """ @@ -330,11 +330,10 @@ class Confirm(PromptBase[bool]): response_type = bool validate_error_message = "[prompt.invalid]Please enter Y or N" - choices = ["y", "n"] + choices: List[str] = ["y", "n"] def render_default(self, default: DefaultType) -> Text: """Render the default as (y) or (n) rather than True/False.""" - assert self.choices is not None yes, no = self.choices return Text(f"({yes})" if default else f"({no})", style="prompt.default") @@ -343,7 +342,6 @@ def process_response(self, value: str) -> bool: value = value.strip().lower() if value not in self.choices: raise InvalidResponse(self.validate_error_message) - assert self.choices is not None return value == self.choices[0] diff --git a/rich/protocol.py b/rich/protocol.py index 6468e53169..c6923dd7d8 100644 --- a/rich/protocol.py +++ b/rich/protocol.py @@ -1,8 +1,42 @@ -from typing import Any +from typing import Any, cast, Set, TYPE_CHECKING +from inspect import isclass -from .abc import RichRenderable +if TYPE_CHECKING: + from rich.console import RenderableType + +_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf""" def is_renderable(check_object: Any) -> bool: """Check if an object may be rendered by Rich.""" - return isinstance(check_object, str) or isinstance(check_object, RichRenderable) + return ( + isinstance(check_object, str) + or hasattr(check_object, "__rich__") + or hasattr(check_object, "__rich_console__") + ) + + +def rich_cast(renderable: object) -> "RenderableType": + """Cast an object to a renderable by calling __rich__ if present. + + Args: + renderable (object): A potentially renderable object + + Returns: + object: The result of recursively calling __rich__. + """ + from rich.console import RenderableType + + rich_visited_set: Set[type] = set() # Prevent potential infinite loop + while hasattr(renderable, "__rich__") and not isclass(renderable): + # Detect object which claim to have all the attributes + if hasattr(renderable, _GIBBERISH): + return repr(renderable) + cast_method = getattr(renderable, "__rich__") + renderable = cast_method() + renderable_type = type(renderable) + if renderable_type in rich_visited_set: + break + rich_visited_set.add(renderable_type) + + return cast(RenderableType, renderable) diff --git a/rich/region.py b/rich/region.py new file mode 100644 index 0000000000..75b3631c38 --- /dev/null +++ b/rich/region.py @@ -0,0 +1,10 @@ +from typing import NamedTuple + + +class Region(NamedTuple): + """Defines a rectangular region of the screen.""" + + x: int + y: int + width: int + height: int diff --git a/rich/repr.py b/rich/repr.py new file mode 100644 index 0000000000..8bdfdae2aa --- /dev/null +++ b/rich/repr.py @@ -0,0 +1,152 @@ +from functools import partial +import inspect +import sys + +from typing import ( + Any, + Callable, + Iterable, + List, + Optional, + overload, + Union, + Tuple, + Type, + TypeVar, +) + + +T = TypeVar("T") + + +Result = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]] +RichReprResult = Result + + +class ReprError(Exception): + """An error occurred when attempting to build a repr.""" + + +@overload +def auto(cls: Optional[Type[T]]) -> Type[T]: + ... + + +@overload +def auto(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: + ... + + +def auto( + cls: Optional[Type[T]] = None, *, angular: Optional[bool] = None +) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: + """Class decorator to create __repr__ from __rich_repr__""" + + def do_replace(cls: Type[T], angular: Optional[bool] = None) -> Type[T]: + def auto_repr(self: T) -> str: + """Create repr string from __rich_repr__""" + repr_str: List[str] = [] + append = repr_str.append + + angular: bool = getattr(self.__rich_repr__, "angular", False) # type: ignore[attr-defined] + for arg in self.__rich_repr__(): # type: ignore[attr-defined] + if isinstance(arg, tuple): + if len(arg) == 1: + append(repr(arg[0])) + else: + key, value, *default = arg + if key is None: + append(repr(value)) + else: + if len(default) and default[0] == value: + continue + append(f"{key}={value!r}") + else: + append(repr(arg)) + if angular: + return f"<{self.__class__.__name__} {' '.join(repr_str)}>" + else: + return f"{self.__class__.__name__}({', '.join(repr_str)})" + + def auto_rich_repr(self: Type[T]) -> Result: + """Auto generate __rich_rep__ from signature of __init__""" + try: + signature = inspect.signature(self.__init__) + for name, param in signature.parameters.items(): + if param.kind == param.POSITIONAL_ONLY: + yield getattr(self, name) + elif param.kind in ( + param.POSITIONAL_OR_KEYWORD, + param.KEYWORD_ONLY, + ): + if param.default == param.empty: + yield getattr(self, param.name) + else: + yield param.name, getattr(self, param.name), param.default + except Exception as error: + raise ReprError( + f"Failed to auto generate __rich_repr__; {error}" + ) from None + + if not hasattr(cls, "__rich_repr__"): + auto_rich_repr.__doc__ = "Build a rich repr" + cls.__rich_repr__ = auto_rich_repr # type: ignore[attr-defined] + + auto_repr.__doc__ = "Return repr(self)" + cls.__repr__ = auto_repr # type: ignore[assignment] + if angular is not None: + cls.__rich_repr__.angular = angular # type: ignore[attr-defined] + return cls + + if cls is None: + return partial(do_replace, angular=angular) + else: + return do_replace(cls, angular=angular) + + +@overload +def rich_repr(cls: Optional[Type[T]]) -> Type[T]: + ... + + +@overload +def rich_repr(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: + ... + + +def rich_repr( + cls: Optional[Type[T]] = None, *, angular: bool = False +) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: + if cls is None: + return auto(angular=angular) + else: + return auto(cls) + + +if __name__ == "__main__": + + @auto + class Foo: + def __rich_repr__(self) -> Result: + yield "foo" + yield "bar", {"shopping": ["eggs", "ham", "pineapple"]} + yield "buy", "hand sanitizer" + + foo = Foo() + from rich.console import Console + + console = Console() + + console.rule("Standard repr") + console.print(foo) + + console.print(foo, width=60) + console.print(foo, width=30) + + console.rule("Angular repr") + Foo.__rich_repr__.angular = True # type: ignore[attr-defined] + + console.print(foo) + + console.print(foo, width=60) + console.print(foo, width=30) diff --git a/rich/rule.py b/rich/rule.py index 6ac88f70ad..d14394f25a 100644 --- a/rich/rule.py +++ b/rich/rule.py @@ -1,5 +1,6 @@ from typing import Union +from .align import AlignMethod from .cells import cell_len, set_cell_size from .console import Console, ConsoleOptions, RenderResult from .jupyter import JupyterMixin @@ -14,7 +15,8 @@ class Rule(JupyterMixin): title (Union[str, Text], optional): Text to render in the rule. Defaults to "". characters (str, optional): Character(s) used to draw the line. Defaults to "─". style (StyleType, optional): Style of Rule. Defaults to "rule.line". - end (str, optional): Character at end of Rule. defaults to "\\n" + end (str, optional): Character at end of Rule. defaults to "\\\\n" + align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". """ def __init__( @@ -24,15 +26,21 @@ def __init__( characters: str = "─", style: Union[str, Style] = "rule.line", end: str = "\n", + align: AlignMethod = "center", ) -> None: if cell_len(characters) < 1: raise ValueError( "'characters' argument must have a cell width of at least 1" ) + if align not in ("left", "center", "right"): + raise ValueError( + f'invalid value for align, expected "left", "center", "right" (not {align!r})' + ) self.title = title self.characters = characters self.style = style self.end = end + self.align = align def __repr__(self) -> str: return f"Rule({self.title!r}, {self.characters!r})" @@ -56,18 +64,21 @@ def __rich_console__( if not self.title: rule_text = Text(characters * ((width // chars_len) + 1), self.style) rule_text.truncate(width) + rule_text.plain = set_cell_size(rule_text.plain, width) + yield rule_text + return + + if isinstance(self.title, Text): + title_text = self.title else: - if isinstance(self.title, Text): - title_text = self.title - else: - title_text = console.render_str(self.title, style="rule.text") + title_text = console.render_str(self.title, style="rule.text") - if cell_len(title_text.plain) > width - 4: - title_text.truncate(width - 4, overflow="ellipsis") + title_text.plain = title_text.plain.replace("\n", " ") + title_text.expand_tabs() + rule_text = Text(end=self.end) - title_text.plain = title_text.plain.replace("\n", " ") - title_text.expand_tabs() - rule_text = Text(end=self.end) + if self.align == "center": + title_text.truncate(width - 4, overflow="ellipsis") side_width = (width - cell_len(title_text.plain)) // 2 left = Text(characters * (side_width // chars_len + 1)) left.truncate(side_width - 1) @@ -77,7 +88,18 @@ def __rich_console__( rule_text.append(left.plain + " ", self.style) rule_text.append(title_text) rule_text.append(" " + right.plain, self.style) - rule_text.plain = set_cell_size(rule_text.plain, width) + elif self.align == "left": + title_text.truncate(width - 2, overflow="ellipsis") + rule_text.append(title_text) + rule_text.append(" ") + rule_text.append(characters * (width - rule_text.cell_len), self.style) + elif self.align == "right": + title_text.truncate(width - 2, overflow="ellipsis") + rule_text.append(characters * (width - title_text.cell_len - 1), self.style) + rule_text.append(" ") + rule_text.append(title_text) + + rule_text.plain = set_cell_size(rule_text.plain, width) yield rule_text diff --git a/rich/scope.py b/rich/scope.py index 53f30b03a3..a1b76969cc 100644 --- a/rich/scope.py +++ b/rich/scope.py @@ -1,5 +1,5 @@ from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Tuple +from typing import TYPE_CHECKING, Any, Optional, Tuple from .highlighter import ReprHighlighter from .panel import Panel @@ -8,17 +8,17 @@ from .text import Text, TextType if TYPE_CHECKING: - from .console import ConsoleRenderable, RenderableType + from .console import ConsoleRenderable def render_scope( - scope: Mapping, + scope: "Mapping[str, Any]", *, - title: TextType = None, + title: Optional[TextType] = None, sort_keys: bool = True, indent_guides: bool = False, - max_length: int = None, - max_string: int = None, + max_length: Optional[int] = None, + max_string: Optional[int] = None, ) -> "ConsoleRenderable": """Render python variables in a given scope. @@ -32,7 +32,7 @@ def render_scope( max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. Returns: - RenderableType: A renderable object. + ConsoleRenderable: A renderable object. """ highlighter = ReprHighlighter() items_table = Table.grid(padding=(0, 1), expand=False) @@ -72,7 +72,7 @@ def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: print() - def test(foo, bar): + def test(foo: float, bar: float) -> None: list_of_things = [1, 2, 3, None, 4, True, False, "Hello World"] dict_of_things = { "version": "1.1", diff --git a/rich/screen.py b/rich/screen.py new file mode 100644 index 0000000000..b4f7fd19de --- /dev/null +++ b/rich/screen.py @@ -0,0 +1,54 @@ +from typing import Optional, TYPE_CHECKING + +from .segment import Segment +from .style import StyleType +from ._loop import loop_last + + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + RenderResult, + RenderableType, + Group, + ) + + +class Screen: + """A renderable that fills the terminal screen and crops excess. + + Args: + renderable (RenderableType): Child renderable. + style (StyleType, optional): Optional background style. Defaults to None. + """ + + renderable: "RenderableType" + + def __init__( + self, + *renderables: "RenderableType", + style: Optional[StyleType] = None, + application_mode: bool = False, + ) -> None: + from rich.console import Group + + self.renderable = Group(*renderables) + self.style = style + self.application_mode = application_mode + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + width, height = options.size + style = console.get_style(self.style) if self.style else None + render_options = options.update(width=width, height=height) + lines = console.render_lines( + self.renderable or "", render_options, style=style, pad=True + ) + lines = Segment.set_shape(lines, width, height, style=style) + new_line = Segment("\n\r") if self.application_mode else Segment.line() + for last, line in loop_last(lines): + yield from line + if not last: + yield new_line diff --git a/rich/segment.py b/rich/segment.py index db17b0fbb6..d825cfca4f 100644 --- a/rich/segment.py +++ b/rich/segment.py @@ -1,96 +1,221 @@ -from typing import NamedTuple, Optional - -from .cells import cell_len, set_cell_size +from enum import IntEnum +from functools import lru_cache +from itertools import filterfalse +from logging import getLogger +from operator import attrgetter +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from .cells import ( + _is_single_cell_widths, + cell_len, + get_character_cell_size, + set_cell_size, +) +from .repr import Result, rich_repr from .style import Style -from itertools import filterfalse, zip_longest -from operator import attrgetter -from typing import Iterable, List, Tuple +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + +log = getLogger("rich") + + +class ControlType(IntEnum): + """Non-printable control codes which typically translate to ANSI codes.""" + + BELL = 1 + CARRIAGE_RETURN = 2 + HOME = 3 + CLEAR = 4 + SHOW_CURSOR = 5 + HIDE_CURSOR = 6 + ENABLE_ALT_SCREEN = 7 + DISABLE_ALT_SCREEN = 8 + CURSOR_UP = 9 + CURSOR_DOWN = 10 + CURSOR_FORWARD = 11 + CURSOR_BACKWARD = 12 + CURSOR_MOVE_TO_COLUMN = 13 + CURSOR_MOVE_TO = 14 + ERASE_IN_LINE = 15 + SET_WINDOW_TITLE = 16 + +ControlCode = Union[ + Tuple[ControlType], + Tuple[ControlType, Union[int, str]], + Tuple[ControlType, int, int], +] + +@rich_repr() class Segment(NamedTuple): - """A piece of text with associated style. + """A piece of text with associated style. Segments are produced by the Console render process and + are ultimately converted in to strings to be written to the terminal. Args: text (str): A piece of text. style (:class:`~rich.style.Style`, optional): An optional style to apply to the text. - is_control (bool, optional): Boolean that marks segment as containing non-printable control codes. + control (Tuple[ControlCode], optional): Optional sequence of control codes. + + Attributes: + cell_length (int): The cell length of this Segment. """ - text: str = "" - """Raw text.""" + text: str style: Optional[Style] = None - """An optional style.""" - is_control: bool = False - """True if the segment contains control codes, otherwise False.""" - - def __repr__(self) -> str: - """Simplified repr.""" - if self.is_control: - return f"Segment.control({self.text!r}, {self.style!r})" + control: Optional[Sequence[ControlCode]] = None + + @property + def cell_length(self) -> int: + """The number of terminal cells required to display self.text. + + Returns: + int: A number of cells. + """ + text, _style, control = self + return 0 if control else cell_len(text) + + def __rich_repr__(self) -> Result: + yield self.text + if self.control is None: + if self.style is not None: + yield self.style else: - return f"Segment({self.text!r}, {self.style!r})" + yield self.style + yield self.control def __bool__(self) -> bool: """Check if the segment contains text.""" return bool(self.text) @property - def cell_length(self) -> int: - """Get cell length of segment.""" - return 0 if self.is_control else cell_len(self.text) + def is_control(self) -> bool: + """Check if the segment contains control codes.""" + return self.control is not None @classmethod - def control(cls, text: str, style: Optional[Style] = None) -> "Segment": - """Create a Segment with control codes. + @lru_cache(1024 * 16) + def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]: - Args: - text (str): Text containing non-printable control codes. - style (Optional[style]): Optional style. + text, style, control = segment + _Segment = Segment - Returns: - Segment: A Segment instance with ``is_control=True``. - """ - return cls(text, style, is_control=True) + cell_length = segment.cell_length + if cut >= cell_length: + return segment, _Segment("", style, control) + + cell_size = get_character_cell_size + + pos = int((cut / cell_length) * len(text)) + + before = text[:pos] + cell_pos = cell_len(before) + if cell_pos == cut: + return ( + _Segment(before, style, control), + _Segment(text[pos:], style, control), + ) + while pos < len(text): + char = text[pos] + pos += 1 + cell_pos += cell_size(char) + before = text[:pos] + if cell_pos == cut: + return ( + _Segment(before, style, control), + _Segment(text[pos:], style, control), + ) + if cell_pos > cut: + return ( + _Segment(before[: pos - 1] + " ", style, control), + _Segment(" " + text[pos:], style, control), + ) - @classmethod - def make_control(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Convert all segments in to control segments. + raise AssertionError("Will never reach here") + + def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]: + """Split segment in to two segments at the specified column. + + If the cut point falls in the middle of a 2-cell wide character then it is replaced + by two spaces, to preserve the display width of the parent segment. Returns: - Iterable[Segments]: Segments with is_control=True + Tuple[Segment, Segment]: Two segments. """ - return [cls(text, style, True) for text, style, _ in segments] + text, style, control = self + + if _is_single_cell_widths(text): + # Fast path with all 1 cell characters + if cut >= len(text): + return self, Segment("", style, control) + return ( + Segment(text[:cut], style, control), + Segment(text[cut:], style, control), + ) + + return self._split_cells(self, cut) @classmethod - def line(cls, is_control: bool = False) -> "Segment": + def line(cls) -> "Segment": """Make a new line segment.""" - return cls("\n", is_control=is_control) + return cls("\n") @classmethod def apply_style( - cls, segments: Iterable["Segment"], style: Style = None + cls, + segments: Iterable["Segment"], + style: Optional[Style] = None, + post_style: Optional[Style] = None, ) -> Iterable["Segment"]: - """Apply a style to an iterable of segments. + """Apply style(s) to an iterable of segments. + + Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``. Args: segments (Iterable[Segment]): Segments to process. - style (Style, optional): A style to apply. Defaults to None. + style (Style, optional): Base style. Defaults to None. + post_style (Style, optional): Style to apply on top of segment style. Defaults to None. Returns: Iterable[Segments]: A new iterable of segments (possibly the same iterable). """ - if style is None: - return segments - apply = style.__add__ - return ( - cls(text, None if is_control else apply(style), is_control) - for text, style, is_control in segments - ) + result_segments = segments + if style: + apply = style.__add__ + result_segments = ( + cls(text, None if control else apply(_style), control) + for text, _style, control in result_segments + ) + if post_style: + result_segments = ( + cls( + text, + ( + None + if control + else (_style + post_style if _style else post_style) + ), + control, + ) + for text, _style, control in result_segments + ) + return result_segments @classmethod def filter_control( - cls, segments: Iterable["Segment"], is_control=False + cls, segments: Iterable["Segment"], is_control: bool = False ) -> Iterable["Segment"]: """Filter segments by ``is_control`` attribute. @@ -103,9 +228,9 @@ def filter_control( """ if is_control: - return filter(attrgetter("is_control"), segments) + return filter(attrgetter("control"), segments) else: - return filterfalse(attrgetter("is_control"), segments) + return filterfalse(attrgetter("control"), segments) @classmethod def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]]: @@ -121,7 +246,7 @@ def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]] append = line.append for segment in segments: - if "\n" in segment.text and not segment.is_control: + if "\n" in segment.text and not segment.control: text, style, _ = segment while text: _text, new_line, text = text.partition("\n") @@ -141,7 +266,7 @@ def split_and_crop_lines( cls, segments: Iterable["Segment"], length: int, - style: Style = None, + style: Optional[Style] = None, pad: bool = True, include_new_lines: bool = True, ) -> Iterable[List["Segment"]]: @@ -164,7 +289,7 @@ def split_and_crop_lines( new_line_segment = cls("\n") for segment in segments: - if "\n" in segment.text and not segment.is_control: + if "\n" in segment.text and not segment.control: text, style, _ = segment while text: _text, new_line, text = text.partition("\n") @@ -185,7 +310,11 @@ def split_and_crop_lines( @classmethod def adjust_line_length( - cls, line: List["Segment"], length: int, style: Style = None, pad: bool = True + cls, + line: List["Segment"], + length: int, + style: Optional[Style] = None, + pad: bool = True, ) -> List["Segment"]: """Adjust a line to a given width (cropping or padding as required). @@ -212,7 +341,7 @@ def adjust_line_length( line_length = 0 for segment in line: segment_length = segment.cell_length - if line_length + segment_length < length or segment.is_control: + if line_length + segment_length < length or segment.control: append(segment) line_length += segment_length else: @@ -229,19 +358,20 @@ def get_line_length(cls, line: List["Segment"]) -> int: """Get the length of list of segments. Args: - line (List[Segment]): A line encoded as a list of Segments (assumes no '\\n' characters), + line (List[Segment]): A line encoded as a list of Segments (assumes no '\\\\n' characters), Returns: int: The length of the line. """ - return sum(segment.cell_length for segment in line) + _cell_len = cell_len + return sum(_cell_len(segment.text) for segment in line) @classmethod def get_shape(cls, lines: List[List["Segment"]]) -> Tuple[int, int]: """Get the shape (enclosing rectangle) of a list of lines. Args: - lines (List[List[Segment]]): A list of lines (no '\\n' characters). + lines (List[List[Segment]]): A list of lines (no '\\\\n' characters). Returns: Tuple[int, int]: Width and height in characters. @@ -255,8 +385,9 @@ def set_shape( cls, lines: List[List["Segment"]], width: int, - height: int = None, - style: Style = None, + height: Optional[int] = None, + style: Optional[Style] = None, + new_lines: bool = False, ) -> List[List["Segment"]]: """Set the shape of a list of lines (enclosing rectangle). @@ -264,24 +395,115 @@ def set_shape( lines (List[List[Segment]]): A list of lines. width (int): Desired width. height (int, optional): Desired height or None for no change. - style (Style, optional): Style of any padding added. Defaults to None. + style (Style, optional): Style of any padding added. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. Returns: - List[List[Segment]]: New list of lines that fits width x height. + List[List[Segment]]: New list of lines. """ - if height is None: - height = len(lines) - new_lines: List[List[Segment]] = [] - pad_line = [Segment(" " * width, style)] - append = new_lines.append + _height = height or len(lines) + + blank = ( + [cls(" " * width + "\n", style)] if new_lines else [cls(" " * width, style)] + ) + adjust_line_length = cls.adjust_line_length - line: Optional[List[Segment]] - for line, _ in zip_longest(lines, range(height)): - if line is None: - append(pad_line) - else: - append(adjust_line_length(line, width, style=style)) - return new_lines + shaped_lines = lines[:_height] + shaped_lines[:] = [ + adjust_line_length(line, width, style=style) for line in lines + ] + if len(shaped_lines) < _height: + shaped_lines.extend([blank] * (_height - len(shaped_lines))) + return shaped_lines + + @classmethod + def align_top( + cls: Type["Segment"], + lines: List[List["Segment"]], + width: int, + height: int, + style: Style, + new_lines: bool = False, + ) -> List[List["Segment"]]: + """Aligns lines to top (adds extra lines to bottom as required). + + Args: + lines (List[List[Segment]]): A list of lines. + width (int): Desired width. + height (int, optional): Desired height or None for no change. + style (Style): Style of any padding added. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. + + Returns: + List[List[Segment]]: New list of lines. + """ + extra_lines = height - len(lines) + if not extra_lines: + return lines[:] + lines = lines[:height] + blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) + lines = lines + [[blank]] * extra_lines + return lines + + @classmethod + def align_bottom( + cls: Type["Segment"], + lines: List[List["Segment"]], + width: int, + height: int, + style: Style, + new_lines: bool = False, + ) -> List[List["Segment"]]: + """Aligns render to bottom (adds extra lines above as required). + + Args: + lines (List[List[Segment]]): A list of lines. + width (int): Desired width. + height (int, optional): Desired height or None for no change. + style (Style): Style of any padding added. Defaults to None. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. + + Returns: + List[List[Segment]]: New list of lines. + """ + extra_lines = height - len(lines) + if not extra_lines: + return lines[:] + lines = lines[:height] + blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) + lines = [[blank]] * extra_lines + lines + return lines + + @classmethod + def align_middle( + cls: Type["Segment"], + lines: List[List["Segment"]], + width: int, + height: int, + style: Style, + new_lines: bool = False, + ) -> List[List["Segment"]]: + """Aligns lines to middle (adds extra lines to above and below as required). + + Args: + lines (List[List[Segment]]): A list of lines. + width (int): Desired width. + height (int, optional): Desired height or None for no change. + style (Style): Style of any padding added. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. + + Returns: + List[List[Segment]]: New list of lines. + """ + extra_lines = height - len(lines) + if not extra_lines: + return lines[:] + lines = lines[:height] + blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) + top_lines = extra_lines // 2 + bottom_lines = extra_lines - top_lines + lines = [[blank]] * top_lines + lines + [[blank]] * bottom_lines + return lines @classmethod def simplify(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: @@ -301,7 +523,7 @@ def simplify(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: _Segment = Segment for segment in iter_segments: - if last_segment.style == segment.style and not segment.is_control: + if last_segment.style == segment.style and not segment.control: last_segment = _Segment( last_segment.text + segment.text, last_segment.style ) @@ -321,27 +543,190 @@ def strip_links(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: Segment: Segments with link removed. """ for segment in segments: - if segment.is_control or segment.style is None: + if segment.control or segment.style is None: yield segment else: - text, style, _is_control = segment + text, style, _control = segment yield cls(text, style.update_link(None) if style else None) @classmethod def strip_styles(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: """Remove all styles from an iterable of segments. + Args: + segments (Iterable[Segment]): An iterable segments. + Yields: Segment: Segments with styles replace with None """ - for text, _style, is_control in segments: - yield cls(text, None, is_control) + for text, _style, control in segments: + yield cls(text, None, control) + @classmethod + def remove_color(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: + """Remove all color from an iterable of segments. -if __name__ == "__main__": # pragma: no cover - lines = [[Segment("Hello")]] - lines = Segment.set_shape(lines, 50, 4, style=Style.parse("on blue")) - for line in lines: - print(line) + Args: + segments (Iterable[Segment]): An iterable segments. + + Yields: + Segment: Segments with colorless style. + """ - print(Style.parse("on blue") + Style.parse("on red")) + cache: Dict[Style, Style] = {} + for text, style, control in segments: + if style: + colorless_style = cache.get(style) + if colorless_style is None: + colorless_style = style.without_color + cache[style] = colorless_style + yield cls(text, colorless_style, control) + else: + yield cls(text, None, control) + + @classmethod + def divide( + cls, segments: Iterable["Segment"], cuts: Iterable[int] + ) -> Iterable[List["Segment"]]: + """Divides an iterable of segments in to portions. + + Args: + cuts (Iterable[int]): Cell positions where to divide. + + Yields: + [Iterable[List[Segment]]]: An iterable of Segments in List. + """ + split_segments: List["Segment"] = [] + add_segment = split_segments.append + + iter_cuts = iter(cuts) + + while True: + try: + cut = next(iter_cuts) + except StopIteration: + return [] + if cut != 0: + break + yield [] + pos = 0 + + _cell_len = cell_len + for segment in segments: + text, _style, control = segment + while text: + if control: + end_pos = pos + else: + end_pos = pos + _cell_len(text) + if end_pos < cut: + add_segment(segment) + pos = end_pos + break + + try: + if end_pos == cut: + add_segment(segment) + yield split_segments[:] + del split_segments[:] + pos = end_pos + break + else: + before, segment = segment.split_cells(cut - pos) + text, _style, control = segment + add_segment(before) + yield split_segments[:] + del split_segments[:] + pos = cut + finally: + try: + cut = next(iter_cuts) + except StopIteration: + if split_segments: + yield split_segments[:] + return + yield split_segments[:] + + +class Segments: + """A simple renderable to render an iterable of segments. This class may be useful if + you want to print segments outside of a __rich_console__ method. + + Args: + segments (Iterable[Segment]): An iterable of segments. + new_lines (bool, optional): Add new lines between segments. Defaults to False. + """ + + def __init__(self, segments: Iterable[Segment], new_lines: bool = False) -> None: + self.segments = list(segments) + self.new_lines = new_lines + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.new_lines: + line = Segment.line() + for segment in self.segments: + yield segment + yield line + else: + yield from self.segments + + +class SegmentLines: + def __init__(self, lines: Iterable[List[Segment]], new_lines: bool = False) -> None: + """A simple renderable containing a number of lines of segments. May be used as an intermediate + in rendering process. + + Args: + lines (Iterable[List[Segment]]): Lists of segments forming lines. + new_lines (bool, optional): Insert new lines after each line. Defaults to False. + """ + self.lines = list(lines) + self.new_lines = new_lines + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.new_lines: + new_line = Segment.line() + for line in self.lines: + yield from line + yield new_line + else: + for line in self.lines: + yield from line + + +if __name__ == "__main__": # pragma: no cover + from rich.console import Console + from rich.syntax import Syntax + from rich.text import Text + + code = """from rich.console import Console +console = Console() +text = Text.from_markup("Hello, [bold magenta]World[/]!") +console.print(text)""" + + text = Text.from_markup("Hello, [bold magenta]World[/]!") + + console = Console() + + console.rule("rich.Segment") + console.print( + "A Segment is the last step in the Rich render process before generating text with ANSI codes." + ) + console.print("\nConsider the following code:\n") + console.print(Syntax(code, "python", line_numbers=True)) + console.print() + console.print( + "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the the following:\n" + ) + fragments = list(console.render(text)) + console.print(fragments) + console.print() + console.print("The Segments are then processed to produce the following output:\n") + console.print(text) + console.print( + "\nYou will only need to know this if you are implementing your own Rich renderables." + ) diff --git a/rich/spinner.py b/rich/spinner.py new file mode 100644 index 0000000000..0879088e14 --- /dev/null +++ b/rich/spinner.py @@ -0,0 +1,136 @@ +from typing import cast, List, Optional, TYPE_CHECKING, Union + +from ._spinners import SPINNERS +from .measure import Measurement +from .table import Table +from .text import Text + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult, RenderableType + from .style import StyleType + + +class Spinner: + def __init__( + self, + name: str, + text: "RenderableType" = "", + *, + style: Optional["StyleType"] = None, + speed: float = 1.0, + ) -> None: + """A spinner animation. + + Args: + name (str): Name of spinner (run python -m rich.spinner). + text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". + style (StyleType, optional): Style for spinner animation. Defaults to None. + speed (float, optional): Speed factor for animation. Defaults to 1.0. + + Raises: + KeyError: If name isn't one of the supported spinner animations. + """ + try: + spinner = SPINNERS[name] + except KeyError: + raise KeyError(f"no spinner called {name!r}") + self.text: "Union[RenderableType, Text]" = ( + Text.from_markup(text) if isinstance(text, str) else text + ) + self.frames = cast(List[str], spinner["frames"])[:] + self.interval = cast(float, spinner["interval"]) + self.start_time: Optional[float] = None + self.style = style + self.speed = speed + self.frame_no_offset: float = 0.0 + self._update_speed = 0.0 + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + yield self.render(console.get_time()) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + text = self.render(0) + return Measurement.get(console, options, text) + + def render(self, time: float) -> "RenderableType": + """Render the spinner for a given time. + + Args: + time (float): Time in seconds. + + Returns: + RenderableType: A renderable containing animation frame. + """ + if self.start_time is None: + self.start_time = time + + frame_no = ((time - self.start_time) * self.speed) / ( + self.interval / 1000.0 + ) + self.frame_no_offset + frame = Text( + self.frames[int(frame_no) % len(self.frames)], style=self.style or "" + ) + + if self._update_speed: + self.frame_no_offset = frame_no + self.start_time = time + self.speed = self._update_speed + self._update_speed = 0.0 + + if not self.text: + return frame + elif isinstance(self.text, (str, Text)): + return Text.assemble(frame, " ", self.text) + else: + table = Table.grid(padding=1) + table.add_row(frame, self.text) + return table + + def update( + self, + *, + text: "RenderableType" = "", + style: Optional["StyleType"] = None, + speed: Optional[float] = None, + ) -> None: + """Updates attributes of a spinner after it has been started. + + Args: + text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". + style (StyleType, optional): Style for spinner animation. Defaults to None. + speed (float, optional): Speed factor for animation. Defaults to None. + """ + if text: + self.text = Text.from_markup(text) if isinstance(text, str) else text + if style: + self.style = style + if speed: + self._update_speed = speed + + +if __name__ == "__main__": # pragma: no cover + from time import sleep + + from .columns import Columns + from .panel import Panel + from .live import Live + + all_spinners = Columns( + [ + Spinner(spinner_name, text=Text(repr(spinner_name), style="green")) + for spinner_name in sorted(SPINNERS.keys()) + ], + column_first=True, + expand=True, + ) + + with Live( + Panel(all_spinners, title="Spinners", border_style="blue"), + refresh_per_second=20, + ) as live: + while True: + sleep(0.1) diff --git a/rich/status.py b/rich/status.py new file mode 100644 index 0000000000..09eff405ec --- /dev/null +++ b/rich/status.py @@ -0,0 +1,132 @@ +from types import TracebackType +from typing import Optional, Type + +from .console import Console, RenderableType +from .jupyter import JupyterMixin +from .live import Live +from .spinner import Spinner +from .style import StyleType + + +class Status(JupyterMixin): + """Displays a status indicator with a 'spinner' animation. + + Args: + status (RenderableType): A status renderable (str or Text typically). + console (Console, optional): Console instance to use, or None for global console. Defaults to None. + spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". + spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". + speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. + refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. + """ + + def __init__( + self, + status: RenderableType, + *, + console: Optional[Console] = None, + spinner: str = "dots", + spinner_style: StyleType = "status.spinner", + speed: float = 1.0, + refresh_per_second: float = 12.5, + ): + self.status = status + self.spinner_style = spinner_style + self.speed = speed + self._spinner = Spinner(spinner, text=status, style=spinner_style, speed=speed) + self._live = Live( + self.renderable, + console=console, + refresh_per_second=refresh_per_second, + transient=True, + ) + + @property + def renderable(self) -> Spinner: + return self._spinner + + @property + def console(self) -> "Console": + """Get the Console used by the Status objects.""" + return self._live.console + + def update( + self, + status: Optional[RenderableType] = None, + *, + spinner: Optional[str] = None, + spinner_style: Optional[StyleType] = None, + speed: Optional[float] = None, + ) -> None: + """Update status. + + Args: + status (Optional[RenderableType], optional): New status renderable or None for no change. Defaults to None. + spinner (Optional[str], optional): New spinner or None for no change. Defaults to None. + spinner_style (Optional[StyleType], optional): New spinner style or None for no change. Defaults to None. + speed (Optional[float], optional): Speed factor for spinner animation or None for no change. Defaults to None. + """ + if status is not None: + self.status = status + if spinner_style is not None: + self.spinner_style = spinner_style + if speed is not None: + self.speed = speed + if spinner is not None: + self._spinner = Spinner( + spinner, text=self.status, style=self.spinner_style, speed=self.speed + ) + self._live.update(self.renderable, refresh=True) + else: + self._spinner.update( + text=self.status, style=self.spinner_style, speed=self.speed + ) + + def start(self) -> None: + """Start the status animation.""" + self._live.start() + + def stop(self) -> None: + """Stop the spinner animation.""" + self._live.stop() + + def __rich__(self) -> RenderableType: + return self.renderable + + def __enter__(self) -> "Status": + self.start() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.stop() + + +if __name__ == "__main__": # pragma: no cover + + from time import sleep + + from .console import Console + + console = Console() + with console.status("[magenta]Covid detector booting up") as status: + sleep(3) + console.log("Importing advanced AI") + sleep(3) + console.log("Advanced Covid AI Ready") + sleep(3) + status.update(status="[bold blue] Scanning for Covid", spinner="earth") + sleep(3) + console.log("Found 10,000,000,000 copies of Covid32.exe") + sleep(3) + status.update( + status="[bold red]Moving Covid32.exe to Trash", + spinner="bouncingBall", + spinner_style="yellow", + ) + sleep(5) + console.print("[bold green]Covid deleted successfully") diff --git a/rich/style.py b/rich/style.py index 5a802d0762..bccbf23437 100644 --- a/rich/style.py +++ b/rich/style.py @@ -1,13 +1,15 @@ import sys from functools import lru_cache +from marshal import loads, dumps from random import randint -from time import time -from typing import Any, Dict, Iterable, List, Optional, Type, Union +from typing import Any, cast, Dict, Iterable, List, Optional, Type, Union from . import errors from .color import Color, ColorParseError, ColorSystem, blend_rgb +from .repr import rich_repr, Result from .terminal_theme import DEFAULT_TERMINAL_THEME, TerminalTheme + # Style instances and style definitions are often interchangeable StyleType = Union[str, "Style"] @@ -26,6 +28,7 @@ def __get__(self, obj: "Style", objtype: Type["Style"]) -> Optional[bool]: return None +@rich_repr class Style: """A terminal style. @@ -59,6 +62,7 @@ class Style: _set_attributes: int _hash: int _null: bool + _meta: Optional[bytes] __slots__ = [ "_color", @@ -71,6 +75,7 @@ class Style: "_style_definition", "_hash", "_null", + "_meta", ] # maps bits on to SGR parameter @@ -90,25 +95,51 @@ class Style: 12: "53", } + STYLE_ATTRIBUTES = { + "dim": "dim", + "d": "dim", + "bold": "bold", + "b": "bold", + "italic": "italic", + "i": "italic", + "underline": "underline", + "u": "underline", + "blink": "blink", + "blink2": "blink2", + "reverse": "reverse", + "r": "reverse", + "conceal": "conceal", + "c": "conceal", + "strike": "strike", + "s": "strike", + "underline2": "underline2", + "uu": "underline2", + "frame": "frame", + "encircle": "encircle", + "overline": "overline", + "o": "overline", + } + def __init__( self, *, - color: Union[Color, str] = None, - bgcolor: Union[Color, str] = None, - bold: bool = None, - dim: bool = None, - italic: bool = None, - underline: bool = None, - blink: bool = None, - blink2: bool = None, - reverse: bool = None, - conceal: bool = None, - strike: bool = None, - underline2: bool = None, - frame: bool = None, - encircle: bool = None, - overline: bool = None, - link: str = None, + color: Optional[Union[Color, str]] = None, + bgcolor: Optional[Union[Color, str]] = None, + bold: Optional[bool] = None, + dim: Optional[bool] = None, + italic: Optional[bool] = None, + underline: Optional[bool] = None, + blink: Optional[bool] = None, + blink2: Optional[bool] = None, + reverse: Optional[bool] = None, + conceal: Optional[bool] = None, + strike: Optional[bool] = None, + underline2: Optional[bool] = None, + frame: Optional[bool] = None, + encircle: Optional[bool] = None, + overline: Optional[bool] = None, + link: Optional[str] = None, + meta: Optional[Dict[str, Any]] = None, ): self._ansi: Optional[str] = None self._style_definition: Optional[str] = None @@ -158,7 +189,8 @@ def _make_color(color: Union[Color, str]) -> Color: ) self._link = link - self._link_id = f"{time()}-{randint(0, 999999)}" if link else "" + self._link_id = f"{randint(0, 999999)}" if link else "" + self._meta = None if meta is None else dumps(meta) self._hash = hash( ( self._color, @@ -166,9 +198,10 @@ def _make_color(color: Union[Color, str]) -> Color: self._attributes, self._set_attributes, link, + self._meta, ) ) - self._null = not (self._set_attributes or color or bgcolor or link) + self._null = not (self._set_attributes or color or bgcolor or link or meta) @classmethod def null(cls) -> "Style": @@ -176,14 +209,16 @@ def null(cls) -> "Style": return NULL_STYLE @classmethod - def from_color(cls, color: Color = None, bgcolor: Color = None) -> "Style": + def from_color( + cls, color: Optional[Color] = None, bgcolor: Optional[Color] = None + ) -> "Style": """Create a new style with colors and no attributes. Returns: color (Optional[Color]): A (foreground) color, or None for no color. Defaults to None. bgcolor (Optional[Color]): A (background) color, or None for no color. Defaults to None. """ - style = cls.__new__(Style) + style: Style = cls.__new__(Style) style._ansi = None style._style_definition = None style._color = color @@ -192,6 +227,7 @@ def from_color(cls, color: Color = None, bgcolor: Color = None) -> "Style": style._attributes = 0 style._link = None style._link_id = "" + style._meta = None style._hash = hash( ( color, @@ -199,11 +235,60 @@ def from_color(cls, color: Color = None, bgcolor: Color = None) -> "Style": None, None, None, + None, ) ) style._null = not (color or bgcolor) return style + @classmethod + def from_meta(cls, meta: Optional[Dict[str, Any]]) -> "Style": + """Create a new style with meta data. + + Returns: + meta (Optional[Dict[str, Any]]): A dictionary of meta data. Defaults to None. + """ + style: Style = cls.__new__(Style) + style._ansi = None + style._style_definition = None + style._color = None + style._bgcolor = None + style._set_attributes = 0 + style._attributes = 0 + style._link = None + style._link_id = "" + style._meta = dumps(meta) + style._hash = hash( + ( + None, + None, + None, + None, + None, + style._meta, + ) + ) + style._null = not (meta) + return style + + @classmethod + def on(cls, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Style": + """Create a blank style with meta information. + + Example: + style = Style.on(click=self.on_click) + + Args: + meta (Optiona[Dict[str, Any]], optional): An optional dict of meta information. + **handlers (Any): Keyword arguments are translated in to handlers. + + Returns: + Style: A Style with meta information attached. + """ + meta = {} if meta is None else meta + meta.update({f"@{key}": value for key, value in handlers.items()}) + return cls.from_meta(meta) + bold = _Bit(0) dim = _Bit(1) italic = _Bit(2) @@ -340,9 +425,24 @@ def pick_first(cls, *values: Optional[StyleType]) -> StyleType: return value raise ValueError("expected at least one non-None style") - def __repr__(self) -> str: - """Render a named style differently from an anonymous style.""" - return f'Style.parse("{self}")' + def __rich_repr__(self) -> Result: + yield "color", self.color, None + yield "bgcolor", self.bgcolor, None + yield "bold", self.bold, None, + yield "dim", self.dim, None, + yield "italic", self.italic, None + yield "underline", self.underline, None, + yield "blink", self.blink, None + yield "blink2", self.blink2, None + yield "reverse", self.reverse, None + yield "conceal", self.conceal, None + yield "strike", self.strike, None + yield "underline2", self.underline2, None + yield "frame", self.frame, None + yield "encircle", self.encircle, None + yield "link", self.link, None + if self._meta: + yield "meta", self.meta def __eq__(self, other: Any) -> bool: if not isinstance(other, Style): @@ -353,6 +453,7 @@ def __eq__(self, other: Any) -> bool: and self._set_attributes == other._set_attributes and self._attributes == other._attributes and self._link == other._link + and self._meta == other._meta ) def __hash__(self) -> int: @@ -383,6 +484,30 @@ def background_style(self) -> "Style": """A Style with background only.""" return Style(bgcolor=self.bgcolor) + @property + def meta(self) -> Dict[str, Any]: + """Get meta information (can not be changed after construction).""" + return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta)) + + @property + def without_color(self) -> "Style": + """Get a copy of the style with color removed.""" + if self._null: + return NULL_STYLE + style: Style = self.__new__(Style) + style._ansi = None + style._style_definition = None + style._color = None + style._bgcolor = None + style._attributes = self._attributes + style._set_attributes = self._set_attributes + style._link = self._link + style._link_id = f"{randint(0, 999999)}" if self._link else "" + style._hash = self._hash + style._null = False + style._meta = None + return style + @classmethod @lru_cache(maxsize=4096) def parse(cls, style_definition: str) -> "Style": @@ -397,36 +522,13 @@ def parse(cls, style_definition: str) -> "Style": Returns: `Style`: A Style instance. """ - if style_definition.strip() == "none": + if style_definition.strip() == "none" or not style_definition: return cls.null() - style_attributes = { - "dim": "dim", - "d": "dim", - "bold": "bold", - "b": "bold", - "italic": "italic", - "i": "italic", - "underline": "underline", - "u": "underline", - "blink": "blink", - "blink2": "blink2", - "reverse": "reverse", - "r": "reverse", - "conceal": "conceal", - "c": "conceal", - "strike": "strike", - "s": "strike", - "underline2": "underline2", - "uu": "underline2", - "frame": "frame", - "encircle": "encircle", - "overline": "overline", - "o": "overline", - } + STYLE_ATTRIBUTES = cls.STYLE_ATTRIBUTES color: Optional[str] = None bgcolor: Optional[str] = None - attributes: Dict[str, Optional[bool]] = {} + attributes: Dict[str, Optional[Any]] = {} link: Optional[str] = None words = iter(style_definition.split()) @@ -446,7 +548,7 @@ def parse(cls, style_definition: str) -> "Style": elif word == "not": word = next(words, "") - attribute = style_attributes.get(word) + attribute = STYLE_ATTRIBUTES.get(word) if attribute is None: raise errors.StyleSyntaxError( f"expected style attribute after 'not', found {word!r}" @@ -459,8 +561,8 @@ def parse(cls, style_definition: str) -> "Style": raise errors.StyleSyntaxError("URL expected after 'link'") link = word - elif word in style_attributes: - attributes[style_attributes[word]] = True + elif word in STYLE_ATTRIBUTES: + attributes[STYLE_ATTRIBUTES[word]] = True else: try: @@ -474,7 +576,7 @@ def parse(cls, style_definition: str) -> "Style": return style @lru_cache(maxsize=1024) - def get_html_style(self, theme: TerminalTheme = None) -> str: + def get_html_style(self, theme: Optional[TerminalTheme] = None) -> str: """Get a CSS style rule.""" theme = theme or DEFAULT_TERMINAL_THEME css: List[str] = [] @@ -494,6 +596,7 @@ def get_html_style(self, theme: TerminalTheme = None) -> str: if color is not None: theme_color = color.get_truecolor(theme) append(f"color: {theme_color.hex}") + append(f"text-decoration-color: {theme_color.hex}") if bgcolor is not None: theme_color = bgcolor.get_truecolor(theme, foreground=False) append(f"background-color: {theme_color.hex}") @@ -543,7 +646,7 @@ def copy(self) -> "Style": """ if self._null: return NULL_STYLE - style = self.__new__(Style) + style: Style = self.__new__(Style) style._ansi = self._ansi style._style_definition = self._style_definition style._color = self._color @@ -551,12 +654,13 @@ def copy(self) -> "Style": style._attributes = self._attributes style._set_attributes = self._set_attributes style._link = self._link - style._link_id = f"{time()}-{randint(0, 999999)}" if self._link else "" + style._link_id = f"{randint(0, 999999)}" if self._link else "" style._hash = self._hash style._null = False + style._meta = self._meta return style - def update_link(self, link: str = None) -> "Style": + def update_link(self, link: Optional[str] = None) -> "Style": """Get a copy with a different value for link. Args: @@ -565,7 +669,7 @@ def update_link(self, link: str = None) -> "Style": Returns: Style: A new Style instance. """ - style = self.__new__(Style) + style: Style = self.__new__(Style) style._ansi = self._ansi style._style_definition = self._style_definition style._color = self._color @@ -573,9 +677,10 @@ def update_link(self, link: str = None) -> "Style": style._attributes = self._attributes style._set_attributes = self._set_attributes style._link = link - style._link_id = f"{time()}-{randint(0, 999999)}" if link else "" + style._link_id = f"{randint(0, 999999)}" if link else "" style._hash = self._hash style._null = False + style._meta = self._meta return style def render( @@ -618,12 +723,12 @@ def test(self, text: Optional[str] = None) -> None: def __add__(self, style: Optional["Style"]) -> "Style": if not (isinstance(style, Style) or style is None): - return NotImplemented # type: ignore + return NotImplemented if style is None or style._null: return self if self._null: return style - new_style = self.__new__(Style) + new_style: Style = self.__new__(Style) new_style._ansi = None new_style._style_definition = None new_style._color = style._color or self._color @@ -635,7 +740,11 @@ def __add__(self, style: Optional["Style"]) -> "Style": new_style._link = style._link or self._link new_style._link_id = style._link_id or self._link_id new_style._hash = style._hash - new_style._null = self._null or style._null + new_style._null = style._null + if self._meta and style._meta: + new_style._meta = dumps({**self.meta, **style.meta}) + else: + new_style._meta = self._meta or style._meta return new_style diff --git a/rich/styled.py b/rich/styled.py index f1631221c6..27243beb76 100644 --- a/rich/styled.py +++ b/rich/styled.py @@ -28,8 +28,10 @@ def __rich_console__( segments = Segment.apply_style(rendered_segments, style) return segments - def __rich_measure__(self, console: "Console", max_width: int) -> Measurement: - return Measurement.get(console, self.renderable, max_width) + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + return Measurement.get(console, options, self.renderable) if __name__ == "__main__": # pragma: no cover diff --git a/rich/syntax.py b/rich/syntax.py index 2aa237d4c3..cb34855acd 100644 --- a/rich/syntax.py +++ b/rich/syntax.py @@ -2,8 +2,9 @@ import platform import textwrap from abc import ABC, abstractmethod -from typing import Any, Dict, Optional, Set, Tuple, Type, Union +from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Type, Union +from pygments.lexer import Lexer from pygments.lexers import get_lexer_by_name, guess_lexer_for_filename from pygments.style import Style as PygmentsStyle from pygments.styles import get_style_by_name @@ -21,11 +22,15 @@ ) from pygments.util import ClassNotFound +from rich.containers import Lines +from rich.padding import Padding, PaddingDimensions + from ._loop import loop_first -from .color import Color, blend_rgb, parse_rgb_hex -from .console import Console, ConsoleOptions, JustifyMethod, RenderResult, Segment +from .color import Color, blend_rgb +from .console import Console, ConsoleOptions, JustifyMethod, RenderResult from .jupyter import JupyterMixin from .measure import Measurement +from .segment import Segment, Segments from .style import Style from .text import Text @@ -96,6 +101,7 @@ } RICH_SYNTAX_THEMES = {"ansi_light": ANSI_LIGHT, "ansi_dark": ANSI_DARK} +NUMBERS_COLUMN_DEFAULT_PADDING = 2 class SyntaxTheme(ABC): @@ -113,7 +119,7 @@ def get_background_style(self) -> Style: class PygmentsSyntaxTheme(SyntaxTheme): - """Syntax theme that delagates to Pygments theme.""" + """Syntax theme that delegates to Pygments theme.""" def __init__(self, theme: Union[str, Type[PygmentsStyle]]) -> None: self._style_cache: Dict[TokenType, Style] = {} @@ -192,18 +198,20 @@ class Syntax(JupyterMixin): Args: code (str): Code to highlight. - lexer_name (str): Lexer to use (see https://pygments.org/docs/lexers/) + lexer (Lexer | str): Lexer to use (see https://pygments.org/docs/lexers/) theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "monokai". dedent (bool, optional): Enable stripping of initial whitespace. Defaults to False. line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. start_line (int, optional): Starting number for line numbers. Defaults to 1. - line_range (Tuple[int, int], optional): If given should be a tuple of the start and end line to render. + line_range (Tuple[int | None, int | None], optional): If given should be a tuple of the start and end line to render. + A value of None in the tuple indicates the range is open in that direction. highlight_lines (Set[int]): A set of line numbers to highlight. code_width: Width of code to render (not including line numbers), or ``None`` to use all available width. tab_size (int, optional): Size of tabs. Defaults to 4. word_wrap (bool, optional): Enable word wrapping. background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. indent_guides (bool, optional): Show indent guides. Defaults to False. + padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). """ _pygments_style_class: Type[PygmentsStyle] @@ -224,22 +232,23 @@ def get_theme(cls, name: Union[str, SyntaxTheme]) -> SyntaxTheme: def __init__( self, code: str, - lexer_name: str, + lexer: Union[Lexer, str], *, theme: Union[str, SyntaxTheme] = DEFAULT_THEME, dedent: bool = False, line_numbers: bool = False, start_line: int = 1, - line_range: Tuple[int, int] = None, - highlight_lines: Set[int] = None, + line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, + highlight_lines: Optional[Set[int]] = None, code_width: Optional[int] = None, tab_size: int = 4, word_wrap: bool = False, - background_color: str = None, + background_color: Optional[str] = None, indent_guides: bool = False, + padding: PaddingDimensions = 0, ) -> None: self.code = code - self.lexer_name = lexer_name + self._lexer = lexer self.dedent = dedent self.line_numbers = line_numbers self.start_line = start_line @@ -249,7 +258,11 @@ def __init__( self.tab_size = tab_size self.word_wrap = word_wrap self.background_color = background_color + self.background_style = ( + Style(bgcolor=background_color) if background_color else Style() + ) self.indent_guides = indent_guides + self.padding = padding self._theme = self.get_theme(theme) @@ -258,23 +271,26 @@ def from_path( cls, path: str, encoding: str = "utf-8", + lexer: Optional[Union[Lexer, str]] = None, theme: Union[str, SyntaxTheme] = DEFAULT_THEME, dedent: bool = False, line_numbers: bool = False, - line_range: Tuple[int, int] = None, + line_range: Optional[Tuple[int, int]] = None, start_line: int = 1, - highlight_lines: Set[int] = None, + highlight_lines: Optional[Set[int]] = None, code_width: Optional[int] = None, tab_size: int = 4, word_wrap: bool = False, - background_color: str = None, + background_color: Optional[str] = None, indent_guides: bool = False, + padding: PaddingDimensions = 0, ) -> "Syntax": """Construct a Syntax object from a file. Args: path (str): Path to file to highlight. encoding (str): Encoding of file. + lexer (str | Lexer, optional): Lexer to use. If None, lexer will be auto-detected from path/file content. theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "emacs". dedent (bool, optional): Enable stripping of initial whitespace. Defaults to True. line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. @@ -286,6 +302,7 @@ def from_path( word_wrap (bool, optional): Enable word wrapping of code. background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. indent_guides (bool, optional): Show indent guides. Defaults to False. + padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). Returns: [Syntax]: A Syntax object that may be printed to the console @@ -293,26 +310,12 @@ def from_path( with open(path, "rt", encoding=encoding) as code_file: code = code_file.read() - lexer = None - lexer_name = "default" - try: - _, ext = os.path.splitext(path) - if ext: - extension = ext.lstrip(".").lower() - lexer = get_lexer_by_name(extension) - lexer_name = lexer.name - except ClassNotFound: - pass - - if lexer is None: - try: - lexer_name = guess_lexer_for_filename(path, code).name - except ClassNotFound: - pass + if not lexer: + lexer = cls.guess_lexer(path, code=code) return cls( code, - lexer_name, + lexer, theme=theme, dedent=dedent, line_numbers=line_numbers, @@ -324,15 +327,54 @@ def from_path( word_wrap=word_wrap, background_color=background_color, indent_guides=indent_guides, + padding=padding, ) + @classmethod + def guess_lexer(cls, path: str, code: Optional[str] = None) -> str: + """Guess the alias of the Pygments lexer to use based on a path and an optional string of code. + If code is supplied, it will use a combination of the code and the filename to determine the + best lexer to use. For example, if the file is ``index.html`` and the file contains Django + templating syntax, then "html+django" will be returned. If the file is ``index.html``, and no + templating language is used, the "html" lexer will be used. If no string of code + is supplied, the lexer will be chosen based on the file extension.. + + Args: + path (AnyStr): The path to the file containing the code you wish to know the lexer for. + code (str, optional): Optional string of code that will be used as a fallback if no lexer + is found for the supplied path. + + Returns: + str: The name of the Pygments lexer that best matches the supplied path/code. + """ + lexer: Optional[Lexer] = None + lexer_name = "default" + if code: + try: + lexer = guess_lexer_for_filename(path, code) + except ClassNotFound: + pass + + if not lexer: + try: + _, ext = os.path.splitext(path) + if ext: + extension = ext.lstrip(".").lower() + lexer = get_lexer_by_name(extension) + except ClassNotFound: + pass + + if lexer: + if lexer.aliases: + lexer_name = lexer.aliases[0] + else: + lexer_name = lexer.name + + return lexer_name + def _get_base_style(self) -> Style: """Get the base style.""" - default_style = ( - Style(bgcolor=self.background_color) - if self.background_color is not None - else self._theme.get_background_style() - ) + default_style = self._theme.get_background_style() + self.background_style return default_style def _get_token_color(self, token_type: TokenType) -> Optional[Color]: @@ -347,14 +389,38 @@ def _get_token_color(self, token_type: TokenType) -> Optional[Color]: style = self._theme.get_style_for_token(token_type) return style.color - def highlight(self, code: str) -> Text: + @property + def lexer(self) -> Optional[Lexer]: + """The lexer for this syntax, or None if no lexer was found. + + Tries to find the lexer by name if a string was passed to the constructor. + """ + + if isinstance(self._lexer, Lexer): + return self._lexer + try: + return get_lexer_by_name( + self._lexer, + stripnl=False, + ensurenl=True, + tabsize=self.tab_size, + ) + except ClassNotFound: + return None + + def highlight( + self, + code: str, + line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, + ) -> Text: """Highlight code and return a Text instance. Args: - code (str). Code to highlight. + code (str): Code to highlight. + line_range(Tuple[int, int], optional): Optional line range to highlight. Returns: - Text: A text instance containing syntax highlight. + Text: A text instance containing highlighted syntax. """ base_style = self._get_base_style() @@ -368,24 +434,63 @@ def highlight(self, code: str) -> Text: tab_size=self.tab_size, no_wrap=not self.word_wrap, ) - try: - lexer = get_lexer_by_name(self.lexer_name) - except ClassNotFound: + _get_theme_style = self._theme.get_style_for_token + + lexer = self.lexer + + if lexer is None: text.append(code) else: - _get_theme_style = self._theme.get_style_for_token - text.append_tokens( - (token, _get_theme_style(token_type)) - for token_type, token in lexer.get_tokens(code) - ) + if line_range: + # More complicated path to only stylize a portion of the code + # This speeds up further operations as there are less spans to process + line_start, line_end = line_range + + def line_tokenize() -> Iterable[Tuple[Any, str]]: + """Split tokens to one per line.""" + assert lexer + + for token_type, token in lexer.get_tokens(code): + while token: + line_token, new_line, token = token.partition("\n") + yield token_type, line_token + new_line + + def tokens_to_spans() -> Iterable[Tuple[str, Optional[Style]]]: + """Convert tokens to spans.""" + tokens = iter(line_tokenize()) + line_no = 0 + _line_start = line_start - 1 if line_start else 0 + + # Skip over tokens until line start + while line_no < _line_start: + _token_type, token = next(tokens) + yield (token, None) + if token.endswith("\n"): + line_no += 1 + # Generate spans until line end + for token_type, token in tokens: + yield (token, _get_theme_style(token_type)) + if token.endswith("\n"): + line_no += 1 + if line_end and line_no >= line_end: + break + + text.append_tokens(tokens_to_spans()) + + else: + text.append_tokens( + (token, _get_theme_style(token_type)) + for token_type, token in lexer.get_tokens(code) + ) if self.background_color is not None: text.stylize(f"on {self.background_color}") return text def _get_line_numbers_color(self, blend: float = 0.3) -> Color: - background_color = self._theme.get_background_style().bgcolor + background_style = self._theme.get_background_style() + self.background_style + background_color = background_style.bgcolor if background_color is None or background_color.is_system_defined: - return background_color or Color.default() + return Color.default() foreground_color = self._get_token_color(Token.Text) if foreground_color is None or foreground_color.is_system_defined: return foreground_color or Color.default() @@ -401,7 +506,10 @@ def _numbers_column_width(self) -> int: """Get the number of characters used to render the numbers column.""" column_width = 0 if self.line_numbers: - column_width = len(str(self.start_line + self.code.count("\n"))) + 2 + column_width = ( + len(str(self.start_line + self.code.count("\n"))) + + NUMBERS_COLUMN_DEFAULT_PADDING + ) return column_width def _get_number_styles(self, console: Console) -> Tuple[Style, Style, Style]: @@ -414,79 +522,135 @@ def _get_number_styles(self, console: Console) -> Tuple[Style, Style, Style]: background_style, self._theme.get_style_for_token(Token.Text), Style(color=self._get_line_numbers_color()), + self.background_style, ) highlight_number_style = Style.chain( background_style, self._theme.get_style_for_token(Token.Text), Style(bold=True, color=self._get_line_numbers_color(0.9)), + self.background_style, ) else: number_style = background_style + Style(dim=True) highlight_number_style = background_style + Style(dim=False) return background_style, number_style, highlight_number_style - def __rich_measure__(self, console: "Console", max_width: int) -> "Measurement": + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + _, right, _, left = Padding.unpack(self.padding) if self.code_width is not None: - width = self.code_width + self._numbers_column_width + width = self.code_width + self._numbers_column_width + right + left return Measurement(self._numbers_column_width, width) - return Measurement(self._numbers_column_width, max_width) + return Measurement(self._numbers_column_width, options.max_width) def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: + segments = Segments(self._get_syntax(console, options)) + if self.padding: + yield Padding( + segments, style=self._theme.get_background_style(), pad=self.padding + ) + else: + yield segments + + def _get_syntax( + self, + console: Console, + options: ConsoleOptions, + ) -> Iterable[Segment]: + """ + Get the Segments for the Syntax object, excluding any vertical/horizontal padding + """ transparent_background = self._get_base_style().transparent_background code_width = ( - (options.max_width - self._numbers_column_width - 1) + ( + (options.max_width - self._numbers_column_width - 1) + if self.line_numbers + else options.max_width + ) if self.code_width is None else self.code_width ) - code = textwrap.dedent(self.code) if self.dedent else self.code - code = code.expandtabs(self.tab_size) - text = self.highlight(code) - text.remove_suffix("\n") - text.expand_tabs(self.tab_size) - ( - background_style, - number_style, - highlight_number_style, - ) = self._get_number_styles(console) + ends_on_nl = self.code.endswith("\n") + code = self.code if ends_on_nl else self.code + "\n" + code = textwrap.dedent(code) if self.dedent else code + code = code.expandtabs(self.tab_size) + text = self.highlight(code, self.line_range) - if self.indent_guides and not options.ascii_only: + if not self.line_numbers and not self.word_wrap and not self.line_range: + if not ends_on_nl: + text.remove_suffix("\n") + # Simple case of just rendering text style = ( self._get_base_style() + self._theme.get_style_for_token(Comment) + Style(dim=True) + + self.background_style ) - text = text.with_indent_guides(self.tab_size, style=style) - - if not self.line_numbers: - # Simple case of just rendering text - yield from console.render(text, options=options.update(width=code_width)) + if self.indent_guides and not options.ascii_only: + text = text.with_indent_guides(self.tab_size, style=style) + text.overflow = "crop" + if style.transparent_background: + yield from console.render( + text, options=options.update(width=code_width) + ) + else: + syntax_lines = console.render_lines( + text, + options.update(width=code_width, height=None, justify="left"), + style=self.background_style, + pad=True, + new_lines=True, + ) + for syntax_line in syntax_lines: + yield from syntax_line return - lines = text.split("\n") + start_line, end_line = self.line_range or (None, None) line_offset = 0 - if self.line_range: - start_line, end_line = self.line_range + if start_line: line_offset = max(0, start_line - 1) + lines: Union[List[Text], Lines] = text.split("\n", allow_blank=ends_on_nl) + if self.line_range: lines = lines[line_offset:end_line] + if self.indent_guides and not options.ascii_only: + style = ( + self._get_base_style() + + self._theme.get_style_for_token(Comment) + + Style(dim=True) + + self.background_style + ) + lines = ( + Text("\n") + .join(lines) + .with_indent_guides(self.tab_size, style=style) + .split("\n", allow_blank=True) + ) + numbers_column_width = self._numbers_column_width render_options = options.update(width=code_width) highlight_line = self.highlight_lines.__contains__ _Segment = Segment - padding = _Segment(" " * numbers_column_width + " ", background_style) new_line = _Segment("\n") - line_pointer = "❱ " + line_pointer = "> " if options.legacy_windows else "❱ " + + ( + background_style, + number_style, + highlight_number_style, + ) = self._get_number_styles(console) for line_no, line in enumerate(lines, self.start_line + line_offset): if self.word_wrap: wrapped_lines = console.render_lines( line, - render_options, + render_options.update(height=None, justify="left"), style=background_style, pad=not transparent_background, ) @@ -503,29 +667,43 @@ def __rich_console__( pad=not transparent_background, ) ] - for first, wrapped_line in loop_first(wrapped_lines): - if first: - line_column = str(line_no).rjust(numbers_column_width - 2) + " " - if highlight_line(line_no): - yield _Segment(line_pointer, Style(color="red")) - yield _Segment(line_column, highlight_number_style) + + if self.line_numbers: + wrapped_line_left_pad = _Segment( + " " * numbers_column_width + " ", background_style + ) + for first, wrapped_line in loop_first(wrapped_lines): + if first: + line_column = str(line_no).rjust(numbers_column_width - 2) + " " + if highlight_line(line_no): + yield _Segment(line_pointer, Style(color="red")) + yield _Segment(line_column, highlight_number_style) + else: + yield _Segment(" ", highlight_number_style) + yield _Segment(line_column, number_style) else: - yield _Segment(" ", highlight_number_style) - yield _Segment(line_column, number_style) - else: - yield padding - yield from wrapped_line - yield new_line + yield wrapped_line_left_pad + yield from wrapped_line + yield new_line + else: + for wrapped_line in wrapped_lines: + yield from wrapped_line + yield new_line if __name__ == "__main__": # pragma: no cover import argparse + import sys parser = argparse.ArgumentParser( description="Render syntax to the console with Rich" ) - parser.add_argument("path", metavar="PATH", help="path to file") + parser.add_argument( + "path", + metavar="PATH", + help="path to file, or - for stdin", + ) parser.add_argument( "-c", "--force-color", @@ -581,7 +759,24 @@ def __rich_console__( "--background-color", dest="background_color", default=None, - help="Overide background color", + help="Override background color", + ) + parser.add_argument( + "-x", + "--lexer", + default=None, + dest="lexer_name", + help="Lexer name", + ) + parser.add_argument( + "-p", "--padding", type=int, default=0, dest="padding", help="Padding" + ) + parser.add_argument( + "--highlight-line", + type=int, + default=None, + dest="highlight_line", + help="The line number (not index!) to highlight", ) args = parser.parse_args() @@ -589,12 +784,29 @@ def __rich_console__( console = Console(force_terminal=args.force_color, width=args.width) - syntax = Syntax.from_path( - args.path, - line_numbers=args.line_numbers, - word_wrap=args.word_wrap, - theme=args.theme, - background_color=args.background_color, - indent_guides=args.indent_guides, - ) + if args.path == "-": + code = sys.stdin.read() + syntax = Syntax( + code=code, + lexer=args.lexer_name, + line_numbers=args.line_numbers, + word_wrap=args.word_wrap, + theme=args.theme, + background_color=args.background_color, + indent_guides=args.indent_guides, + padding=args.padding, + highlight_lines={args.highlight_line}, + ) + else: + syntax = Syntax.from_path( + args.path, + lexer=args.lexer_name, + line_numbers=args.line_numbers, + word_wrap=args.word_wrap, + theme=args.theme, + background_color=args.background_color, + indent_guides=args.indent_guides, + padding=args.padding, + highlight_lines={args.highlight_line}, + ) console.print(syntax, soft_wrap=args.soft_wrap) diff --git a/rich/table.py b/rich/table.py index 7b622f6087..15a0c0e07f 100644 --- a/rich/table.py +++ b/rich/table.py @@ -1,17 +1,27 @@ -from dataclasses import dataclass, field -from typing import TYPE_CHECKING, Iterable, List, NamedTuple, Optional, Tuple, Union +from dataclasses import dataclass, field, replace +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Sequence, + Tuple, + Union, +) from . import box, errors from ._loop import loop_first_last, loop_last from ._pick import pick_bool from ._ratio import ratio_distribute, ratio_reduce +from .align import VerticalAlignMethod from .jupyter import JupyterMixin from .measure import Measurement from .padding import Padding, PaddingDimensions from .protocol import is_renderable from .segment import Segment from .style import Style, StyleType -from .styled import Styled from .text import Text, TextType if TYPE_CHECKING: @@ -27,7 +37,35 @@ @dataclass class Column: - """Defines a column in a table.""" + """Defines a column within a ~Table. + + Args: + title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None. + caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. + width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. + min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. + box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. + safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. + padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). + collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. + pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. + expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. + show_header (bool, optional): Show a header row. Defaults to True. + show_footer (bool, optional): Show a footer row. Defaults to False. + show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. + show_lines (bool, optional): Draw lines between every row. Defaults to False. + leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. + style (Union[str, Style], optional): Default style for the table. Defaults to "none". + row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. + header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". + footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". + border_style (Union[str, Style], optional): Style of the border. Defaults to None. + title_style (Union[str, Style], optional): Style of the title. Defaults to None. + caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. + title_justify (str, optional): Justify method for title. Defaults to "center". + caption_justify (str, optional): Justify method for caption. Defaults to "center". + highlight (bool, optional): Highlight cell contents (if str). Defaults to False. + """ header: "RenderableType" = "" """RenderableType: Renderable for the header (typically a string)""" @@ -35,18 +73,21 @@ class Column: footer: "RenderableType" = "" """RenderableType: Renderable for the footer (typically a string)""" - header_style: StyleType = "table.header" + header_style: StyleType = "" """StyleType: The style of the header.""" - footer_style: StyleType = "table.footer" + footer_style: StyleType = "" """StyleType: The style of the footer.""" - style: StyleType = "none" + style: StyleType = "" """StyleType: The style of the column.""" justify: "JustifyMethod" = "left" """str: How to justify text within the column ("left", "center", "right", or "full")""" + vertical: "VerticalAlignMethod" = "top" + """str: How to vertically align content ("top", "middle", or "bottom")""" + overflow: "OverflowMethod" = "ellipsis" """str: Overflow method.""" @@ -70,6 +111,10 @@ class Column: _cells: List["RenderableType"] = field(default_factory=list) + def copy(self) -> "Column": + """Return a copy of this Column.""" + return replace(self, _cells=[]) + @property def cells(self) -> Iterable["RenderableType"]: """Get all cells in the column, not including header.""" @@ -81,6 +126,17 @@ def flexible(self) -> bool: return self.ratio is not None +@dataclass +class Row: + """Information regarding a row.""" + + style: Optional[StyleType] = None + """Style to apply to row.""" + + end_section: bool = False + """Indicated end of section, which will force a line beneath the row.""" + + class _Cell(NamedTuple): """A single cell in a table.""" @@ -88,6 +144,8 @@ class _Cell(NamedTuple): """Style to apply to cell.""" renderable: "RenderableType" """Cell renderable.""" + vertical: VerticalAlignMethod + """Cell vertical alignment.""" class Table(JupyterMixin): @@ -99,7 +157,7 @@ class Table(JupyterMixin): caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. - box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`). Defaults to box.HEAVY_HEAD. + box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. @@ -111,25 +169,27 @@ class Table(JupyterMixin): show_lines (bool, optional): Draw lines between every row. Defaults to False. leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. style (Union[str, Style], optional): Default style for the table. Defaults to "none". - row_styles (List[Union, str], optional): Optional list of row styles, if more that one style is give then the styles will alternate. Defaults to None. - header_style (Union[str, Style], optional): Style of the header. Defaults to None. - footer_style (Union[str, Style], optional): Style of the footer. Defaults to None. + row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. + header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". + footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". border_style (Union[str, Style], optional): Style of the border. Defaults to None. title_style (Union[str, Style], optional): Style of the title. Defaults to None. caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. title_justify (str, optional): Justify method for title. Defaults to "center". caption_justify (str, optional): Justify method for caption. Defaults to "center". + highlight (bool, optional): Highlight cell contents (if str). Defaults to False. """ columns: List[Column] + rows: List[Row] def __init__( self, *headers: Union[Column, str], - title: TextType = None, - caption: TextType = None, - width: int = None, - min_width: int = None, + title: Optional[TextType] = None, + caption: Optional[TextType] = None, + width: Optional[int] = None, + min_width: Optional[int] = None, box: Optional[box.Box] = box.HEAVY_HEAD, safe_box: Optional[bool] = None, padding: PaddingDimensions = (0, 1), @@ -142,25 +202,19 @@ def __init__( show_lines: bool = False, leading: int = 0, style: StyleType = "none", - row_styles: Iterable[StyleType] = None, - header_style: StyleType = None, - footer_style: StyleType = None, - border_style: StyleType = None, - title_style: StyleType = None, - caption_style: StyleType = None, + row_styles: Optional[Iterable[StyleType]] = None, + header_style: Optional[StyleType] = "table.header", + footer_style: Optional[StyleType] = "table.footer", + border_style: Optional[StyleType] = None, + title_style: Optional[StyleType] = None, + caption_style: Optional[StyleType] = None, title_justify: "JustifyMethod" = "center", caption_justify: "JustifyMethod" = "center", + highlight: bool = False, ) -> None: self.columns: List[Column] = [] - append_column = self.columns.append - for index, header in enumerate(headers): - if isinstance(header, str): - append_column(Column(_index=index, header=header)) - else: - header._index = index - append_column(header) - + self.rows: List[Row] = [] self.title = title self.caption = caption self.width = width @@ -177,19 +231,27 @@ def __init__( self.leading = leading self.collapse_padding = collapse_padding self.style = style - self.header_style = header_style - self.footer_style = footer_style + self.header_style = header_style or "" + self.footer_style = footer_style or "" self.border_style = border_style self.title_style = title_style self.caption_style = caption_style - self.title_justify = title_justify - self.caption_justify = caption_justify - self._row_count = 0 - self.row_styles = list(row_styles or []) + self.title_justify: "JustifyMethod" = title_justify + self.caption_justify: "JustifyMethod" = caption_justify + self.highlight = highlight + self.row_styles: Sequence[StyleType] = list(row_styles or []) + append_column = self.columns.append + for header in headers: + if isinstance(header, str): + self.add_column(header=header) + else: + header._index = len(self.columns) + append_column(header) @classmethod def grid( cls, + *headers: Union[Column, str], padding: PaddingDimensions = 0, collapse_padding: bool = True, pad_edge: bool = False, @@ -198,6 +260,7 @@ def grid( """Get a table with no lines, headers, or footer. Args: + *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance. padding (PaddingDimensions, optional): Get padding around cells. Defaults to 0. collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to True. pad_edge (bool, optional): Enable padding around edges of table. Defaults to False. @@ -207,6 +270,7 @@ def grid( Table: A table instance. """ return cls( + *headers, box=None, padding=padding, collapse_padding=collapse_padding, @@ -218,7 +282,7 @@ def grid( ) @property - def expand(self) -> int: + def expand(self) -> bool: """Setting a non-None self.width implies expand.""" return self._expand or self.width is not None @@ -240,28 +304,38 @@ def _extra_width(self) -> int: @property def row_count(self) -> int: """Get the current number of rows.""" - return self._row_count + return len(self.rows) - def get_row_style(self, index: int) -> StyleType: + def get_row_style(self, console: "Console", index: int) -> StyleType: """Get the current row style.""" + style = Style.null() if self.row_styles: - return self.row_styles[index % len(self.row_styles)] - return Style.null() + style += console.get_style(self.row_styles[index % len(self.row_styles)]) + row_style = self.rows[index].style + if row_style is not None: + style += console.get_style(row_style) + return style - def __rich_measure__(self, console: "Console", max_width: int) -> Measurement: + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + max_width = options.max_width if self.width is not None: max_width = self.width if max_width < 0: return Measurement(0, 0) extra_width = self._extra_width - - max_width = sum(self._calculate_column_widths(console, max_width - extra_width)) - + max_width = sum( + self._calculate_column_widths( + console, options.update_width(max_width - extra_width) + ) + ) _measure_column = self._measure_column measurements = [ - _measure_column(console, column, max_width) for column in self.columns + _measure_column(console, options.update_width(max_width), column) + for column in self.columns ] minimum_width = ( sum(measurement.minimum for measurement in measurements) + extra_width @@ -291,15 +365,16 @@ def add_column( header: "RenderableType" = "", footer: "RenderableType" = "", *, - header_style: StyleType = None, - footer_style: StyleType = None, - style: StyleType = None, + header_style: Optional[StyleType] = None, + footer_style: Optional[StyleType] = None, + style: Optional[StyleType] = None, justify: "JustifyMethod" = "left", + vertical: "VerticalAlignMethod" = "top", overflow: "OverflowMethod" = "ellipsis", - width: int = None, - min_width: int = None, - max_width: int = None, - ratio: int = None, + width: Optional[int] = None, + min_width: Optional[int] = None, + max_width: Optional[int] = None, + ratio: Optional[int] = None, no_wrap: bool = False, ) -> None: """Add a column to the table. @@ -309,10 +384,12 @@ def add_column( Defaults to "". footer (RenderableType, optional): Text or renderable for the footer. Defaults to "". - header_style (Union[str, Style], optional): Style for the header. Defaults to "none". - footer_style (Union[str, Style], optional): Style for the header. Defaults to "none". - style (Union[str, Style], optional): Style for the column cells. Defaults to "none". + header_style (Union[str, Style], optional): Style for the header, or None for default. Defaults to None. + footer_style (Union[str, Style], optional): Style for the footer, or None for default. Defaults to None. + style (Union[str, Style], optional): Style for the column cells, or None for default. Defaults to None. justify (JustifyMethod, optional): Alignment for cells. Defaults to "left". + vertical (VerticalAlignMethod, optional): Vertical alignment, one of "top", "middle", or "bottom". Defaults to "top". + overflow (OverflowMethod): Overflow method: "crop", "fold", "ellipsis". Defaults to "ellipsis". width (int, optional): Desired width of column in characters, or None to fit to contents. Defaults to None. min_width (Optional[int], optional): Minimum width of column, or ``None`` for no minimum. Defaults to None. max_width (Optional[int], optional): Maximum width of column, or ``None`` for no maximum. Defaults to None. @@ -324,14 +401,11 @@ def add_column( _index=len(self.columns), header=header, footer=footer, - header_style=Style.pick_first( - header_style, self.header_style, "table.header" - ), - footer_style=Style.pick_first( - footer_style, self.footer_style, "table.footer" - ), - style=Style.pick_first(style, self.style, "table.cell"), + header_style=header_style or "", + footer_style=footer_style or "", + style=style or "", justify=justify, + vertical=vertical, overflow=overflow, width=width, min_width=min_width, @@ -342,7 +416,10 @@ def add_column( self.columns.append(column) def add_row( - self, *renderables: Optional["RenderableType"], style: StyleType = None + self, + *renderables: Optional["RenderableType"], + style: Optional[StyleType] = None, + end_section: bool = False, ) -> None: """Add a row of renderables. @@ -350,15 +427,14 @@ def add_row( *renderables (None or renderable): Each cell in a row must be a renderable object (including str), or ``None`` for a blank cell. style (StyleType, optional): An optional style to apply to the entire row. Defaults to None. + end_section (bool, optional): End a section and draw a line. Defaults to False. Raises: errors.NotRenderableError: If you add something that can't be rendered. """ def add_cell(column: Column, renderable: "RenderableType") -> None: - column._cells.append( - renderable if style is None else Styled(renderable, style) - ) + column._cells.append(renderable) cell_renderables: List[Optional["RenderableType"]] = list(renderables) @@ -371,7 +447,7 @@ def add_cell(column: Column, renderable: "RenderableType") -> None: for index, renderable in enumerate(cell_renderables): if index == len(columns): column = Column(_index=index) - for _ in range(self._row_count): + for _ in self.rows: add_cell(column, Text("")) self.columns.append(column) else: @@ -384,27 +460,37 @@ def add_cell(column: Column, renderable: "RenderableType") -> None: raise errors.NotRenderableError( f"unable to render {type(renderable).__name__}; a string or other renderable object is required" ) - self._row_count += 1 + self.rows.append(Row(style=style, end_section=end_section)) def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": + if not self.columns: + yield Segment("\n") + return + max_width = options.max_width if self.width is not None: max_width = self.width extra_width = self._extra_width - widths = self._calculate_column_widths(console, max_width - extra_width) + widths = self._calculate_column_widths( + console, options.update_width(max_width - extra_width) + ) table_width = sum(widths) + extra_width - render_options = options.update(width=table_width) + render_options = options.update( + width=table_width, highlight=self.highlight, height=None + ) def render_annotation( text: TextType, style: StyleType, justify: "JustifyMethod" = "center" ) -> "RenderResult": render_text = ( - console.render_str(text, style=style) if isinstance(text, str) else text + console.render_str(text, style=style, highlight=False) + if isinstance(text, str) + else text ) return console.render( render_text, options=render_options.update(justify=justify) @@ -424,16 +510,18 @@ def render_annotation( justify=self.caption_justify, ) - def _calculate_column_widths(self, console: "Console", max_width: int) -> List[int]: + def _calculate_column_widths( + self, console: "Console", options: "ConsoleOptions" + ) -> List[int]: """Calculate the widths of each column, including padding, not including borders.""" + max_width = options.max_width columns = self.columns width_ranges = [ - self._measure_column(console, column, max_width) for column in columns + self._measure_column(console, options, column) for column in columns ] widths = [_range.maximum or 1 for _range in width_ranges] get_padding_width = self._get_padding_width extra_width = self._extra_width - if self.expand: ratios = [col.ratio or 0 for col in columns if col.flexible] if any(ratios): @@ -461,7 +549,6 @@ def _calculate_column_widths(self, console: "Console", max_width: int) -> List[i max_width, ) table_width = sum(widths) - # last resort, reduce columns evenly if table_width > max_width: excess_width = table_width - max_width @@ -469,10 +556,10 @@ def _calculate_column_widths(self, console: "Console", max_width: int) -> List[i table_width = sum(widths) width_ranges = [ - self._measure_column(console, column, width) + self._measure_column(console, options.update_width(width), column) for width, column in zip(widths, columns) ] - widths = [_range.maximum or 1 for _range in width_ranges] + widths = [_range.maximum or 0 for _range in width_ranges] if (table_width < max_width and self.expand) or ( self.min_width is not None and table_width < (self.min_width - extra_width) @@ -526,7 +613,9 @@ def _collapse_widths( excess_width = total_width - max_width return widths - def _get_cells(self, column_index: int, column: Column) -> Iterable[_Cell]: + def _get_cells( + self, console: "Console", column_index: int, column: Column + ) -> Iterable[_Cell]: """Get all the cells with padding and optional header.""" collapse_padding = self.collapse_padding @@ -537,11 +626,12 @@ def _get_cells(self, column_index: int, column: Column) -> Iterable[_Cell]: first_column = column_index == 0 last_column = column_index == len(self.columns) - 1 - def add_padding( - renderable: "RenderableType", first_row: bool, last_row: bool - ) -> "RenderableType": - if not any_padding: - return renderable + _padding_cache: Dict[Tuple[bool, bool], Tuple[int, int, int, int]] = {} + + def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]: + cached = _padding_cache.get((first_row, last_row)) + if cached: + return cached top, right, bottom, left = padding if collapse_padding: @@ -559,19 +649,42 @@ def add_padding( top = 0 if last_row: bottom = 0 - _padding = Padding(renderable, (top, right, bottom, left)) + _padding = (top, right, bottom, left) + _padding_cache[(first_row, last_row)] = _padding return _padding raw_cells: List[Tuple[StyleType, "RenderableType"]] = [] _append = raw_cells.append + get_style = console.get_style if self.show_header: - _append((column.header_style, column.header)) + header_style = get_style(self.header_style or "") + get_style( + column.header_style + ) + _append((header_style, column.header)) + cell_style = get_style(column.style or "") for cell in column.cells: - _append((column.style, cell)) + _append((cell_style, cell)) if self.show_footer: - _append((column.footer_style, column.footer)) - for first, last, (style, renderable) in loop_first_last(raw_cells): - yield _Cell(style, add_padding(renderable, first, last)) + footer_style = get_style(self.footer_style or "") + get_style( + column.footer_style + ) + _append((footer_style, column.footer)) + + if any_padding: + _Padding = Padding + for first, last, (style, renderable) in loop_first_last(raw_cells): + yield _Cell( + style, + _Padding(renderable, get_padding(first, last)), + getattr(renderable, "vertical", None) or column.vertical, + ) + else: + for (style, renderable) in raw_cells: + yield _Cell( + style, + renderable, + getattr(renderable, "vertical", None) or column.vertical, + ) def _get_padding_width(self, column_index: int) -> int: """Get extra width from padding.""" @@ -582,10 +695,14 @@ def _get_padding_width(self, column_index: int) -> int: return pad_left + pad_right def _measure_column( - self, console: "Console", column: Column, max_width: int + self, + console: "Console", + options: "ConsoleOptions", + column: Column, ) -> Measurement: """Get the minimum and maximum width of the column.""" + max_width = options.max_width if max_width < 1: return Measurement(0, 0) @@ -602,8 +719,8 @@ def _measure_column( append_min = min_widths.append append_max = max_widths.append get_render_width = Measurement.get - for cell in self._get_cells(column._index, column): - _min, _max = get_render_width(console, cell.renderable, max_width) + for cell in self._get_cells(console, column._index, column): + _min, _max = get_render_width(console, options, cell.renderable) append_min(_min) append_max(_max) @@ -623,14 +740,11 @@ def _render( table_style = console.get_style(self.style or "") border_style = table_style + console.get_style(self.border_style or "") - rows: List[Tuple[_Cell, ...]] = list( - zip( - *( - self._get_cells(column_index, column) - for column_index, column in enumerate(self.columns) - ) - ) + _column_cells = ( + self._get_cells(console, column_index, column) + for column_index, column in enumerate(self.columns) ) + row_cells: List[Tuple[_Cell, ...]] = list(zip(*_column_cells)) _box = ( self.box.substitute( options, safe=pick_bool(self.safe_box, console.safe_box) @@ -677,34 +791,69 @@ def _render( get_row_style = self.get_row_style get_style = console.get_style - for index, (first, last, row) in enumerate(loop_first_last(rows)): + for index, (first, last, row_cell) in enumerate(loop_first_last(row_cells)): header_row = first and show_header footer_row = last and show_footer + row = ( + self.rows[index - show_header] + if (not header_row and not footer_row) + else None + ) max_height = 1 cells: List[List[List[Segment]]] = [] if header_row or footer_row: row_style = Style.null() else: row_style = get_style( - get_row_style(index - 1 if show_header else index) + get_row_style(console, index - 1 if show_header else index) ) - for width, cell, column in zip(widths, row, columns): + for width, cell, column in zip(widths, row_cell, columns): render_options = options.update( width=width, justify=column.justify, no_wrap=column.no_wrap, overflow=column.overflow, + height=None, ) - cell_style = table_style + row_style + get_style(cell.style) lines = console.render_lines( - cell.renderable, render_options, style=cell_style + cell.renderable, + render_options, + style=get_style(cell.style) + row_style, ) max_height = max(max_height, len(lines)) cells.append(lines) + row_height = max(len(cell) for cell in cells) + + def align_cell( + cell: List[List[Segment]], + vertical: "VerticalAlignMethod", + width: int, + style: Style, + ) -> List[List[Segment]]: + if header_row: + vertical = "bottom" + elif footer_row: + vertical = "top" + + if vertical == "top": + return _Segment.align_top(cell, width, row_height, style) + elif vertical == "middle": + return _Segment.align_middle(cell, width, row_height, style) + return _Segment.align_bottom(cell, width, row_height, style) + cells[:] = [ - _Segment.set_shape(_cell, width, max_height, style=table_style) - for width, _cell in zip(widths, cells) + _Segment.set_shape( + align_cell( + cell, + _cell.vertical, + width, + get_style(_cell.style) + row_style, + ), + width, + max_height, + ) + for width, _cell, cell, column in zip(widths, row_cell, cells, columns) ] if _box: @@ -743,18 +892,18 @@ def _render( _box.get_row(widths, "head", edge=show_edge), border_style ) yield new_line - if _box and (show_lines or leading): + end_section = row and row.end_section + if _box and (show_lines or leading or end_section): if ( not last - and not (show_footer and index >= len(rows) - 2) + and not (show_footer and index >= len(row_cells) - 2) and not (show_header and header_row) ): if leading: - for _ in range(leading): - yield _Segment( - _box.get_row(widths, "mid", edge=show_edge), - border_style, - ) + yield _Segment( + _box.get_row(widths, "mid", edge=show_edge) * leading, + border_style, + ) else: yield _Segment( _box.get_row(widths, "row", edge=show_edge), border_style @@ -769,60 +918,79 @@ def _render( if __name__ == "__main__": # pragma: no cover from rich.console import Console from rich.highlighter import ReprHighlighter - from rich.table import Table + from rich.table import Table as Table - table = Table( - title="Star Wars Movies", - caption="Rich example table", - caption_justify="right", - ) + from ._timer import timer + + with timer("Table render"): + table = Table( + title="Star Wars Movies", + caption="Rich example table", + caption_justify="right", + ) + + table.add_column( + "Released", header_style="bright_cyan", style="cyan", no_wrap=True + ) + table.add_column("Title", style="magenta") + table.add_column("Box Office", justify="right", style="green") + + table.add_row( + "Dec 20, 2019", + "Star Wars: The Rise of Skywalker", + "$952,110,690", + ) + table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") + table.add_row( + "Dec 15, 2017", + "Star Wars Ep. V111: The Last Jedi", + "$1,332,539,889", + style="on black", + end_section=True, + ) + table.add_row( + "Dec 16, 2016", + "Rogue One: A Star Wars Story", + "$1,332,439,889", + ) - table.add_column("Released", header_style="bright_cyan", style="cyan", no_wrap=True) - table.add_column("Title", style="magenta") - table.add_column("Box Office", justify="right", style="green") - - table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690") - table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") - table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889") - table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889") - - def header(text: str) -> None: - console.print() - console.rule(highlight(text)) - console.print() - - console = Console() - highlight = ReprHighlighter() - header("Example Table") - console.print(table, justify="center") - - table.expand = True - header("expand=True") - console.print(table, justify="center") - - table.width = 50 - header("width=50") - - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - header("row_styles=['dim', 'none']") - - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - table.leading = 1 - header("leading=1, row_styles=['dim', 'none']") - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - table.show_lines = True - table.leading = 0 - header("show_lines=True, row_styles=['dim', 'none']") - console.print(table, justify="center") + def header(text: str) -> None: + console.print() + console.rule(highlight(text)) + console.print() + + console = Console() + highlight = ReprHighlighter() + header("Example Table") + console.print(table, justify="center") + + table.expand = True + header("expand=True") + console.print(table) + + table.width = 50 + header("width=50") + + console.print(table, justify="center") + + table.width = None + table.expand = False + table.row_styles = ["dim", "none"] + header("row_styles=['dim', 'none']") + + console.print(table, justify="center") + + table.width = None + table.expand = False + table.row_styles = ["dim", "none"] + table.leading = 1 + header("leading=1, row_styles=['dim', 'none']") + console.print(table, justify="center") + + table.width = None + table.expand = False + table.row_styles = ["dim", "none"] + table.show_lines = True + table.leading = 0 + header("show_lines=True, row_styles=['dim', 'none']") + console.print(table, justify="center") diff --git a/rich/tabulate.py b/rich/tabulate.py deleted file mode 100644 index 2966948fb0..0000000000 --- a/rich/tabulate.py +++ /dev/null @@ -1,75 +0,0 @@ -from collections.abc import Mapping -from typing import Optional - -from rich.console import JustifyMethod - -from . import box -from .highlighter import ReprHighlighter -from .pretty import Pretty -from .table import Table - - -def tabulate_mapping( - mapping: Mapping, - title: str = None, - caption: str = None, - title_justify: Optional[JustifyMethod] = None, - caption_justify: Optional[JustifyMethod] = None, -) -> Table: - """Generate a simple table from a mapping. - - Args: - mapping (Mapping): A mapping object (e.g. a dict); - title (str, optional): Optional title to be displayed over the table. - caption (str, optional): Optional caption to be displayed below the table. - title_justify (str, optional): Justify method for title. Defaults to None. - caption_justify (str, optional): Justify method for caption. Defaults to None. - - Returns: - Table: A table instance which may be rendered by the Console. - """ - table = Table( - show_header=False, - title=title, - caption=caption, - box=box.ROUNDED, - border_style="blue", - ) - table.title = title - table.caption = caption - if title_justify is not None: - table.title_justify = title_justify - if caption_justify is not None: - table.caption_justify = caption_justify - highlighter = ReprHighlighter() - for key, value in mapping.items(): - table.add_row( - Pretty(key, highlighter=highlighter), Pretty(value, highlighter=highlighter) - ) - return table - - -if __name__ == "__main__": # pragma: no cover - from rich import print - - def test(foo, bar, tjustify=None, cjustify=None): - list_of_things = [1, 2, 3, None, 4, True, False, "Hello World"] - dict_of_things = { - "version": "1.1", - "method": "confirmFruitPurchase", - "params": [["apple", "orange", "mangoes", "pomelo"], 1.123], - "id": "194521489", - } - print( - tabulate_mapping( - locals(), - title="locals()", - title_justify=tjustify, - caption="__main__.test", - caption_justify=cjustify, - ) - ) - - print() - test(20.3423, 3.1427, cjustify="right") - print() diff --git a/rich/terminal_theme.py b/rich/terminal_theme.py index 5a6dec1751..565e9d960f 100644 --- a/rich/terminal_theme.py +++ b/rich/terminal_theme.py @@ -1,4 +1,4 @@ -from typing import List, Tuple +from typing import List, Optional, Tuple from .color_triplet import ColorTriplet from .palette import Palette @@ -7,14 +7,22 @@ class TerminalTheme: - """A color theme used when exporting console content.""" + """A color theme used when exporting console content. + + Args: + background (Tuple[int, int, int]): The background color. + foreground (Tuple[int, int, int]): The foreground (text) color. + normal (List[Tuple[int, int, int]]): A list of 8 normal intensity colors. + bright (List[Tuple[int, int, int]], optional): A list of 8 bright colors, or None + to repeat normal intensity. Defaults to None. + """ def __init__( self, background: _ColorTuple, foreground: _ColorTuple, normal: List[_ColorTuple], - bright: List[_ColorTuple] = None, + bright: Optional[List[_ColorTuple]] = None, ) -> None: self.background_color = ColorTriplet(*background) self.foreground_color = ColorTriplet(*foreground) @@ -45,3 +53,101 @@ def __init__( (255, 255, 255), ], ) + +MONOKAI = TerminalTheme( + (12, 12, 12), + (217, 217, 217), + [ + (26, 26, 26), + (244, 0, 95), + (152, 224, 36), + (253, 151, 31), + (157, 101, 255), + (244, 0, 95), + (88, 209, 235), + (196, 197, 181), + (98, 94, 76), + ], + [ + (244, 0, 95), + (152, 224, 36), + (224, 213, 97), + (157, 101, 255), + (244, 0, 95), + (88, 209, 235), + (246, 246, 239), + ], +) +DIMMED_MONOKAI = TerminalTheme( + (25, 25, 25), + (185, 188, 186), + [ + (58, 61, 67), + (190, 63, 72), + (135, 154, 59), + (197, 166, 53), + (79, 118, 161), + (133, 92, 141), + (87, 143, 164), + (185, 188, 186), + (136, 137, 135), + ], + [ + (251, 0, 31), + (15, 114, 47), + (196, 112, 51), + (24, 109, 227), + (251, 0, 103), + (46, 112, 109), + (253, 255, 185), + ], +) +NIGHT_OWLISH = TerminalTheme( + (255, 255, 255), + (64, 63, 83), + [ + (1, 22, 39), + (211, 66, 62), + (42, 162, 152), + (218, 170, 1), + (72, 118, 214), + (64, 63, 83), + (8, 145, 106), + (122, 129, 129), + (122, 129, 129), + ], + [ + (247, 110, 110), + (73, 208, 197), + (218, 194, 107), + (92, 167, 228), + (105, 112, 152), + (0, 201, 144), + (152, 159, 177), + ], +) + +SVG_EXPORT_THEME = TerminalTheme( + (41, 41, 41), + (197, 200, 198), + [ + (75, 78, 85), + (204, 85, 90), + (152, 168, 75), + (208, 179, 68), + (96, 138, 177), + (152, 114, 159), + (104, 160, 179), + (197, 200, 198), + (154, 155, 153), + ], + [ + (255, 38, 39), + (0, 130, 61), + (208, 132, 66), + (25, 132, 233), + (255, 44, 122), + (57, 130, 128), + (253, 253, 197), + ], +) diff --git a/rich/text.py b/rich/text.py index 353ccb0c5a..f6b349d6a2 100644 --- a/rich/text.py +++ b/rich/text.py @@ -1,7 +1,8 @@ +import re from functools import partial, reduce from math import gcd -import re from operator import itemgetter +from rich.emoji import EmojiVariant from typing import ( TYPE_CHECKING, Any, @@ -13,28 +14,23 @@ Optional, Tuple, Union, - cast, ) from ._loop import loop_last from ._pick import pick_bool from ._wrap import divide_line -from .align import AlignValues +from .align import AlignMethod from .cells import cell_len, set_cell_size from .containers import Lines from .control import strip_control_codes +from .emoji import EmojiVariant from .jupyter import JupyterMixin from .measure import Measurement from .segment import Segment from .style import Style, StyleType if TYPE_CHECKING: # pragma: no cover - from .console import ( - Console, - ConsoleOptions, - JustifyMethod, - OverflowMethod, - ) + from .console import Console, ConsoleOptions, JustifyMethod, OverflowMethod DEFAULT_JUSTIFY: "JustifyMethod" = "default" DEFAULT_OVERFLOW: "OverflowMethod" = "fold" @@ -58,7 +54,11 @@ class Span(NamedTuple): """Style associated with the span.""" def __repr__(self) -> str: - return f"Span({self.start}, {self.end}, {str(self.style)!r})" + return ( + f"Span({self.start}, {self.end}, {self.style!r})" + if (isinstance(self.style, Style) and self.style._meta) + else f"Span({self.start}, {self.end}, {repr(self.style)})" + ) def __bool__(self) -> bool: return self.end > self.start @@ -112,7 +112,7 @@ class Text(JupyterMixin): justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\n". + end (str, optional): Character to end text with. Defaults to "\\\\n". tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. spans (List[Span], optional). A list of predefined style spans. Defaults to None. """ @@ -134,17 +134,17 @@ def __init__( text: str = "", style: Union[str, Style] = "", *, - justify: "JustifyMethod" = None, - overflow: "OverflowMethod" = None, - no_wrap: bool = None, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + no_wrap: Optional[bool] = None, end: str = "\n", tab_size: Optional[int] = 8, - spans: List[Span] = None, + spans: Optional[List[Span]] = None, ) -> None: self._text = [strip_control_codes(text)] self.style = style - self.justify = justify - self.overflow = overflow + self.justify: Optional["JustifyMethod"] = justify + self.overflow: Optional["OverflowMethod"] = overflow self.no_wrap = no_wrap self.end = end self.tab_size = tab_size @@ -182,11 +182,67 @@ def __contains__(self, other: object) -> bool: return other.plain in self.plain return False + def __getitem__(self, slice: Union[int, slice]) -> "Text": + def get_text_at(offset: int) -> "Text": + _Span = Span + text = Text( + self.plain[offset], + spans=[ + _Span(0, 1, style) + for start, end, style in self._spans + if end > offset >= start + ], + end="", + ) + return text + + if isinstance(slice, int): + return get_text_at(slice) + else: + start, stop, step = slice.indices(len(self.plain)) + if step == 1: + lines = self.divide([start, stop]) + return lines[1] + else: + # This would be a bit of work to implement efficiently + # For now, its not required + raise TypeError("slices with step!=1 are not supported") + @property def cell_len(self) -> int: """Get the number of cells required to render this text.""" return cell_len(self.plain) + @property + def markup(self) -> str: + """Get console markup to render this Text. + + Returns: + str: A string potentially creating markup tags. + """ + from .markup import escape + + output: List[str] = [] + + plain = self.plain + markup_spans = [ + (0, False, self.style), + *((span.start, False, span.style) for span in self._spans), + *((span.end, True, span.style) for span in self._spans), + (len(plain), True, self.style), + ] + markup_spans.sort(key=itemgetter(0, 1)) + position = 0 + append = output.append + for offset, closing, style in markup_spans: + if offset > position: + append(escape(plain[position:offset])) + position = offset + if style: + append(f"[/{style}]" if closing else f"[{style}]") + markup = "".join(output) + return markup + @classmethod def from_markup( cls, @@ -194,8 +250,10 @@ def from_markup( *, style: Union[str, Style] = "", emoji: bool = True, - justify: "JustifyMethod" = None, - overflow: "OverflowMethod" = None, + emoji_variant: Optional[EmojiVariant] = None, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + end: str = "\n", ) -> "Text": """Create Text instance from markup. @@ -204,25 +262,65 @@ def from_markup( emoji (bool, optional): Also render emoji code. Defaults to True. justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + end (str, optional): Character to end text with. Defaults to "\\\\n". Returns: Text: A Text instance with markup rendered. """ from .markup import render - rendered_text = render(text, style, emoji=emoji) + rendered_text = render(text, style, emoji=emoji, emoji_variant=emoji_variant) rendered_text.justify = justify rendered_text.overflow = overflow + rendered_text.end = end return rendered_text + @classmethod + def from_ansi( + cls, + text: str, + *, + style: Union[str, Style] = "", + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + no_wrap: Optional[bool] = None, + end: str = "\n", + tab_size: Optional[int] = 8, + ) -> "Text": + """Create a Text object from a string containing ANSI escape codes. + + Args: + text (str): A string containing escape codes. + style (Union[str, Style], optional): Base style for text. Defaults to "". + justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. + overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. + end (str, optional): Character to end text with. Defaults to "\\\\n". + tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. + """ + from .ansi import AnsiDecoder + + joiner = Text( + "\n", + justify=justify, + overflow=overflow, + no_wrap=no_wrap, + end=end, + tab_size=tab_size, + style=style, + ) + decoder = AnsiDecoder() + result = joiner.join(line for line in decoder.decode(text)) + return result + @classmethod def styled( cls, text: str, style: StyleType = "", *, - justify: "JustifyMethod" = None, - overflow: "OverflowMethod" = None, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, ) -> "Text": """Construct a Text instance with a pre-applied styled. A style applied in this way won't be used to pad the text when it is justified. @@ -245,11 +343,12 @@ def assemble( cls, *parts: Union[str, "Text", Tuple[str, StyleType]], style: Union[str, Style] = "", - justify: "JustifyMethod" = None, - overflow: "OverflowMethod" = None, - no_wrap: bool = None, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + no_wrap: Optional[bool] = None, end: str = "\n", tab_size: int = 8, + meta: Optional[Dict[str, Any]] = None, ) -> "Text": """Construct a text instance by combining a sequence of strings with optional styles. The positional arguments should be either strings, or a tuple of string + style. @@ -258,8 +357,9 @@ def assemble( style (Union[str, Style], optional): Base style for text. Defaults to "". justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\n". + end (str, optional): Character to end text with. Defaults to "\\\\n". tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. + meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None Returns: Text: A new text instance. @@ -279,6 +379,8 @@ def assemble( append(part) else: append(*part) + if meta: + text.apply_meta(meta) return text @property @@ -308,9 +410,10 @@ def spans(self, spans: List[Span]) -> None: """Set spans.""" self._spans = spans[:] - def blank_copy(self) -> "Text": + def blank_copy(self, plain: str = "") -> "Text": """Return a new Text instance with copied meta data (but not the string or spans).""" copy_self = Text( + plain, style=self.style, justify=self.justify, overflow=self.overflow, @@ -335,7 +438,10 @@ def copy(self) -> "Text": return copy_self def stylize( - self, style: Union[str, Style], start: int = 0, end: Optional[int] = None + self, + style: Union[str, Style], + start: int = 0, + end: Optional[int] = None, ) -> None: """Apply a style to the text, or a portion of the text. @@ -345,17 +451,52 @@ def stylize( end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. """ - length = len(self) - if start < 0: - start = length + start - if end is None: - end = length - if end < 0: - end = length + end - if start >= length or end <= start: - # Span not in text or not valid - return - self._spans.append(Span(start, min(length, end), style)) + if style: + length = len(self) + if start < 0: + start = length + start + if end is None: + end = length + if end < 0: + end = length + end + if start >= length or end <= start: + # Span not in text or not valid + return + self._spans.append(Span(start, min(length, end), style)) + + def apply_meta( + self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None + ) -> None: + """Apply meta data to the text, or a portion of the text. + + Args: + meta (Dict[str, Any]): A dict of meta information. + start (int): Start offset (negative indexing is supported). Defaults to 0. + end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. + + """ + style = Style.from_meta(meta) + self.stylize(style, start=start, end=end) + + def on(self, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Text": + """Apply event handlers (used by Textual project). + + Example: + >>> from rich.text import Text + >>> text = Text("hello world") + >>> text.on(click="view.toggle('world')") + + Args: + meta (Dict[str, Any]): Mapping of meta information. + **handlers: Keyword args are prefixed with "@" to defined handlers. + + Returns: + Text: Self is returned to method may be chained. + """ + meta = {} if meta is None else meta + meta.update({f"@{key}": value for key, value in handlers.items()}) + self.stylize(Style.from_meta(meta)) + return self def remove_suffix(self, suffix: str) -> None: """Remove a suffix if it exists. @@ -364,7 +505,7 @@ def remove_suffix(self, suffix: str) -> None: suffix (str): Suffix to remove. """ if self.plain.endswith(suffix): - self.plain = self.plain[: -len(suffix)] + self.right_crop(len(suffix)) def get_style_at_offset(self, console: "Console", offset: int) -> Style: """Get the style of a character at give offset. @@ -376,20 +517,20 @@ def get_style_at_offset(self, console: "Console", offset: int) -> Style: Returns: Style: A Style instance. """ + # TODO: This is a little inefficient, it is only used by full justify if offset < 0: offset = len(self) + offset - get_style = console.get_style style = get_style(self.style).copy() for start, end, span_style in self._spans: - if offset >= start and offset < end: - style += get_style(span_style) + if end > offset >= start: + style += get_style(span_style, default="") return style def highlight_regex( self, re_highlight: str, - style: Union[GetStyleCallable, StyleType] = None, + style: Optional[Union[GetStyleCallable, StyleType]] = None, *, style_prefix: str = "", ) -> int: @@ -469,7 +610,7 @@ def rstrip_end(self, size: int) -> None: whitespace_match = _re_whitespace.search(self.plain) if whitespace_match is not None: whitespace_count = len(whitespace_match.group(0)) - self.plain = self.plain[: -min(whitespace_count, excess)] + self.right_crop(min(whitespace_count, excess)) def set_length(self, new_length: int) -> None: """Set new length of the text, clipping or padding is required.""" @@ -478,18 +619,15 @@ def set_length(self, new_length: int) -> None: if length < new_length: self.pad_right(new_length - length) else: - self.plain = self.plain[:new_length] + self.right_crop(length - new_length) def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> Iterable[Segment]: - tab_size: int = console.tab_size or self.tab_size or 8 # type: ignore - justify = cast( - "JustifyMethod", self.justify or options.justify or DEFAULT_OVERFLOW - ) - overflow = cast( - "OverflowMethod", self.overflow or options.overflow or DEFAULT_OVERFLOW - ) + tab_size: int = console.tab_size or self.tab_size or 8 + justify = self.justify or options.justify or DEFAULT_JUSTIFY + + overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW lines = self.wrap( console, @@ -502,12 +640,16 @@ def __rich_console__( all_lines = Text("\n").join(lines) yield from all_lines.render(console, end=self.end) - def __rich_measure__(self, console: "Console", max_width: int) -> Measurement: + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: text = self.plain - if not text.strip(): - return Measurement(cell_len(text), cell_len(text)) - max_text_width = max(cell_len(line) for line in text.splitlines()) - min_text_width = max(cell_len(word) for word in text.split()) + lines = text.splitlines() + max_text_width = max(cell_len(line) for line in lines) if lines else 0 + words = text.split() + min_text_width = ( + max(cell_len(word) for word in words) if words else max_text_width + ) return Measurement(min_text_width, max_text_width) def render(self, console: "Console", end: str = "") -> Iterable["Segment"]: @@ -520,11 +662,16 @@ def render(self, console: "Console", end: str = "") -> Iterable["Segment"]: Returns: Iterable[Segment]: Result of render that may be written to the console. """ - + _Segment = Segment text = self.plain - null_style = Style.null() + if not self._spans: + yield Segment(text) + if end: + yield _Segment(end) + return + get_style = partial(console.get_style, default=Style.null()) + enumerated_spans = list(enumerate(self._spans, 1)) - get_style = partial(console.get_style, default=null_style) style_map = {index: get_style(span.style) for index, span in enumerated_spans} style_map[0] = get_style(self.style) @@ -540,7 +687,6 @@ def render(self, console: "Console", end: str = "") -> Iterable["Segment"]: stack_append = stack.append stack_pop = stack.remove - _Segment = Segment style_cache: Dict[Tuple[Style, ...], Style] = {} style_cache_get = style_cache.get combine = Style.combine @@ -594,7 +740,7 @@ def iter_text() -> Iterable["Text"]: for text in iter_text(): extend_text(text._text) - if text.style is not None: + if text.style: append_span(_Span(offset, offset + len(text), text.style)) extend_spans( _Span(offset + start, offset + end, style) @@ -604,7 +750,7 @@ def iter_text() -> Iterable["Text"]: new_text._length = offset return new_text - def expand_tabs(self, tab_size: int = None) -> None: + def expand_tabs(self, tab_size: Optional[int] = None) -> None: """Converts tabs to spaces. Args: @@ -635,6 +781,7 @@ def expand_tabs(self, tab_size: int = None) -> None: else: append(part) self._text = [result.plain] + self._length = len(self.plain) self._spans[:] = result._spans def truncate( @@ -661,26 +808,22 @@ def truncate( self.plain = set_cell_size(self.plain, max_width) if pad and length < max_width: spaces = max_width - length - self.plain = f"{self.plain}{' ' * spaces}" + self._text = [f"{self.plain}{' ' * spaces}"] + self._length = len(self.plain) def _trim_spans(self) -> None: """Remove or modify any spans that are over the end of the text.""" - new_length = self._length - spans: List[Span] = [] - append = spans.append + max_offset = len(self.plain) _Span = Span - for span in self._spans: - if span.end < new_length: - append(span) - continue - if span.start >= new_length: - continue - if span.end > new_length: - start, end, style = span - append(_Span(start, min(new_length, end), style)) - else: - append(span) - self._spans[:] = spans + self._spans[:] = [ + ( + span + if span.end < max_offset + else _Span(span.start, min(max_offset, span.end), span.style) + ) + for span in self._spans + if span.start < max_offset + ] def pad(self, count: int, character: str = " ") -> None: """Pad left and right with a given number of characters. @@ -725,11 +868,11 @@ def pad_right(self, count: int, character: str = " ") -> None: if count: self.plain = f"{self.plain}{character * count}" - def align(self, align: AlignValues, width: int, character: str = " ") -> None: + def align(self, align: AlignMethod, width: int, character: str = " ") -> None: """Align text to a given width. Args: - align (AlignValues): One of "left", "center", or "right". + align (AlignMethod): One of "left", "center", or "right". width (int): Desired width. character (str, optional): Character to pad with. Defaults to " ". """ @@ -746,7 +889,7 @@ def align(self, align: AlignValues, width: int, character: str = " ") -> None: self.pad_left(excess_space, character) def append( - self, text: Union["Text", str], style: Union[str, "Style"] = None + self, text: Union["Text", str], style: Optional[Union[str, "Style"]] = None ) -> "Text": """Add text with an optional style. @@ -776,7 +919,6 @@ def append( raise ValueError( "style must not be set when appending Text instance" ) - text_length = self._length if text.style is not None: self._spans.append( @@ -809,11 +951,13 @@ def append_text(self, text: "Text") -> "Text": self._length += len(text) return self - def append_tokens(self, tokens: Iterable[Tuple[str, StyleType]]): + def append_tokens( + self, tokens: Iterable[Tuple[str, Optional[StyleType]]] + ) -> "Text": """Append iterable of str and style. Style may be a Style instance or a str style definition. Args: - pairs (Iterable[Tuple[str, StyleType]]): An iterable of tuples containing str content and style. + pairs (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style. Returns: Text: Returns self for chaining. @@ -824,7 +968,8 @@ def append_tokens(self, tokens: Iterable[Tuple[str, StyleType]]): offset = len(self) for content, style in tokens: append_text(content) - append_span(_Span(offset, offset + len(content), style)) + if style is not None: + append_span(_Span(offset, offset + len(content), style)) offset += len(content) self._length = offset return self @@ -839,7 +984,7 @@ def copy_styles(self, text: "Text") -> None: def split( self, - separator="\n", + separator: str = "\n", *, include_separator: bool = False, allow_blank: bool = False, @@ -847,7 +992,7 @@ def split( """Split rich text in to lines, preserving styles. Args: - separator (str, optional): String to split on. Defaults to "\\n". + separator (str, optional): String to split on. Defaults to "\\\\n". include_separator (bool, optional): Include the separator in the lines. Defaults to False. allow_blank (bool, optional): Return a blank line if the text ends with a separator. Defaults to False. @@ -859,23 +1004,26 @@ def split( text = self.plain if separator not in text: return Lines([self.copy()]) + + if include_separator: + lines = self.divide( + match.end() for match in re.finditer(re.escape(separator), text) + ) + else: + + def flatten_spans() -> Iterable[int]: + for match in re.finditer(re.escape(separator), text): + start, end = match.span() + yield start + yield end + + lines = Lines( + line for line in self.divide(flatten_spans()) if line.plain != separator + ) + if not allow_blank and text.endswith(separator): - text = text[: -len(separator)] - offsets: List[int] = [] - append = offsets.append - offset = 0 - while True: - try: - offset = text.index(separator, offset) + len(separator) - except ValueError: - break - append(offset) - lines = self.divide(offsets) - if not include_separator: - separator_length = len(separator) - for line in lines: - if line.plain.endswith(separator): - line.right_crop(separator_length) + lines.pop() + return lines def divide(self, offsets: Iterable[int]) -> Lines: @@ -887,71 +1035,102 @@ def divide(self, offsets: Iterable[int]) -> Lines: Returns: Lines: New RichText instances between offsets. """ + _offsets = list(offsets) - if not offsets: - line = self.copy() - return Lines([line]) + if not _offsets: + return Lines([self.copy()]) text = self.plain text_length = len(text) - divide_offsets = [0, *offsets, text_length] + divide_offsets = [0, *_offsets, text_length] line_ranges = list(zip(divide_offsets, divide_offsets[1:])) - average_line_length = -(-text_length // len(line_ranges)) + style = self.style + justify = self.justify + overflow = self.overflow + _Text = Text new_lines = Lines( - Text( + _Text( text[start:end], - style=self.style, - justify=self.justify, - overflow=self.overflow, + style=style, + justify=justify, + overflow=overflow, ) for start, end in line_ranges ) - line_ranges = [ - (offset, offset + len(line)) - for offset, line in zip(divide_offsets, new_lines) - ] - for span in self._spans: - line_index = (span.start // average_line_length) % len(line_ranges) + if not self._spans: + return new_lines - line_start, line_end = line_ranges[line_index] - if span.start < line_start: - while True: - line_index -= 1 - line_start, line_end = line_ranges[line_index] - if span.start >= line_start: - break - elif span.start > line_end: - while True: - line_index += 1 - line_start, line_end = line_ranges[line_index] - if span.start <= line_end: - break + _line_appends = [line._spans.append for line in new_lines._lines] + line_count = len(line_ranges) + _Span = Span + + for span_start, span_end, style in self._spans: + + lower_bound = 0 + upper_bound = line_count + start_line_no = (lower_bound + upper_bound) // 2 while True: - span, new_span = span.split(line_end) - new_lines[line_index]._spans.append(span.move(-line_start)) - if new_span is None: + line_start, line_end = line_ranges[start_line_no] + if span_start < line_start: + upper_bound = start_line_no - 1 + elif span_start > line_end: + lower_bound = start_line_no + 1 + else: break - span = new_span - line_index = (line_index + 1) % len(line_ranges) - line_start, line_end = line_ranges[line_index] + start_line_no = (lower_bound + upper_bound) // 2 + + if span_end < line_end: + end_line_no = start_line_no + else: + end_line_no = lower_bound = start_line_no + upper_bound = line_count + + while True: + line_start, line_end = line_ranges[end_line_no] + if span_end < line_start: + upper_bound = end_line_no - 1 + elif span_end > line_end: + lower_bound = end_line_no + 1 + else: + break + end_line_no = (lower_bound + upper_bound) // 2 + + for line_no in range(start_line_no, end_line_no + 1): + line_start, line_end = line_ranges[line_no] + new_start = max(0, span_start - line_start) + new_end = min(span_end - line_start, line_end - line_start) + if new_end > new_start: + _line_appends[line_no](_Span(new_start, new_end, style)) return new_lines def right_crop(self, amount: int = 1) -> None: """Remove a number of characters from the end of the text.""" - self.plain = self.plain[:-amount] + max_offset = len(self.plain) - amount + _Span = Span + self._spans[:] = [ + ( + span + if span.end < max_offset + else _Span(span.start, min(max_offset, span.end), span.style) + ) + for span in self._spans + if span.start < max_offset + ] + self._text = [self.plain[:-amount]] + self._length -= amount def wrap( self, console: "Console", width: int, *, - justify: "JustifyMethod" = None, - overflow: "OverflowMethod" = None, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, tab_size: int = 8, - no_wrap: bool = None, + no_wrap: Optional[bool] = None, ) -> Lines: """Word wrap the text. @@ -967,10 +1146,9 @@ def wrap( Returns: Lines: Number of lines. """ - wrap_justify = cast("JustifyMethod", justify or self.justify or DEFAULT_JUSTIFY) - wrap_overflow = cast( - "OverflowMethod", overflow or self.overflow or DEFAULT_OVERFLOW - ) + wrap_justify = justify or self.justify or DEFAULT_JUSTIFY + wrap_overflow = overflow or self.overflow or DEFAULT_OVERFLOW + no_wrap = pick_bool(no_wrap, self.no_wrap, False) or overflow == "ignore" lines = Lines() @@ -1032,7 +1210,7 @@ def detect_indentation(self) -> int: def with_indent_guides( self, - indent_size: int = None, + indent_size: Optional[int] = None, *, character: str = "│", style: StyleType = "dim green", @@ -1058,7 +1236,7 @@ def with_indent_guides( new_lines: List[Text] = [] add_line = new_lines.append blank_lines = 0 - for line in text.split(): + for line in text.split(allow_blank=True): match = re_indent.match(line.plain) if not match or not match.group(2): blank_lines += 1 @@ -1075,25 +1253,33 @@ def with_indent_guides( if blank_lines: new_lines.extend([Text("", style=style)] * blank_lines) - new_text = Text("\n").join(new_lines) + new_text = text.blank_copy("\n").join(new_lines) return new_text if __name__ == "__main__": # pragma: no cover - from rich import print + from rich.console import Console + + text = Text( + """\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n""" + ) + text.highlight_words(["Lorem"], "bold") + text.highlight_words(["ipsum"], "italic") - text = Text("\n\tHello\n") - text.expand_tabs(4) - print(text) + console = Console() - code = """ -def __add__(self, other: Any) -> "Text": - if isinstance(other, (str, Text)): - result = self.copy() - result.append(other) - return result - return NotImplemented -""" - text = Text(code) - text = text.with_indent_guides() - print(text) + console.rule("justify='left'") + console.print(text, style="red") + console.print() + + console.rule("justify='center'") + console.print(text, style="green", justify="center") + console.print() + + console.rule("justify='right'") + console.print(text, style="blue", justify="right") + console.print() + + console.rule("justify='full'") + console.print(text, style="magenta", justify="full") + console.print() diff --git a/rich/theme.py b/rich/theme.py index 7f161d9c1a..bfb3c7f821 100644 --- a/rich/theme.py +++ b/rich/theme.py @@ -15,7 +15,9 @@ class Theme: styles: Dict[str, Style] - def __init__(self, styles: Mapping[str, StyleType] = None, inherit: bool = True): + def __init__( + self, styles: Optional[Mapping[str, StyleType]] = None, inherit: bool = True + ): self.styles = DEFAULT_STYLES.copy() if inherit else {} if styles is not None: self.styles.update( @@ -35,7 +37,7 @@ def config(self) -> str: @classmethod def from_file( - cls, config_file: IO[str], source: str = None, inherit: bool = True + cls, config_file: IO[str], source: Optional[str] = None, inherit: bool = True ) -> "Theme": """Load a theme from a text mode file. diff --git a/rich/traceback.py b/rich/traceback.py index 1d9b06590d..55acaf0708 100644 --- a/rich/traceback.py +++ b/rich/traceback.py @@ -1,36 +1,23 @@ from __future__ import absolute_import -import os.path +import os import platform import sys from dataclasses import dataclass, field -from textwrap import indent from traceback import walk_tb -from types import TracebackType -from typing import Callable, Dict, List, Optional, Type +from types import ModuleType, TracebackType +from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Type, Union from pygments.lexers import guess_lexer_for_filename -from pygments.token import ( - Comment, - Keyword, - Name, - Number, - Operator, - String, - Token, - Text as TextToken, -) +from pygments.token import Comment, Keyword, Name, Number, Operator, String +from pygments.token import Text as TextToken +from pygments.token import Token +from pygments.util import ClassNotFound from . import pretty -from ._loop import loop_first, loop_last +from ._loop import loop_last from .columns import Columns -from .console import ( - Console, - ConsoleOptions, - ConsoleRenderable, - RenderResult, - render_group, -) +from .console import Console, ConsoleOptions, ConsoleRenderable, RenderResult, group from .constrain import Constrain from .highlighter import RegexHighlighter, ReprHighlighter from .panel import Panel @@ -48,14 +35,16 @@ def install( *, - console: Console = None, + console: Optional[Console] = None, width: Optional[int] = 100, extra_lines: int = 3, theme: Optional[str] = None, word_wrap: bool = False, show_locals: bool = False, indent_guides: bool = True, -) -> Callable: + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, +) -> Callable[[Type[BaseException], BaseException, Optional[TracebackType]], Any]: """Install a rich traceback handler. Once installed, any tracebacks will be printed with syntax highlighting and rich formatting. @@ -70,6 +59,7 @@ def install( word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. show_locals (bool, optional): Enable display of local variables. Defaults to False. indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. + suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. Returns: Callable: The previous exception handler that was replaced. @@ -80,7 +70,7 @@ def install( def excepthook( type_: Type[BaseException], value: BaseException, - traceback: TracebackType, + traceback: Optional[TracebackType], ) -> None: traceback_console.print( Traceback.from_exception( @@ -93,12 +83,62 @@ def excepthook( word_wrap=word_wrap, show_locals=show_locals, indent_guides=indent_guides, + suppress=suppress, + max_frames=max_frames, ) ) - old_excepthook = sys.excepthook - sys.excepthook = excepthook - return old_excepthook + def ipy_excepthook_closure(ip: Any) -> None: # pragma: no cover + tb_data = {} # store information about showtraceback call + default_showtraceback = ip.showtraceback # keep reference of default traceback + + def ipy_show_traceback(*args: Any, **kwargs: Any) -> None: + """wrap the default ip.showtraceback to store info for ip._showtraceback""" + nonlocal tb_data + tb_data = kwargs + default_showtraceback(*args, **kwargs) + + def ipy_display_traceback( + *args: Any, is_syntax: bool = False, **kwargs: Any + ) -> None: + """Internally called traceback from ip._showtraceback""" + nonlocal tb_data + exc_tuple = ip._get_exc_info() + + # do not display trace on syntax error + tb: Optional[TracebackType] = None if is_syntax else exc_tuple[2] + + # determine correct tb_offset + compiled = tb_data.get("running_compiled_code", False) + tb_offset = tb_data.get("tb_offset", 1 if compiled else 0) + # remove ipython internal frames from trace with tb_offset + for _ in range(tb_offset): + if tb is None: + break + tb = tb.tb_next + + excepthook(exc_tuple[0], exc_tuple[1], tb) + tb_data = {} # clear data upon usage + + # replace _showtraceback instead of showtraceback to allow ipython features such as debugging to work + # this is also what the ipython docs recommends to modify when subclassing InteractiveShell + ip._showtraceback = ipy_display_traceback + # add wrapper to capture tb_data + ip.showtraceback = ipy_show_traceback + ip.showsyntaxerror = lambda *args, **kwargs: ipy_display_traceback( + *args, is_syntax=True, **kwargs + ) + + try: # pragma: no cover + # if within ipython, use customized traceback + ip = get_ipython() # type: ignore[name-defined] + ipy_excepthook_closure(ip) + return sys.excepthook + except Exception: + # otherwise use default system hook + old_excepthook = sys.excepthook + sys.excepthook = excepthook + return old_excepthook @dataclass @@ -124,6 +164,7 @@ class Stack: exc_type: str exc_value: str syntax_error: Optional[_SyntaxError] = None + is_cause: bool = False frames: List[Frame] = field(default_factory=list) @@ -151,12 +192,23 @@ class Traceback: locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + """ + LEXERS = { + "": "text", + ".py": "python", + ".pxd": "cython", + ".pyx": "cython", + ".pxi": "pyrex", + } + def __init__( self, - trace: Trace = None, - width: Optional[int] = 88, + trace: Optional[Trace] = None, + width: Optional[int] = 100, extra_lines: int = 3, theme: Optional[str] = None, word_wrap: bool = False, @@ -164,6 +216,8 @@ def __init__( indent_guides: bool = True, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, ): if trace is None: exc_type, exc_value, traceback = sys.exc_info() @@ -184,10 +238,23 @@ def __init__( self.locals_max_length = locals_max_length self.locals_max_string = locals_max_string + self.suppress: Sequence[str] = [] + for suppress_entity in suppress: + if not isinstance(suppress_entity, str): + assert ( + suppress_entity.__file__ is not None + ), f"{suppress_entity!r} must be a module with '__file__' attribute" + path = os.path.dirname(suppress_entity.__file__) + else: + path = suppress_entity + path = os.path.normpath(os.path.abspath(path)) + self.suppress.append(path) + self.max_frames = max(4, max_frames) if max_frames > 0 else 0 + @classmethod def from_exception( cls, - exc_type: Type, + exc_type: Type[Any], exc_value: BaseException, traceback: Optional[TracebackType], width: Optional[int] = 100, @@ -198,6 +265,8 @@ def from_exception( indent_guides: bool = True, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, ) -> "Traceback": """Create a traceback from exception info @@ -214,6 +283,8 @@ def from_exception( locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. Returns: Traceback: A Traceback instance that may be printed. @@ -221,7 +292,7 @@ def from_exception( rich_traceback = cls.extract( exc_type, exc_value, traceback, show_locals=show_locals ) - return Traceback( + return cls( rich_traceback, width=width, extra_lines=extra_lines, @@ -231,6 +302,8 @@ def from_exception( indent_guides=indent_guides, locals_max_length=locals_max_length, locals_max_string=locals_max_string, + suppress=suppress, + max_frames=max_frames, ) @classmethod @@ -259,8 +332,23 @@ def extract( """ stacks: List[Stack] = [] + is_cause = False + + from rich import _IMPORT_CWD + + def safe_str(_object: Any) -> str: + """Don't allow exceptions from __str__ to propegate.""" + try: + return str(_object) + except Exception: + return "" + while True: - stack = Stack(exc_type=str(exc_type.__name__), exc_value=str(exc_value)) + stack = Stack( + exc_type=safe_str(exc_type.__name__), + exc_value=safe_str(exc_value), + is_cause=is_cause, + ) if isinstance(exc_value, SyntaxError): stack.syntax_error = _SyntaxError( @@ -276,9 +364,13 @@ def extract( for frame_summary, line_no in walk_tb(traceback): filename = frame_summary.f_code.co_filename - filename = os.path.abspath(filename) if filename else "?" + if filename and not filename.startswith("<"): + if not os.path.isabs(filename): + filename = os.path.join(_IMPORT_CWD, filename) + if frame_summary.f_locals.get("_rich_traceback_omit", False): + continue frame = Frame( - filename=filename, + filename=filename or "?", lineno=line_no, name=frame_summary.f_code.co_name, locals={ @@ -293,14 +385,28 @@ def extract( else None, ) append(frame) + if frame_summary.f_locals.get("_rich_traceback_guard", False): + del stack.frames[:] - cause = exc_value.__context__ + cause = getattr(exc_value, "__cause__", None) if cause and cause.__traceback__: exc_type = cause.__class__ exc_value = cause traceback = cause.__traceback__ - if traceback: - continue + is_cause = True + continue + + cause = exc_value.__context__ + if ( + cause + and cause.__traceback__ + and not getattr(exc_value, "__suppress_context__", False) + ): + exc_type = cause.__class__ + exc_value = cause + traceback = cause.__traceback__ + is_cause = False + continue # No cover, code is reached but coverage doesn't recognize it. break # pragma: no cover @@ -332,7 +438,8 @@ def __rich_console__( "scope.equals": token_style(Operator), "scope.key": token_style(Name), "scope.key.special": token_style(Name.Constant) + Style(dim=True), - } + }, + inherit=False, ) highlighter = ReprHighlighter() @@ -342,7 +449,7 @@ def __rich_console__( self._render_stack(stack), title="[traceback.title]Traceback [dim](most recent call last)", style=background_style, - border_style="traceback.border.syntax_error", + border_style="traceback.border", expand=True, padding=(0, 1), ) @@ -355,7 +462,7 @@ def __rich_console__( Panel( self._render_syntax_error(stack.syntax_error), style=background_style, - border_style="traceback.border", + border_style="traceback.border.syntax_error", expand=True, padding=(0, 1), width=self.width, @@ -366,18 +473,25 @@ def __rich_console__( (f"{stack.exc_type}: ", "traceback.exc_type"), highlighter(stack.syntax_error.msg), ) - else: + elif stack.exc_value: yield Text.assemble( (f"{stack.exc_type}: ", "traceback.exc_type"), highlighter(stack.exc_value), ) + else: + yield Text.assemble((f"{stack.exc_type}", "traceback.exc_type")) if not last: - yield Text.from_markup( - "\n[i]During handling of the above exception, another exception occurred:\n", - ) + if stack.is_cause: + yield Text.from_markup( + "\n[i]The above exception was the direct cause of the following exception:\n", + ) + else: + yield Text.from_markup( + "\n[i]During handling of the above exception, another exception occurred:\n", + ) - @render_group() + @group() def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult: highlighter = ReprHighlighter() path_highlighter = PathHighlighter() @@ -392,14 +506,30 @@ def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult: syntax_error_text = highlighter(syntax_error.line.rstrip()) syntax_error_text.no_wrap = True offset = min(syntax_error.offset - 1, len(syntax_error_text)) - syntax_error_text.stylize("bold underline", offset, offset + 1) + syntax_error_text.stylize("bold underline", offset, offset) syntax_error_text += Text.from_markup( "\n" + " " * offset + "[traceback.offset]▲[/]", style="pygments.text", ) yield syntax_error_text - @render_group() + @classmethod + def _guess_lexer(cls, filename: str, code: str) -> str: + ext = os.path.splitext(filename)[-1] + if not ext: + # No extension, look at first line to see if it is a hashbang + # Note, this is an educated guess and not a guarantee + # If it fails, the only downside is that the code is highlighted strangely + new_line_index = code.index("\n") + first_line = code[:new_line_index] if new_line_index != -1 else code + if first_line.startswith("#!") and "python" in first_line.lower(): + return "python" + try: + return cls.LEXERS.get(ext) or guess_lexer_for_filename(filename, code).name + except ClassNotFound: + return "text" + + @group() def _render_stack(self, stack: Stack) -> RenderResult: path_highlighter = PathHighlighter() theme = self.theme @@ -416,12 +546,50 @@ def read_code(filename: str) -> str: """ code = code_cache.get(filename) if code is None: - with open(filename, "rt") as code_file: + with open( + filename, "rt", encoding="utf-8", errors="replace" + ) as code_file: code = code_file.read() code_cache[filename] = code return code - for first, frame in loop_first(stack.frames): + def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: + if frame.locals: + yield render_scope( + frame.locals, + title="locals", + indent_guides=self.indent_guides, + max_length=self.locals_max_length, + max_string=self.locals_max_string, + ) + + exclude_frames: Optional[range] = None + if self.max_frames != 0: + exclude_frames = range( + self.max_frames // 2, + len(stack.frames) - self.max_frames // 2, + ) + + excluded = False + for frame_index, frame in enumerate(stack.frames): + + if exclude_frames and frame_index in exclude_frames: + excluded = True + continue + + if excluded: + assert exclude_frames is not None + yield Text( + f"\n... {len(exclude_frames)} frames hidden ...", + justify="center", + style="traceback.error", + ) + excluded = False + + first = frame_index == 0 + frame_filename = frame.filename + suppressed = any(frame_filename.startswith(path) for path in self.suppress) + text = Text.assemble( path_highlighter(Text(frame.filename, style="pygments.string")), (":", "pygments.text"), @@ -434,46 +602,44 @@ def read_code(filename: str) -> str: yield "" yield text if frame.filename.startswith("<"): + yield from render_locals(frame) continue - try: - code = read_code(frame.filename) - lexer = guess_lexer_for_filename(frame.filename, code) - lexer_name = lexer.name - syntax = Syntax( - code, - lexer_name, - theme=theme, - line_numbers=True, - line_range=( - frame.lineno - self.extra_lines, - frame.lineno + self.extra_lines, - ), - highlight_lines={frame.lineno}, - word_wrap=self.word_wrap, - code_width=88, - indent_guides=self.indent_guides, - ) - yield "" - except Exception: - pass - else: - yield ( - Columns( - [ - syntax, - render_scope( - frame.locals, - title="locals", - indent_guides=self.indent_guides, - max_length=self.locals_max_length, - max_string=self.locals_max_string, - ), - ], - padding=1, + if not suppressed: + try: + code = read_code(frame.filename) + lexer_name = self._guess_lexer(frame.filename, code) + syntax = Syntax( + code, + lexer_name, + theme=theme, + line_numbers=True, + line_range=( + frame.lineno - self.extra_lines, + frame.lineno + self.extra_lines, + ), + highlight_lines={frame.lineno}, + word_wrap=self.word_wrap, + code_width=88, + indent_guides=self.indent_guides, + dedent=False, + ) + yield "" + except Exception as error: + yield Text.assemble( + (f"\n{error}", "traceback.error"), + ) + else: + yield ( + Columns( + [ + syntax, + *render_locals(frame), + ], + padding=1, + ) + if frame.locals + else syntax ) - if frame.locals - else syntax - ) if __name__ == "__main__": # pragma: no cover @@ -483,30 +649,30 @@ def read_code(filename: str) -> str: console = Console() import sys - def bar(a): # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑 + def bar(a: Any) -> None: # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑 one = 1 print(one / a) - def foo(a): - + def foo(a: Any) -> None: + _rich_traceback_guard = True zed = { "characters": { - "Paul Atriedies", + "Paul Atreides", "Vladimir Harkonnen", - "Thufir Haway", + "Thufir Hawat", "Duncan Idaho", }, "atomic_types": (None, False, True), } bar(a) - def error(): + def error() -> None: try: try: foo(0) except: - slfkjsldkfj # type: ignore + slfkjsldkfj # type: ignore[name-defined] except: console.print_exception(show_locals=True) diff --git a/rich/tree.py b/rich/tree.py new file mode 100644 index 0000000000..b9b7bbe541 --- /dev/null +++ b/rich/tree.py @@ -0,0 +1,251 @@ +from typing import Iterator, List, Optional, Tuple + +from ._loop import loop_first, loop_last +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import Style, StyleStack, StyleType +from .styled import Styled + + +class Tree(JupyterMixin): + """A renderable for a tree structure. + + Args: + label (RenderableType): The renderable or str for the tree label. + style (StyleType, optional): Style of this tree. Defaults to "tree". + guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". + expanded (bool, optional): Also display children. Defaults to True. + highlight (bool, optional): Highlight renderable (if str). Defaults to False. + """ + + def __init__( + self, + label: RenderableType, + *, + style: StyleType = "tree", + guide_style: StyleType = "tree.line", + expanded: bool = True, + highlight: bool = False, + hide_root: bool = False, + ) -> None: + self.label = label + self.style = style + self.guide_style = guide_style + self.children: List[Tree] = [] + self.expanded = expanded + self.highlight = highlight + self.hide_root = hide_root + + def add( + self, + label: RenderableType, + *, + style: Optional[StyleType] = None, + guide_style: Optional[StyleType] = None, + expanded: bool = True, + highlight: Optional[bool] = False, + ) -> "Tree": + """Add a child tree. + + Args: + label (RenderableType): The renderable or str for the tree label. + style (StyleType, optional): Style of this tree. Defaults to "tree". + guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". + expanded (bool, optional): Also display children. Defaults to True. + highlight (Optional[bool], optional): Highlight renderable (if str). Defaults to False. + + Returns: + Tree: A new child Tree, which may be further modified. + """ + node = Tree( + label, + style=self.style if style is None else style, + guide_style=self.guide_style if guide_style is None else guide_style, + expanded=expanded, + highlight=self.highlight if highlight is None else highlight, + ) + self.children.append(node) + return node + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + + stack: List[Iterator[Tuple[bool, Tree]]] = [] + pop = stack.pop + push = stack.append + new_line = Segment.line() + + get_style = console.get_style + null_style = Style.null() + guide_style = get_style(self.guide_style, default="") or null_style + SPACE, CONTINUE, FORK, END = range(4) + + ASCII_GUIDES = (" ", "| ", "+-- ", "`-- ") + TREE_GUIDES = [ + (" ", "│ ", "├── ", "└── "), + (" ", "┃ ", "┣━━ ", "┗━━ "), + (" ", "║ ", "╠══ ", "╚══ "), + ] + _Segment = Segment + + def make_guide(index: int, style: Style) -> Segment: + """Make a Segment for a level of the guide lines.""" + if options.ascii_only: + line = ASCII_GUIDES[index] + else: + guide = 1 if style.bold else (2 if style.underline2 else 0) + line = TREE_GUIDES[0 if options.legacy_windows else guide][index] + return _Segment(line, style) + + levels: List[Segment] = [make_guide(CONTINUE, guide_style)] + push(iter(loop_last([self]))) + + guide_style_stack = StyleStack(get_style(self.guide_style)) + style_stack = StyleStack(get_style(self.style)) + remove_guide_styles = Style(bold=False, underline2=False) + + depth = 0 + + while stack: + stack_node = pop() + try: + last, node = next(stack_node) + except StopIteration: + levels.pop() + if levels: + guide_style = levels[-1].style or null_style + levels[-1] = make_guide(FORK, guide_style) + guide_style_stack.pop() + style_stack.pop() + continue + push(stack_node) + if last: + levels[-1] = make_guide(END, levels[-1].style or null_style) + + guide_style = guide_style_stack.current + get_style(node.guide_style) + style = style_stack.current + get_style(node.style) + prefix = levels[(2 if self.hide_root else 1) :] + renderable_lines = console.render_lines( + Styled(node.label, style), + options.update( + width=options.max_width + - sum(level.cell_length for level in prefix), + highlight=self.highlight, + height=None, + ), + pad=options.justify is not None, + ) + + if not (depth == 0 and self.hide_root): + for first, line in loop_first(renderable_lines): + if prefix: + yield from _Segment.apply_style( + prefix, + style.background_style, + post_style=remove_guide_styles, + ) + yield from line + yield new_line + if first and prefix: + prefix[-1] = make_guide( + SPACE if last else CONTINUE, prefix[-1].style or null_style + ) + + if node.expanded and node.children: + levels[-1] = make_guide( + SPACE if last else CONTINUE, levels[-1].style or null_style + ) + levels.append( + make_guide(END if len(node.children) == 1 else FORK, guide_style) + ) + style_stack.push(get_style(node.style)) + guide_style_stack.push(get_style(node.guide_style)) + push(iter(loop_last(node.children))) + depth += 1 + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + stack: List[Iterator[Tree]] = [iter([self])] + pop = stack.pop + push = stack.append + minimum = 0 + maximum = 0 + measure = Measurement.get + level = 0 + while stack: + iter_tree = pop() + try: + tree = next(iter_tree) + except StopIteration: + level -= 1 + continue + push(iter_tree) + min_measure, max_measure = measure(console, options, tree.label) + indent = level * 4 + minimum = max(min_measure + indent, minimum) + maximum = max(max_measure + indent, maximum) + if tree.expanded and tree.children: + push(iter(tree.children)) + level += 1 + return Measurement(minimum, maximum) + + +if __name__ == "__main__": # pragma: no cover + + from rich.console import Group + from rich.markdown import Markdown + from rich.panel import Panel + from rich.syntax import Syntax + from rich.table import Table + + table = Table(row_styles=["", "dim"]) + + table.add_column("Released", style="cyan", no_wrap=True) + table.add_column("Title", style="magenta") + table.add_column("Box Office", justify="right", style="green") + + table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690") + table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") + table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889") + table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889") + + code = """\ +class Segment(NamedTuple): + text: str = "" + style: Optional[Style] = None + is_control: bool = False +""" + syntax = Syntax(code, "python", theme="monokai", line_numbers=True) + + markdown = Markdown( + """\ +### example.md +> Hello, World! +> +> Markdown _all_ the things +""" + ) + + root = Tree("🌲 [b green]Rich Tree", highlight=True, hide_root=True) + + node = root.add(":file_folder: Renderables", guide_style="red") + simple_node = node.add(":file_folder: [bold yellow]Atomic", guide_style="uu green") + simple_node.add(Group("📄 Syntax", syntax)) + simple_node.add(Group("📄 Markdown", Panel(markdown, border_style="green"))) + + containers_node = node.add( + ":file_folder: [bold magenta]Containers", guide_style="bold magenta" + ) + containers_node.expanded = True + panel = Panel.fit("Just a panel", border_style="red") + containers_node.add(Group("📄 Panels", panel)) + + containers_node.add(Group("📄 [b magenta]Table", table)) + + console = Console() + + console.print(root) diff --git a/tests/_card_render.py b/tests/_card_render.py index f70e231545..ac8d7d42df 100644 --- a/tests/_card_render.py +++ b/tests/_card_render.py @@ -1 +1 @@ -expected = "\x1b[3m Rich features \x1b[0m\n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Colors \x1b[0m\x1b[1;31m \x1b[0m✓ \x1b[1;32m4-bit color\x1b[0m \x1b[38;2;51;0;0m█\x1b[0m\x1b[38;2;51;5;0m█\x1b[0m\x1b[38;2;51;11;0m█\x1b[0m\x1b[38;2;51;17;0m█\x1b[0m\x1b[38;2;51;23;0m█\x1b[0m\x1b[38;2;51;29;0m█\x1b[0m\x1b[38;2;51;35;0m█\x1b[0m\x1b[38;2;51;41;0m█\x1b[0m\x1b[38;2;51;47;0m█\x1b[0m\x1b[38;2;49;51;0m█\x1b[0m\x1b[38;2;43;51;0m█\x1b[0m\x1b[38;2;37;51;0m█\x1b[0m\x1b[38;2;31;51;0m█\x1b[0m\x1b[38;2;25;51;0m█\x1b[0m\x1b[38;2;19;51;0m█\x1b[0m\x1b[38;2;13;51;0m█\x1b[0m\x1b[38;2;7;51;0m█\x1b[0m\x1b[38;2;1;51;0m█\x1b[0m\x1b[38;2;0;51;3m█\x1b[0m\x1b[38;2;0;51;9m█\x1b[0m\x1b[38;2;0;51;15m█\x1b[0m\x1b[38;2;0;51;21m█\x1b[0m\x1b[38;2;0;51;27m█\x1b[0m\x1b[38;2;0;51;33m█\x1b[0m\x1b[38;2;0;51;39m█\x1b[0m\x1b[38;2;0;51;45m█\x1b[0m\x1b[38;2;0;50;51m█\x1b[0m\x1b[38;2;0;45;51m█\x1b[0m\x1b[38;2;0;39;51m█\x1b[0m\x1b[38;2;0;33;51m█\x1b[0m\x1b[38;2;0;27;51m█\x1b[0m\x1b[38;2;0;21;51m█\x1b[0m\x1b[38;2;0;15;51m█\x1b[0m\x1b[38;2;0;9;51m█\x1b[0m\x1b[38;2;0;3;51m█\x1b[0m\x1b[38;2;1;0;51m█\x1b[0m\x1b[38;2;7;0;51m█\x1b[0m\x1b[38;2;13;0;51m█\x1b[0m\x1b[38;2;19;0;51m█\x1b[0m\x1b[38;2;25;0;51m█\x1b[0m\x1b[38;2;31;0;51m█\x1b[0m\x1b[38;2;37;0;51m█\x1b[0m\x1b[38;2;43;0;51m█\x1b[0m\x1b[38;2;49;0;51m█\x1b[0m\x1b[38;2;51;0;47m█\x1b[0m\x1b[38;2;51;0;41m█\x1b[0m\x1b[38;2;51;0;35m█\x1b[0m\x1b[38;2;51;0;29m█\x1b[0m\x1b[38;2;51;0;23m█\x1b[0m\x1b[38;2;51;0;17m█\x1b[0m\x1b[38;2;51;0;11m█\x1b[0m\x1b[38;2;51;0;5m█\x1b[0m \n ✓ \x1b[1;34m8-bit color\x1b[0m \x1b[38;2;122;0;0m█\x1b[0m\x1b[38;2;122;14;0m█\x1b[0m\x1b[38;2;122;28;0m█\x1b[0m\x1b[38;2;122;42;0m█\x1b[0m\x1b[38;2;122;56;0m█\x1b[0m\x1b[38;2;122;70;0m█\x1b[0m\x1b[38;2;122;84;0m█\x1b[0m\x1b[38;2;122;98;0m█\x1b[0m\x1b[38;2;122;112;0m█\x1b[0m\x1b[38;2;117;122;0m█\x1b[0m\x1b[38;2;103;122;0m█\x1b[0m\x1b[38;2;89;122;0m█\x1b[0m\x1b[38;2;75;122;0m█\x1b[0m\x1b[38;2;61;122;0m█\x1b[0m\x1b[38;2;47;122;0m█\x1b[0m\x1b[38;2;32;122;0m█\x1b[0m\x1b[38;2;18;122;0m█\x1b[0m\x1b[38;2;4;122;0m█\x1b[0m\x1b[38;2;0;122;9m█\x1b[0m\x1b[38;2;0;122;23m█\x1b[0m\x1b[38;2;0;122;37m█\x1b[0m\x1b[38;2;0;122;51m█\x1b[0m\x1b[38;2;0;122;65m█\x1b[0m\x1b[38;2;0;122;80m█\x1b[0m\x1b[38;2;0;122;94m█\x1b[0m\x1b[38;2;0;122;108m█\x1b[0m\x1b[38;2;0;122;122m█\x1b[0m\x1b[38;2;0;108;122m█\x1b[0m\x1b[38;2;0;94;122m█\x1b[0m\x1b[38;2;0;80;122m█\x1b[0m\x1b[38;2;0;65;122m█\x1b[0m\x1b[38;2;0;51;122m█\x1b[0m\x1b[38;2;0;37;122m█\x1b[0m\x1b[38;2;0;23;122m█\x1b[0m\x1b[38;2;0;9;122m█\x1b[0m\x1b[38;2;4;0;122m█\x1b[0m\x1b[38;2;18;0;122m█\x1b[0m\x1b[38;2;32;0;122m█\x1b[0m\x1b[38;2;47;0;122m█\x1b[0m\x1b[38;2;61;0;122m█\x1b[0m\x1b[38;2;75;0;122m█\x1b[0m\x1b[38;2;89;0;122m█\x1b[0m\x1b[38;2;103;0;122m█\x1b[0m\x1b[38;2;117;0;122m█\x1b[0m\x1b[38;2;122;0;112m█\x1b[0m\x1b[38;2;122;0;98m█\x1b[0m\x1b[38;2;122;0;84m█\x1b[0m\x1b[38;2;122;0;70m█\x1b[0m\x1b[38;2;122;0;56m█\x1b[0m\x1b[38;2;122;0;42m█\x1b[0m\x1b[38;2;122;0;28m█\x1b[0m\x1b[38;2;122;0;14m█\x1b[0m \n ✓ \x1b[1;35mTruecolor (16.7 million)\x1b[0m \x1b[38;2;193;0;0m█\x1b[0m\x1b[38;2;193;22;0m█\x1b[0m\x1b[38;2;193;44;0m█\x1b[0m\x1b[38;2;193;67;0m█\x1b[0m\x1b[38;2;193;89;0m█\x1b[0m\x1b[38;2;193;111;0m█\x1b[0m\x1b[38;2;193;134;0m█\x1b[0m\x1b[38;2;193;156;0m█\x1b[0m\x1b[38;2;193;178;0m█\x1b[0m\x1b[38;2;186;193;0m█\x1b[0m\x1b[38;2;163;193;0m█\x1b[0m\x1b[38;2;141;193;0m█\x1b[0m\x1b[38;2;119;193;0m█\x1b[0m\x1b[38;2;96;193;0m█\x1b[0m\x1b[38;2;74;193;0m█\x1b[0m\x1b[38;2;52;193;0m█\x1b[0m\x1b[38;2;29;193;0m█\x1b[0m\x1b[38;2;7;193;0m█\x1b[0m\x1b[38;2;0;193;14m█\x1b[0m\x1b[38;2;0;193;37m█\x1b[0m\x1b[38;2;0;193;59m█\x1b[0m\x1b[38;2;0;193;81m█\x1b[0m\x1b[38;2;0;193;104m█\x1b[0m\x1b[38;2;0;193;126m█\x1b[0m\x1b[38;2;0;193;149m█\x1b[0m\x1b[38;2;0;193;171m█\x1b[0m\x1b[38;2;0;193;193m█\x1b[0m\x1b[38;2;0;171;193m█\x1b[0m\x1b[38;2;0;149;193m█\x1b[0m\x1b[38;2;0;126;193m█\x1b[0m\x1b[38;2;0;104;193m█\x1b[0m\x1b[38;2;0;81;193m█\x1b[0m\x1b[38;2;0;59;193m█\x1b[0m\x1b[38;2;0;37;193m█\x1b[0m\x1b[38;2;0;14;193m█\x1b[0m\x1b[38;2;7;0;193m█\x1b[0m\x1b[38;2;29;0;193m█\x1b[0m\x1b[38;2;52;0;193m█\x1b[0m\x1b[38;2;74;0;193m█\x1b[0m\x1b[38;2;96;0;193m█\x1b[0m\x1b[38;2;119;0;193m█\x1b[0m\x1b[38;2;141;0;193m█\x1b[0m\x1b[38;2;163;0;193m█\x1b[0m\x1b[38;2;186;0;193m█\x1b[0m\x1b[38;2;193;0;178m█\x1b[0m\x1b[38;2;193;0;156m█\x1b[0m\x1b[38;2;193;0;134m█\x1b[0m\x1b[38;2;193;0;111m█\x1b[0m\x1b[38;2;193;0;89m█\x1b[0m\x1b[38;2;193;0;67m█\x1b[0m\x1b[38;2;193;0;44m█\x1b[0m\x1b[38;2;193;0;22m█\x1b[0m \n ✓ \x1b[1;33mDumb terminals\x1b[0m \x1b[38;2;255;10;10m█\x1b[0m\x1b[38;2;255;38;10m█\x1b[0m\x1b[38;2;255;66;10m█\x1b[0m\x1b[38;2;255;94;10m█\x1b[0m\x1b[38;2;255;123;10m█\x1b[0m\x1b[38;2;255;151;10m█\x1b[0m\x1b[38;2;255;179;10m█\x1b[0m\x1b[38;2;255;207;10m█\x1b[0m\x1b[38;2;255;236;10m█\x1b[0m\x1b[38;2;245;255;10m█\x1b[0m\x1b[38;2;217;255;10m█\x1b[0m\x1b[38;2;189;255;10m█\x1b[0m\x1b[38;2;160;255;10m█\x1b[0m\x1b[38;2;132;255;10m█\x1b[0m\x1b[38;2;104;255;10m█\x1b[0m\x1b[38;2;76;255;10m█\x1b[0m\x1b[38;2;47;255;10m█\x1b[0m\x1b[38;2;19;255;10m█\x1b[0m\x1b[38;2;10;255;29m█\x1b[0m\x1b[38;2;10;255;57m█\x1b[0m\x1b[38;2;10;255;85m█\x1b[0m\x1b[38;2;10;255;113m█\x1b[0m\x1b[38;2;10;255;142m█\x1b[0m\x1b[38;2;10;255;170m█\x1b[0m\x1b[38;2;10;255;198m█\x1b[0m\x1b[38;2;10;255;226m█\x1b[0m\x1b[38;2;10;254;255m█\x1b[0m\x1b[38;2;10;226;255m█\x1b[0m\x1b[38;2;10;198;255m█\x1b[0m\x1b[38;2;10;170;255m█\x1b[0m\x1b[38;2;10;142;255m█\x1b[0m\x1b[38;2;10;113;255m█\x1b[0m\x1b[38;2;10;85;255m█\x1b[0m\x1b[38;2;10;57;255m█\x1b[0m\x1b[38;2;10;29;255m█\x1b[0m\x1b[38;2;19;10;255m█\x1b[0m\x1b[38;2;47;10;255m█\x1b[0m\x1b[38;2;76;10;255m█\x1b[0m\x1b[38;2;104;10;255m█\x1b[0m\x1b[38;2;132;10;255m█\x1b[0m\x1b[38;2;160;10;255m█\x1b[0m\x1b[38;2;189;10;255m█\x1b[0m\x1b[38;2;217;10;255m█\x1b[0m\x1b[38;2;245;10;255m█\x1b[0m\x1b[38;2;255;10;236m█\x1b[0m\x1b[38;2;255;10;207m█\x1b[0m\x1b[38;2;255;10;179m█\x1b[0m\x1b[38;2;255;10;151m█\x1b[0m\x1b[38;2;255;10;123m█\x1b[0m\x1b[38;2;255;10;94m█\x1b[0m\x1b[38;2;255;10;66m█\x1b[0m\x1b[38;2;255;10;38m█\x1b[0m \n ✓ \x1b[1;36mAutomatic color conversion\x1b[0m \x1b[38;2;255;81;81m█\x1b[0m\x1b[38;2;255;101;81m█\x1b[0m\x1b[38;2;255;121;81m█\x1b[0m\x1b[38;2;255;141;81m█\x1b[0m\x1b[38;2;255;161;81m█\x1b[0m\x1b[38;2;255;181;81m█\x1b[0m\x1b[38;2;255;201;81m█\x1b[0m\x1b[38;2;255;221;81m█\x1b[0m\x1b[38;2;255;241;81m█\x1b[0m\x1b[38;2;248;255;81m█\x1b[0m\x1b[38;2;228;255;81m█\x1b[0m\x1b[38;2;208;255;81m█\x1b[0m\x1b[38;2;188;255;81m█\x1b[0m\x1b[38;2;168;255;81m█\x1b[0m\x1b[38;2;148;255;81m█\x1b[0m\x1b[38;2;128;255;81m█\x1b[0m\x1b[38;2;108;255;81m█\x1b[0m\x1b[38;2;88;255;81m█\x1b[0m\x1b[38;2;81;255;94m█\x1b[0m\x1b[38;2;81;255;114m█\x1b[0m\x1b[38;2;81;255;134m█\x1b[0m\x1b[38;2;81;255;154m█\x1b[0m\x1b[38;2;81;255;174m█\x1b[0m\x1b[38;2;81;255;194m█\x1b[0m\x1b[38;2;81;255;214m█\x1b[0m\x1b[38;2;81;255;234m█\x1b[0m\x1b[38;2;81;254;255m█\x1b[0m\x1b[38;2;81;234;255m█\x1b[0m\x1b[38;2;81;214;255m█\x1b[0m\x1b[38;2;81;194;255m█\x1b[0m\x1b[38;2;81;174;255m█\x1b[0m\x1b[38;2;81;154;255m█\x1b[0m\x1b[38;2;81;134;255m█\x1b[0m\x1b[38;2;81;114;255m█\x1b[0m\x1b[38;2;81;94;255m█\x1b[0m\x1b[38;2;88;81;255m█\x1b[0m\x1b[38;2;108;81;255m█\x1b[0m\x1b[38;2;128;81;255m█\x1b[0m\x1b[38;2;148;81;255m█\x1b[0m\x1b[38;2;168;81;255m█\x1b[0m\x1b[38;2;188;81;255m█\x1b[0m\x1b[38;2;208;81;255m█\x1b[0m\x1b[38;2;228;81;255m█\x1b[0m\x1b[38;2;248;81;255m█\x1b[0m\x1b[38;2;255;81;241m█\x1b[0m\x1b[38;2;255;81;221m█\x1b[0m\x1b[38;2;255;81;201m█\x1b[0m\x1b[38;2;255;81;181m█\x1b[0m\x1b[38;2;255;81;161m█\x1b[0m\x1b[38;2;255;81;141m█\x1b[0m\x1b[38;2;255;81;121m█\x1b[0m\x1b[38;2;255;81;101m█\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Styles \x1b[0m\x1b[1;31m \x1b[0mAll ansi styles: \x1b[1mbold\x1b[0m, \x1b[2mdim\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[4munderline\x1b[0m, \x1b[9mstrikethrough\x1b[0m, \x1b[7mreverse\x1b[0m, and even \n \x1b[5mblink\x1b[0m. \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Text \x1b[0m\x1b[1;31m \x1b[0mWord wrap text. Justify \x1b[32mleft\x1b[0m, \x1b[33mcenter\x1b[0m, \x1b[34mright\x1b[0m or \x1b[31mfull\x1b[0m. \n \n \x1b[32mLorem ipsum dolor \x1b[0m \x1b[33m Lorem ipsum dolor \x1b[0m \x1b[34m Lorem ipsum dolor\x1b[0m \x1b[31mLorem\x1b[0m\x1b[31m \x1b[0m\x1b[31mipsum\x1b[0m\x1b[31m \x1b[0m\x1b[31mdolor\x1b[0m\x1b[31m \x1b[0m\x1b[31msit\x1b[0m \n \x1b[32msit amet, \x1b[0m \x1b[33m sit amet, \x1b[0m \x1b[34m sit amet,\x1b[0m \x1b[31mamet,\x1b[0m\x1b[31m \x1b[0m\x1b[31mconsectetur\x1b[0m \n \x1b[32mconsectetur \x1b[0m \x1b[33m consectetur \x1b[0m \x1b[34m consectetur\x1b[0m \x1b[31madipiscing\x1b[0m\x1b[31m \x1b[0m\x1b[31melit.\x1b[0m \n \x1b[32madipiscing elit. \x1b[0m \x1b[33m adipiscing elit. \x1b[0m \x1b[34m adipiscing elit.\x1b[0m \x1b[31mQuisque\x1b[0m\x1b[31m \x1b[0m\x1b[31min\x1b[0m\x1b[31m \x1b[0m\x1b[31mmetus\x1b[0m\x1b[31m \x1b[0m\x1b[31msed\x1b[0m \n \x1b[32mQuisque in metus \x1b[0m \x1b[33mQuisque in metus sed\x1b[0m \x1b[34m Quisque in metus\x1b[0m \x1b[31msapien\x1b[0m\x1b[31m \x1b[0m\x1b[31multricies\x1b[0m \n \x1b[32msed sapien \x1b[0m \x1b[33m sapien ultricies \x1b[0m \x1b[34m sed sapien\x1b[0m \x1b[31mpretium\x1b[0m\x1b[31m \x1b[0m\x1b[31ma\x1b[0m\x1b[31m \x1b[0m\x1b[31mat\x1b[0m\x1b[31m \x1b[0m\x1b[31mjusto.\x1b[0m \n \x1b[32multricies pretium a\x1b[0m \x1b[33mpretium a at justo. \x1b[0m \x1b[34multricies pretium a\x1b[0m \x1b[31mMaecenas\x1b[0m\x1b[31m \x1b[0m\x1b[31mluctus\x1b[0m\x1b[31m \x1b[0m\x1b[31mvelit\x1b[0m \n \x1b[32mat justo. Maecenas \x1b[0m \x1b[33m Maecenas luctus \x1b[0m \x1b[34m at justo. Maecenas\x1b[0m \x1b[31met auctor maximus.\x1b[0m \n \x1b[32mluctus velit et \x1b[0m \x1b[33m velit et auctor \x1b[0m \x1b[34m luctus velit et\x1b[0m \n \x1b[32mauctor maximus. \x1b[0m \x1b[33m maximus. \x1b[0m \x1b[34m auctor maximus.\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31mAsian languages\x1b[0m\x1b[1;31m \x1b[0m🇨🇳 该库支持中文,日文和韩文文本! \n 🇯🇵 ライブラリは中国語、日本語、韓国語のテキストをサポートしています \n 🇰🇷 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31mConsole markup \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;35mRich\x1b[0m supports a simple \x1b[3mbbcode\x1b[0m like \x1b[1mmarkup\x1b[0m for \x1b[33mcolor\x1b[0m, \x1b[4mstyle\x1b[0m, and emoji! 👍 🍎 🐜 … \n 🥖 🚌 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Tables \x1b[0m\x1b[1;31m \x1b[0m\x1b[1m \x1b[0m\x1b[1;32mDate\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;34mTitle\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;36mProduction Budget\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[1;35mBox Office\x1b[0m\x1b[1m \x1b[0m \n ────────────────────────────────────────────────────────────────────────────────── \n \x1b[32m \x1b[0m\x1b[32mDec 20, 2019\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars: The Rise of \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $275,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[35m $375,126,118\x1b[0m\x1b[35m \x1b[0m \n \x1b[34m \x1b[0m\x1b[34mSkywalker \x1b[0m\x1b[34m \x1b[0m \n \x1b[2;32m \x1b[0m\x1b[2;32mMay 25, 2018\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[1;2;34mSolo\x1b[0m\x1b[2;34m: A Star Wars Story \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $275,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m $393,151,347\x1b[0m\x1b[2;35m \x1b[0m \n \x1b[32m \x1b[0m\x1b[32mDec 15, 2017\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars Ep. VIII: The Last\x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $262,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[1;35m$1,332,539,889\x1b[0m\x1b[35m \x1b[0m \n \x1b[34m \x1b[0m\x1b[34mJedi \x1b[0m\x1b[34m \x1b[0m \n \x1b[2;32m \x1b[0m\x1b[2;32mMay 19, 1999\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[2;34mStar Wars Ep. \x1b[0m\x1b[1;2;34mI\x1b[0m\x1b[2;34m: \x1b[0m\x1b[2;3;34mThe phantom\x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $115,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m$1,027,044,677\x1b[0m\x1b[2;35m \x1b[0m \n \x1b[2;34m \x1b[0m\x1b[2;3;34mMenace\x1b[0m\x1b[2;34m \x1b[0m\x1b[2;34m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Syntax \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 1 \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mdef\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34miter_last\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m \x1b[1m{\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m highlighting \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 2 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;230;219;116;48;2;39;40;34m\"\"\"Iterate and generate a tuple\x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'foo'\x1b[0m: \x1b[1m[\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m & \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 3 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1;34m3.1427\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;31m pretty \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 4 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mtry\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m(\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m printing \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 5 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mnext\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_\x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Paul Atriedies'\x1b[0m, \n \x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 6 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mexcept\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34mStopIteration\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Vladimir Harkonnen'\x1b[0m, \n \x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 7 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mreturn\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Thufir Haway'\x1b[0m \n \x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 8 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mfor\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34min\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m)\x1b[0m \n \x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 9 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mFalse\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m \x1b[2;32m│ \x1b[0m\x1b[1m]\x1b[0m, \n \x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m10 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'atomic'\x1b[0m: \x1b[1m(\x1b[0m\x1b[3;91mFalse\x1b[0m, \x1b[3;92mTrue\x1b[0m, \x1b[3;35mNone\x1b[0m\x1b[1m)\x1b[0m \n \x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m11 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mTrue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[1m}\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Markdown \x1b[0m\x1b[1;31m \x1b[0m\x1b[36m# Markdown\x1b[0m ╔══════════════════════════════════════╗ \n ║ \x1b[1mMarkdown\x1b[0m ║ \n \x1b[36mSupports much of the *markdown*, \x1b[0m ╚══════════════════════════════════════╝ \n \x1b[36m__syntax__!\x1b[0m \n Supports much of the \x1b[3mmarkdown\x1b[0m, \x1b[1msyntax\x1b[0m! \n \x1b[36m- Headers\x1b[0m \n \x1b[36m- Basic formatting: **bold**, *italic*, \x1b[0m \x1b[1;33m • \x1b[0mHeaders \n \x1b[36m`code`\x1b[0m \x1b[1;33m • \x1b[0mBasic formatting: \x1b[1mbold\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[97;40mcode\x1b[0m \n \x1b[36m- Block quotes\x1b[0m \x1b[1;33m • \x1b[0mBlock quotes \n \x1b[36m- Lists, and more...\x1b[0m \x1b[1;33m • \x1b[0mLists, and more... \n \x1b[36m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m And more \x1b[0m\x1b[1;31m \x1b[0mProgress bars, columns, styled logging handler, tracebacks, etc... \n\x1b[1;31m \x1b[0m \n" +expected = "\x1b[3m Rich features \x1b[0m\n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Colors \x1b[0m\x1b[1;31m \x1b[0m✓ \x1b[1;32m4-bit color\x1b[0m \x1b[38;2;86;0;0;48;2;51;0;0m▄\x1b[0m\x1b[38;2;86;9;0;48;2;51;5;0m▄\x1b[0m\x1b[38;2;86;18;0;48;2;51;11;0m▄\x1b[0m\x1b[38;2;86;28;0;48;2;51;16;0m▄\x1b[0m\x1b[38;2;86;37;0;48;2;51;22;0m▄\x1b[0m\x1b[38;2;86;47;0;48;2;51;27;0m▄\x1b[0m\x1b[38;2;86;56;0;48;2;51;33;0m▄\x1b[0m\x1b[38;2;86;66;0;48;2;51;38;0m▄\x1b[0m\x1b[38;2;86;75;0;48;2;51;44;0m▄\x1b[0m\x1b[38;2;86;85;0;48;2;51;50;0m▄\x1b[0m\x1b[38;2;78;86;0;48;2;46;51;0m▄\x1b[0m\x1b[38;2;69;86;0;48;2;40;51;0m▄\x1b[0m\x1b[38;2;59;86;0;48;2;35;51;0m▄\x1b[0m\x1b[38;2;50;86;0;48;2;29;51;0m▄\x1b[0m\x1b[38;2;40;86;0;48;2;24;51;0m▄\x1b[0m\x1b[38;2;31;86;0;48;2;18;51;0m▄\x1b[0m\x1b[38;2;22;86;0;48;2;12;51;0m▄\x1b[0m\x1b[38;2;12;86;0;48;2;7;51;0m▄\x1b[0m\x1b[38;2;3;86;0;48;2;1;51;0m▄\x1b[0m\x1b[38;2;0;86;6;48;2;0;51;3m▄\x1b[0m\x1b[38;2;0;86;15;48;2;0;51;9m▄\x1b[0m\x1b[38;2;0;86;25;48;2;0;51;14m▄\x1b[0m\x1b[38;2;0;86;34;48;2;0;51;20m▄\x1b[0m\x1b[38;2;0;86;44;48;2;0;51;25m▄\x1b[0m\x1b[38;2;0;86;53;48;2;0;51;31m▄\x1b[0m\x1b[38;2;0;86;63;48;2;0;51;37m▄\x1b[0m\x1b[38;2;0;86;72;48;2;0;51;42m▄\x1b[0m\x1b[38;2;0;86;81;48;2;0;51;48m▄\x1b[0m\x1b[38;2;0;81;86;48;2;0;48;51m▄\x1b[0m\x1b[38;2;0;72;86;48;2;0;42;51m▄\x1b[0m\x1b[38;2;0;63;86;48;2;0;37;51m▄\x1b[0m\x1b[38;2;0;53;86;48;2;0;31;51m▄\x1b[0m\x1b[38;2;0;44;86;48;2;0;25;51m▄\x1b[0m\x1b[38;2;0;34;86;48;2;0;20;51m▄\x1b[0m\x1b[38;2;0;25;86;48;2;0;14;51m▄\x1b[0m\x1b[38;2;0;15;86;48;2;0;9;51m▄\x1b[0m\x1b[38;2;0;6;86;48;2;0;3;51m▄\x1b[0m\x1b[38;2;3;0;86;48;2;1;0;51m▄\x1b[0m\x1b[38;2;12;0;86;48;2;7;0;51m▄\x1b[0m\x1b[38;2;22;0;86;48;2;12;0;51m▄\x1b[0m\x1b[38;2;31;0;86;48;2;18;0;51m▄\x1b[0m\x1b[38;2;40;0;86;48;2;24;0;51m▄\x1b[0m\x1b[38;2;50;0;86;48;2;29;0;51m▄\x1b[0m\x1b[38;2;59;0;86;48;2;35;0;51m▄\x1b[0m\x1b[38;2;69;0;86;48;2;40;0;51m▄\x1b[0m\x1b[38;2;78;0;86;48;2;46;0;51m▄\x1b[0m\x1b[38;2;86;0;85;48;2;51;0;50m▄\x1b[0m\x1b[38;2;86;0;75;48;2;51;0;44m▄\x1b[0m\x1b[38;2;86;0;66;48;2;51;0;38m▄\x1b[0m\x1b[38;2;86;0;56;48;2;51;0;33m▄\x1b[0m\x1b[38;2;86;0;47;48;2;51;0;27m▄\x1b[0m\x1b[38;2;86;0;37;48;2;51;0;22m▄\x1b[0m\x1b[38;2;86;0;28;48;2;51;0;16m▄\x1b[0m\x1b[38;2;86;0;18;48;2;51;0;11m▄\x1b[0m\x1b[38;2;86;0;9;48;2;51;0;5m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;34m8-bit color\x1b[0m \x1b[38;2;158;0;0;48;2;122;0;0m▄\x1b[0m\x1b[38;2;158;17;0;48;2;122;13;0m▄\x1b[0m\x1b[38;2;158;34;0;48;2;122;26;0m▄\x1b[0m\x1b[38;2;158;51;0;48;2;122;40;0m▄\x1b[0m\x1b[38;2;158;68;0;48;2;122;53;0m▄\x1b[0m\x1b[38;2;158;86;0;48;2;122;66;0m▄\x1b[0m\x1b[38;2;158;103;0;48;2;122;80;0m▄\x1b[0m\x1b[38;2;158;120;0;48;2;122;93;0m▄\x1b[0m\x1b[38;2;158;137;0;48;2;122;106;0m▄\x1b[0m\x1b[38;2;158;155;0;48;2;122;120;0m▄\x1b[0m\x1b[38;2;143;158;0;48;2;111;122;0m▄\x1b[0m\x1b[38;2;126;158;0;48;2;97;122;0m▄\x1b[0m\x1b[38;2;109;158;0;48;2;84;122;0m▄\x1b[0m\x1b[38;2;91;158;0;48;2;71;122;0m▄\x1b[0m\x1b[38;2;74;158;0;48;2;57;122;0m▄\x1b[0m\x1b[38;2;57;158;0;48;2;44;122;0m▄\x1b[0m\x1b[38;2;40;158;0;48;2;31;122;0m▄\x1b[0m\x1b[38;2;22;158;0;48;2;17;122;0m▄\x1b[0m\x1b[38;2;5;158;0;48;2;4;122;0m▄\x1b[0m\x1b[38;2;0;158;11;48;2;0;122;8m▄\x1b[0m\x1b[38;2;0;158;28;48;2;0;122;22m▄\x1b[0m\x1b[38;2;0;158;45;48;2;0;122;35m▄\x1b[0m\x1b[38;2;0;158;63;48;2;0;122;48m▄\x1b[0m\x1b[38;2;0;158;80;48;2;0;122;62m▄\x1b[0m\x1b[38;2;0;158;97;48;2;0;122;75m▄\x1b[0m\x1b[38;2;0;158;114;48;2;0;122;89m▄\x1b[0m\x1b[38;2;0;158;132;48;2;0;122;102m▄\x1b[0m\x1b[38;2;0;158;149;48;2;0;122;115m▄\x1b[0m\x1b[38;2;0;149;158;48;2;0;115;122m▄\x1b[0m\x1b[38;2;0;132;158;48;2;0;102;122m▄\x1b[0m\x1b[38;2;0;114;158;48;2;0;89;122m▄\x1b[0m\x1b[38;2;0;97;158;48;2;0;75;122m▄\x1b[0m\x1b[38;2;0;80;158;48;2;0;62;122m▄\x1b[0m\x1b[38;2;0;63;158;48;2;0;48;122m▄\x1b[0m\x1b[38;2;0;45;158;48;2;0;35;122m▄\x1b[0m\x1b[38;2;0;28;158;48;2;0;22;122m▄\x1b[0m\x1b[38;2;0;11;158;48;2;0;8;122m▄\x1b[0m\x1b[38;2;5;0;158;48;2;4;0;122m▄\x1b[0m\x1b[38;2;22;0;158;48;2;17;0;122m▄\x1b[0m\x1b[38;2;40;0;158;48;2;31;0;122m▄\x1b[0m\x1b[38;2;57;0;158;48;2;44;0;122m▄\x1b[0m\x1b[38;2;74;0;158;48;2;57;0;122m▄\x1b[0m\x1b[38;2;91;0;158;48;2;71;0;122m▄\x1b[0m\x1b[38;2;109;0;158;48;2;84;0;122m▄\x1b[0m\x1b[38;2;126;0;158;48;2;97;0;122m▄\x1b[0m\x1b[38;2;143;0;158;48;2;111;0;122m▄\x1b[0m\x1b[38;2;158;0;155;48;2;122;0;120m▄\x1b[0m\x1b[38;2;158;0;137;48;2;122;0;106m▄\x1b[0m\x1b[38;2;158;0;120;48;2;122;0;93m▄\x1b[0m\x1b[38;2;158;0;103;48;2;122;0;80m▄\x1b[0m\x1b[38;2;158;0;86;48;2;122;0;66m▄\x1b[0m\x1b[38;2;158;0;68;48;2;122;0;53m▄\x1b[0m\x1b[38;2;158;0;51;48;2;122;0;40m▄\x1b[0m\x1b[38;2;158;0;34;48;2;122;0;26m▄\x1b[0m\x1b[38;2;158;0;17;48;2;122;0;13m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;35mTruecolor (16.7 million)\x1b[0m \x1b[38;2;229;0;0;48;2;193;0;0m▄\x1b[0m\x1b[38;2;229;25;0;48;2;193;21;0m▄\x1b[0m\x1b[38;2;229;50;0;48;2;193;42;0m▄\x1b[0m\x1b[38;2;229;75;0;48;2;193;63;0m▄\x1b[0m\x1b[38;2;229;100;0;48;2;193;84;0m▄\x1b[0m\x1b[38;2;229;125;0;48;2;193;105;0m▄\x1b[0m\x1b[38;2;229;150;0;48;2;193;126;0m▄\x1b[0m\x1b[38;2;229;175;0;48;2;193;147;0m▄\x1b[0m\x1b[38;2;229;200;0;48;2;193;169;0m▄\x1b[0m\x1b[38;2;229;225;0;48;2;193;190;0m▄\x1b[0m\x1b[38;2;208;229;0;48;2;176;193;0m▄\x1b[0m\x1b[38;2;183;229;0;48;2;155;193;0m▄\x1b[0m\x1b[38;2;158;229;0;48;2;133;193;0m▄\x1b[0m\x1b[38;2;133;229;0;48;2;112;193;0m▄\x1b[0m\x1b[38;2;108;229;0;48;2;91;193;0m▄\x1b[0m\x1b[38;2;83;229;0;48;2;70;193;0m▄\x1b[0m\x1b[38;2;58;229;0;48;2;49;193;0m▄\x1b[0m\x1b[38;2;33;229;0;48;2;28;193;0m▄\x1b[0m\x1b[38;2;8;229;0;48;2;7;193;0m▄\x1b[0m\x1b[38;2;0;229;16;48;2;0;193;14m▄\x1b[0m\x1b[38;2;0;229;41;48;2;0;193;35m▄\x1b[0m\x1b[38;2;0;229;66;48;2;0;193;56m▄\x1b[0m\x1b[38;2;0;229;91;48;2;0;193;77m▄\x1b[0m\x1b[38;2;0;229;116;48;2;0;193;98m▄\x1b[0m\x1b[38;2;0;229;141;48;2;0;193;119m▄\x1b[0m\x1b[38;2;0;229;166;48;2;0;193;140m▄\x1b[0m\x1b[38;2;0;229;191;48;2;0;193;162m▄\x1b[0m\x1b[38;2;0;229;216;48;2;0;193;183m▄\x1b[0m\x1b[38;2;0;216;229;48;2;0;183;193m▄\x1b[0m\x1b[38;2;0;191;229;48;2;0;162;193m▄\x1b[0m\x1b[38;2;0;166;229;48;2;0;140;193m▄\x1b[0m\x1b[38;2;0;141;229;48;2;0;119;193m▄\x1b[0m\x1b[38;2;0;116;229;48;2;0;98;193m▄\x1b[0m\x1b[38;2;0;91;229;48;2;0;77;193m▄\x1b[0m\x1b[38;2;0;66;229;48;2;0;56;193m▄\x1b[0m\x1b[38;2;0;41;229;48;2;0;35;193m▄\x1b[0m\x1b[38;2;0;16;229;48;2;0;14;193m▄\x1b[0m\x1b[38;2;8;0;229;48;2;7;0;193m▄\x1b[0m\x1b[38;2;33;0;229;48;2;28;0;193m▄\x1b[0m\x1b[38;2;58;0;229;48;2;49;0;193m▄\x1b[0m\x1b[38;2;83;0;229;48;2;70;0;193m▄\x1b[0m\x1b[38;2;108;0;229;48;2;91;0;193m▄\x1b[0m\x1b[38;2;133;0;229;48;2;112;0;193m▄\x1b[0m\x1b[38;2;158;0;229;48;2;133;0;193m▄\x1b[0m\x1b[38;2;183;0;229;48;2;155;0;193m▄\x1b[0m\x1b[38;2;208;0;229;48;2;176;0;193m▄\x1b[0m\x1b[38;2;229;0;225;48;2;193;0;190m▄\x1b[0m\x1b[38;2;229;0;200;48;2;193;0;169m▄\x1b[0m\x1b[38;2;229;0;175;48;2;193;0;147m▄\x1b[0m\x1b[38;2;229;0;150;48;2;193;0;126m▄\x1b[0m\x1b[38;2;229;0;125;48;2;193;0;105m▄\x1b[0m\x1b[38;2;229;0;100;48;2;193;0;84m▄\x1b[0m\x1b[38;2;229;0;75;48;2;193;0;63m▄\x1b[0m\x1b[38;2;229;0;50;48;2;193;0;42m▄\x1b[0m\x1b[38;2;229;0;25;48;2;193;0;21m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;33mDumb terminals\x1b[0m \x1b[38;2;254;45;45;48;2;255;10;10m▄\x1b[0m\x1b[38;2;254;68;45;48;2;255;36;10m▄\x1b[0m\x1b[38;2;254;91;45;48;2;255;63;10m▄\x1b[0m\x1b[38;2;254;114;45;48;2;255;90;10m▄\x1b[0m\x1b[38;2;254;137;45;48;2;255;117;10m▄\x1b[0m\x1b[38;2;254;159;45;48;2;255;143;10m▄\x1b[0m\x1b[38;2;254;182;45;48;2;255;170;10m▄\x1b[0m\x1b[38;2;254;205;45;48;2;255;197;10m▄\x1b[0m\x1b[38;2;254;228;45;48;2;255;223;10m▄\x1b[0m\x1b[38;2;254;251;45;48;2;255;250;10m▄\x1b[0m\x1b[38;2;235;254;45;48;2;232;255;10m▄\x1b[0m\x1b[38;2;213;254;45;48;2;206;255;10m▄\x1b[0m\x1b[38;2;190;254;45;48;2;179;255;10m▄\x1b[0m\x1b[38;2;167;254;45;48;2;152;255;10m▄\x1b[0m\x1b[38;2;144;254;45;48;2;125;255;10m▄\x1b[0m\x1b[38;2;121;254;45;48;2;99;255;10m▄\x1b[0m\x1b[38;2;99;254;45;48;2;72;255;10m▄\x1b[0m\x1b[38;2;76;254;45;48;2;45;255;10m▄\x1b[0m\x1b[38;2;53;254;45;48;2;19;255;10m▄\x1b[0m\x1b[38;2;45;254;61;48;2;10;255;28m▄\x1b[0m\x1b[38;2;45;254;83;48;2;10;255;54m▄\x1b[0m\x1b[38;2;45;254;106;48;2;10;255;81m▄\x1b[0m\x1b[38;2;45;254;129;48;2;10;255;108m▄\x1b[0m\x1b[38;2;45;254;152;48;2;10;255;134m▄\x1b[0m\x1b[38;2;45;254;175;48;2;10;255;161m▄\x1b[0m\x1b[38;2;45;254;197;48;2;10;255;188m▄\x1b[0m\x1b[38;2;45;254;220;48;2;10;255;214m▄\x1b[0m\x1b[38;2;45;254;243;48;2;10;255;241m▄\x1b[0m\x1b[38;2;45;243;254;48;2;10;241;255m▄\x1b[0m\x1b[38;2;45;220;254;48;2;10;214;255m▄\x1b[0m\x1b[38;2;45;197;254;48;2;10;188;255m▄\x1b[0m\x1b[38;2;45;175;254;48;2;10;161;255m▄\x1b[0m\x1b[38;2;45;152;254;48;2;10;134;255m▄\x1b[0m\x1b[38;2;45;129;254;48;2;10;108;255m▄\x1b[0m\x1b[38;2;45;106;254;48;2;10;81;255m▄\x1b[0m\x1b[38;2;45;83;254;48;2;10;54;255m▄\x1b[0m\x1b[38;2;45;61;254;48;2;10;28;255m▄\x1b[0m\x1b[38;2;53;45;254;48;2;19;10;255m▄\x1b[0m\x1b[38;2;76;45;254;48;2;45;10;255m▄\x1b[0m\x1b[38;2;99;45;254;48;2;72;10;255m▄\x1b[0m\x1b[38;2;121;45;254;48;2;99;10;255m▄\x1b[0m\x1b[38;2;144;45;254;48;2;125;10;255m▄\x1b[0m\x1b[38;2;167;45;254;48;2;152;10;255m▄\x1b[0m\x1b[38;2;190;45;254;48;2;179;10;255m▄\x1b[0m\x1b[38;2;213;45;254;48;2;206;10;255m▄\x1b[0m\x1b[38;2;235;45;254;48;2;232;10;255m▄\x1b[0m\x1b[38;2;254;45;251;48;2;255;10;250m▄\x1b[0m\x1b[38;2;254;45;228;48;2;255;10;223m▄\x1b[0m\x1b[38;2;254;45;205;48;2;255;10;197m▄\x1b[0m\x1b[38;2;254;45;182;48;2;255;10;170m▄\x1b[0m\x1b[38;2;254;45;159;48;2;255;10;143m▄\x1b[0m\x1b[38;2;254;45;137;48;2;255;10;117m▄\x1b[0m\x1b[38;2;254;45;114;48;2;255;10;90m▄\x1b[0m\x1b[38;2;254;45;91;48;2;255;10;63m▄\x1b[0m\x1b[38;2;254;45;68;48;2;255;10;36m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;36mAutomatic color conversion\x1b[0m \x1b[38;2;255;117;117;48;2;255;81;81m▄\x1b[0m\x1b[38;2;255;132;117;48;2;255;100;81m▄\x1b[0m\x1b[38;2;255;147;117;48;2;255;119;81m▄\x1b[0m\x1b[38;2;255;162;117;48;2;255;138;81m▄\x1b[0m\x1b[38;2;255;177;117;48;2;255;157;81m▄\x1b[0m\x1b[38;2;255;192;117;48;2;255;176;81m▄\x1b[0m\x1b[38;2;255;207;117;48;2;255;195;81m▄\x1b[0m\x1b[38;2;255;222;117;48;2;255;214;81m▄\x1b[0m\x1b[38;2;255;237;117;48;2;255;232;81m▄\x1b[0m\x1b[38;2;255;252;117;48;2;255;251;81m▄\x1b[0m\x1b[38;2;242;255;117;48;2;239;255;81m▄\x1b[0m\x1b[38;2;227;255;117;48;2;220;255;81m▄\x1b[0m\x1b[38;2;212;255;117;48;2;201;255;81m▄\x1b[0m\x1b[38;2;197;255;117;48;2;182;255;81m▄\x1b[0m\x1b[38;2;182;255;117;48;2;163;255;81m▄\x1b[0m\x1b[38;2;167;255;117;48;2;144;255;81m▄\x1b[0m\x1b[38;2;152;255;117;48;2;125;255;81m▄\x1b[0m\x1b[38;2;137;255;117;48;2;106;255;81m▄\x1b[0m\x1b[38;2;122;255;117;48;2;87;255;81m▄\x1b[0m\x1b[38;2;117;255;127;48;2;81;255;94m▄\x1b[0m\x1b[38;2;117;255;142;48;2;81;255;113m▄\x1b[0m\x1b[38;2;117;255;157;48;2;81;255;132m▄\x1b[0m\x1b[38;2;117;255;172;48;2;81;255;150m▄\x1b[0m\x1b[38;2;117;255;187;48;2;81;255;169m▄\x1b[0m\x1b[38;2;117;255;202;48;2;81;255;188m▄\x1b[0m\x1b[38;2;117;255;217;48;2;81;255;207m▄\x1b[0m\x1b[38;2;117;255;232;48;2;81;255;226m▄\x1b[0m\x1b[38;2;117;255;247;48;2;81;255;245m▄\x1b[0m\x1b[38;2;117;247;255;48;2;81;245;255m▄\x1b[0m\x1b[38;2;117;232;255;48;2;81;226;255m▄\x1b[0m\x1b[38;2;117;217;255;48;2;81;207;255m▄\x1b[0m\x1b[38;2;117;202;255;48;2;81;188;255m▄\x1b[0m\x1b[38;2;117;187;255;48;2;81;169;255m▄\x1b[0m\x1b[38;2;117;172;255;48;2;81;150;255m▄\x1b[0m\x1b[38;2;117;157;255;48;2;81;132;255m▄\x1b[0m\x1b[38;2;117;142;255;48;2;81;113;255m▄\x1b[0m\x1b[38;2;117;127;255;48;2;81;94;255m▄\x1b[0m\x1b[38;2;122;117;255;48;2;87;81;255m▄\x1b[0m\x1b[38;2;137;117;255;48;2;106;81;255m▄\x1b[0m\x1b[38;2;152;117;255;48;2;125;81;255m▄\x1b[0m\x1b[38;2;167;117;255;48;2;144;81;255m▄\x1b[0m\x1b[38;2;182;117;255;48;2;163;81;255m▄\x1b[0m\x1b[38;2;197;117;255;48;2;182;81;255m▄\x1b[0m\x1b[38;2;212;117;255;48;2;201;81;255m▄\x1b[0m\x1b[38;2;227;117;255;48;2;220;81;255m▄\x1b[0m\x1b[38;2;242;117;255;48;2;239;81;255m▄\x1b[0m\x1b[38;2;255;117;252;48;2;255;81;251m▄\x1b[0m\x1b[38;2;255;117;237;48;2;255;81;232m▄\x1b[0m\x1b[38;2;255;117;222;48;2;255;81;214m▄\x1b[0m\x1b[38;2;255;117;207;48;2;255;81;195m▄\x1b[0m\x1b[38;2;255;117;192;48;2;255;81;176m▄\x1b[0m\x1b[38;2;255;117;177;48;2;255;81;157m▄\x1b[0m\x1b[38;2;255;117;162;48;2;255;81;138m▄\x1b[0m\x1b[38;2;255;117;147;48;2;255;81;119m▄\x1b[0m\x1b[38;2;255;117;132;48;2;255;81;100m▄\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Styles \x1b[0m\x1b[1;31m \x1b[0mAll ansi styles: \x1b[1mbold\x1b[0m, \x1b[2mdim\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[4munderline\x1b[0m, \x1b[9mstrikethrough\x1b[0m, \x1b[7mreverse\x1b[0m, and even \n\x1b[1;31m \x1b[0m\x1b[5mblink\x1b[0m. \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Text \x1b[0m\x1b[1;31m \x1b[0mWord wrap text. Justify \x1b[32mleft\x1b[0m, \x1b[33mcenter\x1b[0m, \x1b[34mright\x1b[0m or \x1b[31mfull\x1b[0m. \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mLorem ipsum dolor \x1b[0m \x1b[33m Lorem ipsum dolor \x1b[0m \x1b[34m Lorem ipsum dolor\x1b[0m \x1b[31mLorem\x1b[0m\x1b[31m \x1b[0m\x1b[31mipsum\x1b[0m\x1b[31m \x1b[0m\x1b[31mdolor\x1b[0m\x1b[31m \x1b[0m\x1b[31msit\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32msit amet, \x1b[0m \x1b[33m sit amet, \x1b[0m \x1b[34m sit amet,\x1b[0m \x1b[31mamet,\x1b[0m\x1b[31m \x1b[0m\x1b[31mconsectetur\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mconsectetur \x1b[0m \x1b[33m consectetur \x1b[0m \x1b[34m consectetur\x1b[0m \x1b[31madipiscing\x1b[0m\x1b[31m \x1b[0m\x1b[31melit.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32madipiscing elit. \x1b[0m \x1b[33m adipiscing elit. \x1b[0m \x1b[34m adipiscing elit.\x1b[0m \x1b[31mQuisque\x1b[0m\x1b[31m \x1b[0m\x1b[31min\x1b[0m\x1b[31m \x1b[0m\x1b[31mmetus\x1b[0m\x1b[31m \x1b[0m\x1b[31msed\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mQuisque in metus sed\x1b[0m \x1b[33mQuisque in metus sed\x1b[0m \x1b[34mQuisque in metus sed\x1b[0m \x1b[31msapien\x1b[0m\x1b[31m \x1b[0m\x1b[31multricies\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32msapien ultricies \x1b[0m \x1b[33m sapien ultricies \x1b[0m \x1b[34m sapien ultricies\x1b[0m \x1b[31mpretium\x1b[0m\x1b[31m \x1b[0m\x1b[31ma\x1b[0m\x1b[31m \x1b[0m\x1b[31mat\x1b[0m\x1b[31m \x1b[0m\x1b[31mjusto.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mpretium a at justo. \x1b[0m \x1b[33mpretium a at justo. \x1b[0m \x1b[34m pretium a at justo.\x1b[0m \x1b[31mMaecenas\x1b[0m\x1b[31m \x1b[0m\x1b[31mluctus\x1b[0m\x1b[31m \x1b[0m\x1b[31mvelit\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mMaecenas luctus \x1b[0m \x1b[33m Maecenas luctus \x1b[0m \x1b[34m Maecenas luctus\x1b[0m \x1b[31met auctor maximus.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mvelit et auctor \x1b[0m \x1b[33m velit et auctor \x1b[0m \x1b[34m velit et auctor\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mmaximus. \x1b[0m \x1b[33m maximus. \x1b[0m \x1b[34m maximus.\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Asian \x1b[0m\x1b[1;31m \x1b[0m🇨🇳 该库支持中文,日文和韩文文本! \n\x1b[1;31m \x1b[0m\x1b[1;31m language \x1b[0m\x1b[1;31m \x1b[0m🇯🇵 ライブラリは中国語、日本語、韓国語のテキストをサポートしています \n\x1b[1;31m \x1b[0m\x1b[1;31m support \x1b[0m\x1b[1;31m \x1b[0m🇰🇷 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Markup \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;35mRich\x1b[0m supports a simple \x1b[3mbbcode\x1b[0m-like \x1b[1mmarkup\x1b[0m for \x1b[33mcolor\x1b[0m, \x1b[4mstyle\x1b[0m, and emoji! 👍 🍎 🐜 🐻 … \n\x1b[1;31m \x1b[0m🚌 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Tables \x1b[0m\x1b[1;31m \x1b[0m\x1b[1m \x1b[0m\x1b[1;32mDate\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;34mTitle\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;36mProduction Budget\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[1;35mBox Office\x1b[0m\x1b[1m \x1b[0m \n\x1b[1;31m \x1b[0m───────────────────────────────────────────────────────────────────────────────────── \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m\x1b[32mDec 20, 2019\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars: The Rise of \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $275,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[35m $375,126,118\x1b[0m\x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mSkywalker \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m \x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m\x1b[2;32mMay 25, 2018\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[1;2;34mSolo\x1b[0m\x1b[2;34m: A Star Wars Story \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $275,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m $393,151,347\x1b[0m\x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m\x1b[32mDec 15, 2017\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars Ep. VIII: The Last \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $262,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[1;35m$1,332,539,889\x1b[0m\x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mJedi \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m \x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m\x1b[2;32mMay 19, 1999\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[2;34mStar Wars Ep. \x1b[0m\x1b[1;2;34mI\x1b[0m\x1b[2;34m: \x1b[0m\x1b[2;3;34mThe phantom \x1b[0m\x1b[2;34m \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $115,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m$1,027,044,677\x1b[0m\x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[2;3;34mMenace\x1b[0m\x1b[2;34m \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Syntax \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 1 \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mdef\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34miter_last\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m-\x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m>\x1b[0m \x1b[1m{\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31mhighlighting\x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 2 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;230;219;116;48;2;39;40;34m\"\"\"Iterate and generate a tuple w\x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'foo'\x1b[0m: \x1b[1m[\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m & \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 3 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1;36m3.1427\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;31m pretty \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 4 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mtry\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m(\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m printing \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 5 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mnext\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_va\x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Paul Atreides'\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 6 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mexcept\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34mStopIteration\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Vladimir Harkonnen'\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 7 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mreturn\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Thufir Hawat'\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 8 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mfor\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34min\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m)\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 9 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mFalse\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ \x1b[0m\x1b[1m]\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m10 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'atomic'\x1b[0m: \x1b[1m(\x1b[0m\x1b[3;91mFalse\x1b[0m, \x1b[3;92mTrue\x1b[0m, \x1b[3;35mNone\x1b[0m\x1b[1m)\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m11 \x1b[0m\x1b[2;38;2;117;113;94;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mTrue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[1m}\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Markdown \x1b[0m\x1b[1;31m \x1b[0m\x1b[36m# Markdown\x1b[0m ╔═══════════════════════════════════════╗ \n\x1b[1;31m \x1b[0m ║ \x1b[1mMarkdown\x1b[0m ║ \n\x1b[1;31m \x1b[0m\x1b[36mSupports much of the *markdown* \x1b[0m ╚═══════════════════════════════════════╝ \n\x1b[1;31m \x1b[0m\x1b[36m__syntax__!\x1b[0m \n\x1b[1;31m \x1b[0m Supports much of the \x1b[3mmarkdown\x1b[0m \x1b[1msyntax\x1b[0m! \n\x1b[1;31m \x1b[0m\x1b[36m- Headers\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36m- Basic formatting: **bold**, *italic*, \x1b[0m \x1b[1;33m • \x1b[0mHeaders \n\x1b[1;31m \x1b[0m\x1b[36m`code`\x1b[0m \x1b[1;33m • \x1b[0mBasic formatting: \x1b[1mbold\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[97;40mcode\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36m- Block quotes\x1b[0m \x1b[1;33m • \x1b[0mBlock quotes \n\x1b[1;31m \x1b[0m\x1b[36m- Lists, and more...\x1b[0m \x1b[1;33m • \x1b[0mLists, and more... \n\x1b[1;31m \x1b[0m\x1b[36m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m +more! \x1b[0m\x1b[1;31m \x1b[0mProgress bars, columns, styled logging handler, tracebacks, etc... \n\x1b[1;31m \x1b[0m \n" diff --git a/tests/test_align.py b/tests/test_align.py index 3faec95e3a..5f67dcbc77 100644 --- a/tests/test_align.py +++ b/tests/test_align.py @@ -3,7 +3,7 @@ import pytest from rich.console import Console -from rich.align import Align +from rich.align import Align, VerticalCenter from rich.measure import Measurement @@ -23,6 +23,14 @@ def test_bad_align_legal(): Align("foo", "") with pytest.raises(ValueError): Align("foo", "LEFT") + with pytest.raises(ValueError): + Align("foo", vertical="somewhere") + + +def test_repr(): + repr(Align("foo", "left")) + repr(Align("foo", "center")) + repr(Align("foo", "right")) def test_align_left(): @@ -43,6 +51,42 @@ def test_align_right(): assert console.file.getvalue() == " foo\n" +def test_align_top(): + console = Console(file=io.StringIO(), width=10) + console.print(Align("foo", vertical="top"), height=5) + expected = "foo \n \n \n \n \n" + result = console.file.getvalue() + print(repr(result)) + assert result == expected + + +def test_align_middle(): + console = Console(file=io.StringIO(), width=10) + console.print(Align("foo", vertical="middle"), height=5) + expected = " \n \nfoo \n \n \n" + result = console.file.getvalue() + print(repr(result)) + assert result == expected + + +def test_align_bottom(): + console = Console(file=io.StringIO(), width=10) + console.print(Align("foo", vertical="bottom"), height=5) + expected = " \n \n \n \nfoo \n" + result = console.file.getvalue() + print(repr(result)) + assert result == expected + + +def test_align_center_middle(): + console = Console(file=io.StringIO(), width=10) + console.print(Align("foo\nbar", "center", vertical="middle"), height=5) + expected = " \n foo \n bar \n \n \n" + result = console.file.getvalue() + print(repr(result)) + assert result == expected + + def test_align_fit(): console = Console(file=io.StringIO(), width=10) console.print(Align("foobarbaze", "center")) @@ -51,7 +95,11 @@ def test_align_fit(): def test_align_right_style(): console = Console( - file=io.StringIO(), width=10, color_system="truecolor", force_terminal=True + file=io.StringIO(), + width=10, + color_system="truecolor", + force_terminal=True, + _environ={}, ) console.print(Align("foo", "right", style="on blue")) assert console.file.getvalue() == "\x1b[44m \x1b[0m\x1b[44mfoo\x1b[0m\n" @@ -59,7 +107,7 @@ def test_align_right_style(): def test_measure(): console = Console(file=io.StringIO(), width=20) - _min, _max = Measurement.get(console, Align("foo bar", "left"), 20) + _min, _max = Measurement.get(console, console.options, Align("foo bar", "left")) assert _min == 3 assert _max == 7 @@ -87,3 +135,18 @@ def test_shortcuts(): assert Align.right("foo").renderable == "foo" assert Align.center("foo").align == "center" assert Align.center("foo").renderable == "foo" + + +def test_vertical_center(): + console = Console(color_system=None, height=6) + console.begin_capture() + vertical_center = VerticalCenter("foo") + repr(vertical_center) + console.print(vertical_center) + result = console.end_capture() + print(repr(result)) + expected = " \n \nfoo\n \n \n \n" + assert result == expected + assert Measurement.get(console, console.options, vertical_center) == Measurement( + 3, 3 + ) diff --git a/tests/test_ansi.py b/tests/test_ansi.py index 898286cfab..1a21765c24 100644 --- a/tests/test_ansi.py +++ b/tests/test_ansi.py @@ -1,5 +1,3 @@ -import io - from rich.ansi import AnsiDecoder from rich.console import Console from rich.style import Style @@ -30,3 +28,20 @@ def test_decode(): ] assert lines == expected + + +def test_decode_example(): + ansi_bytes = b"\x1b[01m\x1b[KC:\\Users\\stefa\\AppData\\Local\\Temp\\tmp3ydingba:\x1b[m\x1b[K In function '\x1b[01m\x1b[Kmain\x1b[m\x1b[K':\n\x1b[01m\x1b[KC:\\Users\\stefa\\AppData\\Local\\Temp\\tmp3ydingba:3:5:\x1b[m\x1b[K \x1b[01;35m\x1b[Kwarning: \x1b[m\x1b[Kunused variable '\x1b[01m\x1b[Ka\x1b[m\x1b[K' [\x1b[01;35m\x1b[K-Wunused-variable\x1b[m\x1b[K]\n 3 | int \x1b[01;35m\x1b[Ka\x1b[m\x1b[K=1;\n | \x1b[01;35m\x1b[K^\x1b[m\x1b[K\n" + ansi_text = ansi_bytes.decode("utf-8") + + text = Text.from_ansi(ansi_text) + + console = Console( + force_terminal=True, legacy_windows=False, color_system="truecolor" + ) + with console.capture() as capture: + console.print(text) + result = capture.get() + print(repr(result)) + expected = "\x1b[1mC:\\Users\\stefa\\AppData\\Local\\Temp\\tmp3ydingba:\x1b[0m In function '\x1b[1mmain\x1b[0m':\n\x1b[1mC:\\Users\\stefa\\AppData\\Local\\Temp\\tmp3ydingba:3:5:\x1b[0m \x1b[1;35mwarning: \x1b[0munused variable '\x1b[1ma\x1b[0m' \n[\x1b[1;35m-Wunused-variable\x1b[0m]\n 3 | int \x1b[1;35ma\x1b[0m=1;\n | \x1b[1;35m^\x1b[0m\n" + assert result == expected diff --git a/tests/test_bar.py b/tests/test_bar.py index 976a10b083..021a8aaac1 100644 --- a/tests/test_bar.py +++ b/tests/test_bar.py @@ -1,3 +1,4 @@ +from rich.console import Console from rich.progress_bar import ProgressBar from rich.segment import Segment from rich.style import Style @@ -39,8 +40,9 @@ def test_render(): def test_measure(): + console = Console(width=120) bar = ProgressBar() - measurement = bar.__rich_measure__(None, 120) + measurement = bar.__rich_measure__(console, console.options) assert measurement.minimum == 4 assert measurement.maximum == 120 @@ -62,30 +64,30 @@ def test_pulse(): def test_get_pulse_segments(): bar = ProgressBar() segments = bar._get_pulse_segments( - Style.parse("red"), Style.parse("yellow"), "standard", False + Style.parse("red"), Style.parse("yellow"), None, False, False ) print(repr(segments)) expected = [ - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("red"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), - Segment("━", Style.parse("yellow"), False), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("red")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), + Segment("━", Style.parse("yellow")), ] assert segments == expected diff --git a/tests/test_block_bar.py b/tests/test_block_bar.py index 973b9e85e9..665987634d 100644 --- a/tests/test_block_bar.py +++ b/tests/test_block_bar.py @@ -1,4 +1,5 @@ from rich.bar import Bar +from rich.console import Console from .render import render @@ -29,8 +30,9 @@ def test_render(): def test_measure(): + console = Console(width=120) bar = Bar(size=100, begin=11, end=62) - measurement = bar.__rich_measure__(None, 120) + measurement = bar.__rich_measure__(console, console.options) assert measurement.minimum == 4 assert measurement.maximum == 120 diff --git a/tests/test_box.py b/tests/test_box.py index 0e4c7f1d08..21ba4fd0fe 100644 --- a/tests/test_box.py +++ b/tests/test_box.py @@ -1,6 +1,6 @@ import pytest -from rich.console import ConsoleOptions +from rich.console import ConsoleOptions, ConsoleDimensions from rich.box import ASCII, DOUBLE, ROUNDED, HEAVY, SQUARE @@ -38,11 +38,13 @@ def test_get_bottom(): def test_box_substitute(): options = ConsoleOptions( + ConsoleDimensions(80, 25), legacy_windows=True, min_width=1, max_width=100, is_terminal=True, encoding="utf-8", + max_height=25, ) assert HEAVY.substitute(options) == SQUARE diff --git a/tests/test_cells.py b/tests/test_cells.py index 06de437202..d64317f3ba 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -2,6 +2,10 @@ def test_set_cell_size(): + assert cells.set_cell_size("foo", 0) == "" + assert cells.set_cell_size("f", 0) == "" + assert cells.set_cell_size("", 0) == "" + assert cells.set_cell_size("😽😽", 0) == "" assert cells.set_cell_size("foo", 2) == "fo" assert cells.set_cell_size("foo", 3) == "foo" assert cells.set_cell_size("foo", 4) == "foo " @@ -9,3 +13,16 @@ def test_set_cell_size(): assert cells.set_cell_size("😽😽", 3) == "😽 " assert cells.set_cell_size("😽😽", 2) == "😽" assert cells.set_cell_size("😽😽", 1) == " " + assert cells.set_cell_size("😽😽", 5) == "😽😽 " + + +def test_set_cell_size_infinite(): + for size in range(38): + assert ( + cells.cell_len( + cells.set_cell_size( + "เป็นเกมที่ต้องมีความอดทนมากที่สุดตั้งเเต่เคยเล่นมา", size + ) + ) + == size + ) diff --git a/tests/test_color.py b/tests/test_color.py index 97ef6a307a..796f019838 100644 --- a/tests/test_color.py +++ b/tests/test_color.py @@ -7,18 +7,32 @@ ColorType, ColorTriplet, ) - -from rich import terminal_theme +from rich.style import Style +from rich.text import Text, Span import pytest def test_str() -> None: - assert str(Color.parse("red")) == "\x1b[31m⬤ \x1b[0m" + assert str(Color.parse("red")) == "Color('red', ColorType.STANDARD, number=1)" def test_repr() -> None: - assert repr(Color.parse("red")) == "" + assert repr(Color.parse("red")) == "Color('red', ColorType.STANDARD, number=1)" + + +def test_color_system_repr() -> None: + assert repr(ColorSystem.EIGHT_BIT) == "ColorSystem.EIGHT_BIT" + + +def test_rich() -> None: + color = Color.parse("red") + as_text = color.__rich__() + print(repr(as_text)) + print(repr(as_text.spans)) + assert as_text == Text( + "", spans=[Span(23, 24, Style(color=color))] + ) def test_system() -> None: @@ -41,7 +55,7 @@ def test_truecolor() -> None: 255, 255, 255 ) assert Color("red", ColorType.WINDOWS, number=1).get_truecolor() == ColorTriplet( - 170, 0, 0 + 197, 15, 31 ) @@ -148,7 +162,7 @@ def test_downgrade() -> None: ) assert Color.parse("bright_red").downgrade(ColorSystem.WINDOWS) == Color( - "bright_red", ColorType.WINDOWS, 1, None + "bright_red", ColorType.WINDOWS, 9, None ) assert Color.parse("#ff0000").downgrade(ColorSystem.WINDOWS) == Color( @@ -156,7 +170,7 @@ def test_downgrade() -> None: ) assert Color.parse("color(255)").downgrade(ColorSystem.WINDOWS) == Color( - "color(255)", ColorType.WINDOWS, 7, None + "color(255)", ColorType.WINDOWS, 15, None ) assert Color.parse("#00ff00").downgrade(ColorSystem.STANDARD) == Color( diff --git a/tests/test_columns.py b/tests/test_columns.py index 927aba2116..1b167f4acb 100644 --- a/tests/test_columns.py +++ b/tests/test_columns.py @@ -41,7 +41,7 @@ def render(): console.rule("optimal, expand") columns.expand = True console.print(columns) - console.rule("columm first, optimal") + console.rule("column first, optimal") columns.column_first = True columns.expand = False console.print(columns) @@ -62,7 +62,7 @@ def render(): def test_render(): - expected = "────────────────────────────────────────────── empty ───────────────────────────────────────────────\n───────────────────────────────────────────── optimal ──────────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n───────────────────────────────────────── optimal, expand ──────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n────────────────────────────────────── columm first, optimal ───────────────────────────────────────\nUrsus americanus American marten Scolopax minor Ant \nAmerican buffalo Martes americana Anaconda (unidentified) Anteater, australian spiny\nBison bison American racer Eunectes sp. Tachyglossus aculeatus \nAmerican crow Coluber constrictor Andean goose Anteater, giant \nCorvus brachyrhynchos American woodcock Chloephaga melanoptera Myrmecophaga tridactyla \n─────────────────────────────────── column first, right to left ────────────────────────────────────\nAnt Scolopax minor American marten Ursus americanus \nAnteater, australian spiny Anaconda (unidentified) Martes americana American buffalo \nTachyglossus aculeatus Eunectes sp. American racer Bison bison \nAnteater, giant Andean goose Coluber constrictor American crow \nMyrmecophaga tridactyla Chloephaga melanoptera American woodcock Corvus brachyrhynchos\n────────────────────────────────────── equal columns, expand ───────────────────────────────────────\nChloephaga melanoptera American racer Ursus americanus \nAnt Coluber constrictor American buffalo \nAnteater, australian spiny American woodcock Bison bison \nTachyglossus aculeatus Scolopax minor American crow \nAnteater, giant Anaconda (unidentified) Corvus brachyrhynchos \nMyrmecophaga tridactyla Eunectes sp. American marten \n Andean goose Martes americana \n─────────────────────────────────────────── fixed width ────────────────────────────────────────────\nAnteater, Eunectes sp. Coluber Corvus Ursus americanus \naustralian spiny constrictor brachyrhynchos \nTachyglossus Andean goose American American marten American buffalo \naculeatus woodcock \nAnteater, giant Chloephaga Scolopax minor Martes americana Bison bison \n melanoptera \nMyrmecophaga Ant Anaconda American racer American crow \ntridactyla (unidentified) \n\n" + expected = "────────────────────────────────────────────── empty ───────────────────────────────────────────────\n───────────────────────────────────────────── optimal ──────────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n───────────────────────────────────────── optimal, expand ──────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n────────────────────────────────────── column first, optimal ───────────────────────────────────────\nUrsus americanus American marten Scolopax minor Ant \nAmerican buffalo Martes americana Anaconda (unidentified) Anteater, australian spiny\nBison bison American racer Eunectes sp. Tachyglossus aculeatus \nAmerican crow Coluber constrictor Andean goose Anteater, giant \nCorvus brachyrhynchos American woodcock Chloephaga melanoptera Myrmecophaga tridactyla \n─────────────────────────────────── column first, right to left ────────────────────────────────────\nAnt Scolopax minor American marten Ursus americanus \nAnteater, australian spiny Anaconda (unidentified) Martes americana American buffalo \nTachyglossus aculeatus Eunectes sp. American racer Bison bison \nAnteater, giant Andean goose Coluber constrictor American crow \nMyrmecophaga tridactyla Chloephaga melanoptera American woodcock Corvus brachyrhynchos\n────────────────────────────────────── equal columns, expand ───────────────────────────────────────\nChloephaga melanoptera American racer Ursus americanus \nAnt Coluber constrictor American buffalo \nAnteater, australian spiny American woodcock Bison bison \nTachyglossus aculeatus Scolopax minor American crow \nAnteater, giant Anaconda (unidentified) Corvus brachyrhynchos \nMyrmecophaga tridactyla Eunectes sp. American marten \n Andean goose Martes americana \n─────────────────────────────────────────── fixed width ────────────────────────────────────────────\nAnteater, Eunectes sp. Coluber Corvus Ursus americanus \naustralian spiny constrictor brachyrhynchos \nTachyglossus Andean goose American American marten American buffalo \naculeatus woodcock \nAnteater, giant Chloephaga Scolopax minor Martes americana Bison bison \n melanoptera \nMyrmecophaga Ant Anaconda American racer American crow \ntridactyla (unidentified) \n\n" assert render() == expected diff --git a/tests/test_console.py b/tests/test_console.py index 07943700ea..007cd28103 100644 --- a/tests/test_console.py +++ b/tests/test_console.py @@ -3,21 +3,35 @@ import os import sys import tempfile -from typing import Optional +from typing import Optional, Tuple, Type, Union +from unittest import mock import pytest from rich import errors from rich.color import ColorSystem -from rich.console import CaptureError, Console, ConsoleOptions, render_group +from rich.console import ( + CaptureError, + Console, + ConsoleDimensions, + ConsoleOptions, + ScreenUpdate, + group, +) +from rich.control import Control from rich.measure import measure_renderables +from rich.padding import Padding from rich.pager import SystemPager from rich.panel import Panel +from rich.region import Region +from rich.segment import Segment +from rich.status import Status from rich.style import Style +from rich.text import Text def test_dumb_terminal(): - console = Console(force_terminal=True) + console = Console(force_terminal=True, _environ={}) assert console.color_system is not None console = Console(force_terminal=True, _environ={"TERM": "dumb"}) @@ -27,6 +41,12 @@ def test_dumb_terminal(): assert height == 25 +def test_soft_wrap(): + console = Console(file=io.StringIO(), width=20, soft_wrap=True) + console.print("foo " * 10) + assert console.file.getvalue() == "foo " * 20 + + @pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows") def test_16color_terminal(): console = Console( @@ -47,6 +67,8 @@ def test_truecolor_terminal(): def test_console_options_update(): options = ConsoleOptions( + ConsoleDimensions(80, 25), + max_height=25, legacy_windows=False, min_width=10, max_width=20, @@ -67,6 +89,23 @@ def test_console_options_update(): assert options_copy == options and options_copy is not options +def test_console_options_update_height(): + options = ConsoleOptions( + ConsoleDimensions(80, 25), + max_height=25, + legacy_windows=False, + min_width=10, + max_width=20, + is_terminal=False, + encoding="utf-8", + ) + assert options.height is None + render_options = options.update_height(12) + assert options.height is None + assert render_options.height == 12 + assert render_options.max_height == 12 + + def test_init(): console = Console(color_system=None) assert console._color_system == None @@ -80,11 +119,53 @@ def test_size(): w, h = console.size assert console.width == w - console = Console(width=99, height=101) + console = Console(width=99, height=101, legacy_windows=False) w, h = console.size assert w == 99 and h == 101 +@pytest.mark.parametrize( + "is_windows,no_descriptor_size,stdin_size,stdout_size,stderr_size,expected_size", + [ + # on Windows we'll use `os.get_terminal_size()` without arguments... + (True, (133, 24), ValueError, ValueError, ValueError, (133, 24)), + (False, (133, 24), ValueError, ValueError, ValueError, (80, 25)), + # ...while on other OS we'll try to pass stdin, then stdout, then stderr to it: + (False, ValueError, (133, 24), ValueError, ValueError, (133, 24)), + (False, ValueError, ValueError, (133, 24), ValueError, (133, 24)), + (False, ValueError, ValueError, ValueError, (133, 24), (133, 24)), + (False, ValueError, ValueError, ValueError, ValueError, (80, 25)), + ], +) +@mock.patch("rich.console.os.get_terminal_size") +def test_size_can_fall_back_to_std_descriptors( + get_terminal_size_mock: mock.MagicMock, + is_windows: bool, + no_descriptor_size: Union[Tuple[int, int], Type[ValueError]], + stdin_size: Union[Tuple[int, int], Type[ValueError]], + stdout_size: Union[Tuple[int, int], Type[ValueError]], + stderr_size: Union[Tuple[int, int], Type[ValueError]], + expected_size, +): + def get_terminal_size_mock_impl(fileno: int = None) -> Tuple[int, int]: + value = { + None: no_descriptor_size, + sys.__stdin__.fileno(): stdin_size, + sys.__stdout__.fileno(): stdout_size, + sys.__stderr__.fileno(): stderr_size, + }[fileno] + if value is ValueError: + raise value + return value + + get_terminal_size_mock.side_effect = get_terminal_size_mock_impl + + console = Console(legacy_windows=False) + with mock.patch("rich.console.WINDOWS", new=is_windows): + w, h = console.size + assert (w, h) == expected_size + + def test_repr(): console = Console() assert isinstance(repr(console), str) @@ -97,6 +178,94 @@ def test_print(): assert console.file.getvalue() == "foo\n" +def test_print_multiple(): + console = Console(file=io.StringIO(), color_system="truecolor") + console.print("foo", "bar") + assert console.file.getvalue() == "foo bar\n" + + +def test_print_text(): + console = Console(file=io.StringIO(), color_system="truecolor") + console.print(Text("foo", style="bold")) + assert console.file.getvalue() == "\x1B[1mfoo\x1B[0m\n" + + +def test_print_text_multiple(): + console = Console(file=io.StringIO(), color_system="truecolor") + console.print(Text("foo", style="bold"), Text("bar"), "baz") + assert console.file.getvalue() == "\x1B[1mfoo\x1B[0m bar baz\n" + + +def test_print_json(): + console = Console(file=io.StringIO(), color_system="truecolor") + console.print_json('[false, true, null, "foo"]', indent=4) + result = console.file.getvalue() + print(repr(result)) + expected = '\x1b[1m[\x1b[0m\n \x1b[3;91mfalse\x1b[0m,\n \x1b[3;92mtrue\x1b[0m,\n \x1b[3;35mnull\x1b[0m,\n \x1b[32m"foo"\x1b[0m\n\x1b[1m]\x1b[0m\n' + assert result == expected + + +def test_print_json_error(): + console = Console(file=io.StringIO(), color_system="truecolor") + with pytest.raises(TypeError): + console.print_json(["foo"], indent=4) + + +def test_print_json_data(): + console = Console(file=io.StringIO(), color_system="truecolor") + console.print_json(data=[False, True, None, "foo"], indent=4) + result = console.file.getvalue() + print(repr(result)) + expected = '\x1b[1m[\x1b[0m\n \x1b[3;91mfalse\x1b[0m,\n \x1b[3;92mtrue\x1b[0m,\n \x1b[3;35mnull\x1b[0m,\n \x1b[32m"foo"\x1b[0m\n\x1b[1m]\x1b[0m\n' + assert result == expected + + +def test_print_json_ensure_ascii(): + console = Console(file=io.StringIO(), color_system="truecolor") + console.print_json(data={"foo": "💩"}, ensure_ascii=False) + result = console.file.getvalue() + print(repr(result)) + expected = '\x1b[1m{\x1b[0m\n \x1b[1;34m"foo"\x1b[0m: \x1b[32m"💩"\x1b[0m\n\x1b[1m}\x1b[0m\n' + assert result == expected + + +def test_print_json_indent_none(): + console = Console(file=io.StringIO(), color_system="truecolor") + data = {"name": "apple", "count": 1} + console.print_json(data=data, indent=None) + result = console.file.getvalue() + expected = '\x1b[1m{\x1b[0m\x1b[1;34m"name"\x1b[0m: \x1b[32m"apple"\x1b[0m, \x1b[1;34m"count"\x1b[0m: \x1b[1;36m1\x1b[0m\x1b[1m}\x1b[0m\n' + assert result == expected + + +def test_log(): + console = Console( + file=io.StringIO(), + width=80, + color_system="truecolor", + log_time_format="TIME", + log_path=False, + _environ={}, + ) + console.log("foo", style="red") + expected = "\x1b[2;36mTIME\x1b[0m\x1b[2;36m \x1b[0m\x1b[31mfoo \x1b[0m\n" + result = console.file.getvalue() + print(repr(result)) + assert result == expected + + +def test_log_milliseconds(): + def time_formatter(timestamp: datetime) -> Text: + return Text("TIME") + + console = Console( + file=io.StringIO(), width=40, log_time_format=time_formatter, log_path=False + ) + console.log("foo") + result = console.file.getvalue() + assert result == "TIME foo \n" + + def test_print_empty(): console = Console(file=io.StringIO(), color_system="truecolor") console.print() @@ -119,7 +288,9 @@ def test_print_style(): def test_show_cursor(): - console = Console(file=io.StringIO(), force_terminal=True, legacy_windows=False) + console = Console( + file=io.StringIO(), force_terminal=True, legacy_windows=False, _environ={} + ) console.show_cursor(False) console.print("foo") console.show_cursor(True) @@ -127,7 +298,7 @@ def test_show_cursor(): def test_clear(): - console = Console(file=io.StringIO(), force_terminal=True) + console = Console(file=io.StringIO(), force_terminal=True, _environ={}) console.clear() console.clear(home=False) assert console.file.getvalue() == "\033[2J\033[H" + "\033[2J" @@ -165,10 +336,10 @@ def test_render_error(): def test_control(): - console = Console(file=io.StringIO(), force_terminal=True) - console.control("FOO") + console = Console(file=io.StringIO(), force_terminal=True, _environ={}) + console.control(Control.clear()) console.print("BAR") - assert console.file.getvalue() == "FOOBAR\n" + assert console.file.getvalue() == "\x1b[2JBAR\n" def test_capture(): @@ -181,7 +352,7 @@ def test_capture(): def test_input(monkeypatch, capsys): - def fake_input(prompt): + def fake_input(prompt=""): console.file.write(prompt) return "bar" @@ -192,18 +363,6 @@ def fake_input(prompt): assert user_input == "bar" -def test_input_legacy_windows(monkeypatch, capsys): - def fake_input(prompt): - console.file.write(prompt) - return "bar" - - monkeypatch.setattr("builtins.input", fake_input) - console = Console(legacy_windows=True) - user_input = console.input(prompt="foo:") - assert capsys.readouterr().out == "foo:" - assert user_input == "bar" - - def test_input_password(monkeypatch, capsys): def fake_input(prompt, stream=None): console.file.write(prompt) @@ -218,6 +377,12 @@ def fake_input(prompt, stream=None): assert user_input == "bar" +def test_status(): + console = Console(file=io.StringIO(), force_terminal=True, width=20) + status = console.status("foo") + assert isinstance(status, Status) + + def test_justify_none(): console = Console(file=io.StringIO(), force_terminal=True, width=20) console.print("FOO", justify=None) @@ -225,26 +390,30 @@ def test_justify_none(): def test_justify_left(): - console = Console(file=io.StringIO(), force_terminal=True, width=20) + console = Console(file=io.StringIO(), force_terminal=True, width=20, _environ={}) console.print("FOO", justify="left") assert console.file.getvalue() == "FOO \n" def test_justify_center(): - console = Console(file=io.StringIO(), force_terminal=True, width=20) + console = Console(file=io.StringIO(), force_terminal=True, width=20, _environ={}) console.print("FOO", justify="center") assert console.file.getvalue() == " FOO \n" def test_justify_right(): - console = Console(file=io.StringIO(), force_terminal=True, width=20) + console = Console(file=io.StringIO(), force_terminal=True, width=20, _environ={}) console.print("FOO", justify="right") assert console.file.getvalue() == " FOO\n" def test_justify_renderable_none(): console = Console( - file=io.StringIO(), force_terminal=True, width=20, legacy_windows=False + file=io.StringIO(), + force_terminal=True, + width=20, + legacy_windows=False, + _environ={}, ) console.print(Panel("FOO", expand=False, padding=0), justify=None) assert console.file.getvalue() == "╭───╮\n│FOO│\n╰───╯\n" @@ -252,7 +421,11 @@ def test_justify_renderable_none(): def test_justify_renderable_left(): console = Console( - file=io.StringIO(), force_terminal=True, width=10, legacy_windows=False + file=io.StringIO(), + force_terminal=True, + width=10, + legacy_windows=False, + _environ={}, ) console.print(Panel("FOO", expand=False, padding=0), justify="left") assert console.file.getvalue() == "╭───╮ \n│FOO│ \n╰───╯ \n" @@ -260,7 +433,11 @@ def test_justify_renderable_left(): def test_justify_renderable_center(): console = Console( - file=io.StringIO(), force_terminal=True, width=10, legacy_windows=False + file=io.StringIO(), + force_terminal=True, + width=10, + legacy_windows=False, + _environ={}, ) console.print(Panel("FOO", expand=False, padding=0), justify="center") assert console.file.getvalue() == " ╭───╮ \n │FOO│ \n ╰───╯ \n" @@ -268,7 +445,11 @@ def test_justify_renderable_center(): def test_justify_renderable_right(): console = Console( - file=io.StringIO(), force_terminal=True, width=20, legacy_windows=False + file=io.StringIO(), + force_terminal=True, + width=20, + legacy_windows=False, + _environ={}, ) console.print(Panel("FOO", expand=False, padding=0), justify="right") assert ( @@ -299,9 +480,9 @@ def test_export_text(): def test_export_html(): console = Console(record=True, width=100) - console.print("[b]foo [link=https://example.org]Click[/link]") + console.print("[b]foo