From 70810aa74083fe8a91cbfad478133446917d89f2 Mon Sep 17 00:00:00 2001 From: Danilo Elias Date: Wed, 24 Mar 2021 09:24:22 -0300 Subject: [PATCH] Release 2.0.0 (#52) A brand new version of the SDK that has the following features: * Support to Ruby 2.3+ * Support to more APIs (customer, merchant_order, refund, advanced_payment, etc.) * Rubocop lint * Unit tests --- .editorconfig | 10 + .github/ISSUE_TEMPLATE/bug_report.md | 28 + .github/ISSUE_TEMPLATE/feature_request.md | 19 + .github/workflows/ruby.yml | 6 +- .rubocop.yml | 1 + .rubocop_todo.yml | 104 +++ .ruby-version | 1 + .travis.yml | 14 - CODE_OF_CONDUCT.md | 74 +++ CODING_GUIDELINES.md | 70 ++ CONTRIBUTING.md | 57 ++ Gemfile | 7 +- Gemfile.lock | 62 +- LICENSE.txt | 21 + README.md | 78 ++- Rakefile | 4 +- docs/CODE_OF_CONDUCT_md.html | 154 +++++ docs/CODING_GUIDELINES_md.html | 188 ++++++ docs/CONTRIBUTING_md.html | 165 +++++ docs/LICENSE_txt.html | 96 +++ docs/Mercadopago.html | 123 ++++ docs/Mercadopago/AdvancedPayment.html | 279 ++++++++ docs/Mercadopago/Card.html | 204 ++++++ docs/Mercadopago/CardToken.html | 160 +++++ docs/Mercadopago/Config.html | 266 ++++++++ docs/Mercadopago/Customer.html | 228 +++++++ docs/Mercadopago/DisbursementRefund.html | 183 ++++++ docs/Mercadopago/HttpClient.html | 249 +++++++ docs/Mercadopago/IdentificationType.html | 136 ++++ docs/Mercadopago/MPBase.html | 316 +++++++++ docs/Mercadopago/MerchantOrder.html | 209 ++++++ docs/Mercadopago/Payment.html | 208 ++++++ docs/Mercadopago/PaymentMethods.html | 136 ++++ docs/Mercadopago/Preference.html | 184 ++++++ docs/Mercadopago/Refund.html | 160 +++++ docs/Mercadopago/RequestOptions.html | 433 ++++++++++++ docs/Mercadopago/SDK.html | 528 +++++++++++++++ docs/Mercadopago/User.html | 136 ++++ docs/README_md.html | 181 +++++ docs/created.rid | 25 + docs/css/fonts.css | 167 +++++ docs/css/rdoc.css | 619 ++++++++++++++++++ docs/fonts/Lato-Light.ttf | Bin 0 -> 94668 bytes docs/fonts/Lato-LightItalic.ttf | Bin 0 -> 94196 bytes docs/fonts/Lato-Regular.ttf | Bin 0 -> 96184 bytes docs/fonts/Lato-RegularItalic.ttf | Bin 0 -> 95316 bytes docs/fonts/SourceCodePro-Bold.ttf | Bin 0 -> 71200 bytes docs/fonts/SourceCodePro-Regular.ttf | Bin 0 -> 71692 bytes docs/images/add.png | Bin 0 -> 733 bytes docs/images/arrow_up.png | Bin 0 -> 372 bytes docs/images/brick.png | Bin 0 -> 452 bytes docs/images/brick_link.png | Bin 0 -> 764 bytes docs/images/bug.png | Bin 0 -> 774 bytes docs/images/bullet_black.png | Bin 0 -> 211 bytes docs/images/bullet_toggle_minus.png | Bin 0 -> 207 bytes docs/images/bullet_toggle_plus.png | Bin 0 -> 209 bytes docs/images/date.png | Bin 0 -> 626 bytes docs/images/delete.png | Bin 0 -> 715 bytes docs/images/find.png | Bin 0 -> 659 bytes docs/images/loadingAnimation.gif | Bin 0 -> 5886 bytes docs/images/macFFBgHack.png | Bin 0 -> 207 bytes docs/images/package.png | Bin 0 -> 853 bytes docs/images/page_green.png | Bin 0 -> 621 bytes docs/images/page_white_text.png | Bin 0 -> 342 bytes docs/images/page_white_width.png | Bin 0 -> 309 bytes docs/images/plugin.png | Bin 0 -> 591 bytes docs/images/ruby.png | Bin 0 -> 592 bytes docs/images/tag_blue.png | Bin 0 -> 1880 bytes docs/images/tag_green.png | Bin 0 -> 613 bytes docs/images/transparent.png | Bin 0 -> 97 bytes docs/images/wrench.png | Bin 0 -> 610 bytes docs/images/wrench_orange.png | Bin 0 -> 584 bytes docs/images/zoom.png | Bin 0 -> 692 bytes docs/index.html | 109 +++ docs/js/darkfish.js | 84 +++ docs/js/navigation.js | 105 +++ docs/js/navigation.js.gz | Bin 0 -> 833 bytes docs/js/search.js | 110 ++++ docs/js/search_index.js | 1 + docs/js/search_index.js.gz | Bin 0 -> 3432 bytes docs/js/searcher.js | 229 +++++++ docs/js/searcher.js.gz | Bin 0 -> 1688 bytes docs/table_of_contents.html | 562 ++++++++++++++++ .../basic_preference/button.rb | 28 - .../receive-ipn.rb | 25 - .../search-approved-payments.rb | 23 - .../search-creditcard-payments.rb | 23 - .../search-funded-payments-by-name.rb | 23 - .../search-payments-from-email-and-date.rb | 23 - examples/payment-search/search-payments.rb | 23 - examples/preapproval-payments/button.rb | 42 -- lib/mercadopago.rb | 319 +-------- lib/mercadopago/config/config.rb | 42 ++ lib/mercadopago/config/request_options.rb | 85 +++ lib/mercadopago/core/mp_base.rb | 77 +++ lib/mercadopago/http/http_client.rb | 74 +++ lib/mercadopago/resources/advanced_payment.rb | 48 ++ lib/mercadopago/resources/card.rb | 31 + lib/mercadopago/resources/card_token.rb | 19 + lib/mercadopago/resources/customer.rb | 36 + .../resources/disbursement_refund.rb | 24 + .../resources/identification_type.rb | 13 + lib/mercadopago/resources/merchant_order.rb | 32 + lib/mercadopago/resources/payment.rb | 35 + lib/mercadopago/resources/payment_methods.rb | 13 + lib/mercadopago/resources/preference.rb | 26 + lib/mercadopago/resources/refund.rb | 24 + lib/mercadopago/resources/user.rb | 13 + lib/mercadopago/sdk.rb | 85 +++ lib/ssl_options_patch.rb | 15 - lib/version.rb | 2 - mercadopago.gemspec | 22 +- tests/test_card.rb | 79 +++ tests/test_card_token.rb | 39 ++ tests/test_customer.rb | 54 ++ tests/test_identification_type.rb | 16 + tests/test_merchant_order.rb | 94 +++ tests/test_payment.rb | 102 +++ tests/test_payment_methods.rb | 14 + tests/test_preference.rb | 49 ++ tests/test_refund.rb | 88 +++ tests/test_user.rb | 17 + tests/tests.rb | 68 +- travis_Gemfile | 4 - 124 files changed, 8703 insertions(+), 655 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .rubocop.yml create mode 100644 .rubocop_todo.yml create mode 100644 .ruby-version delete mode 100644 .travis.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CODING_GUIDELINES.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.txt create mode 100644 docs/CODE_OF_CONDUCT_md.html create mode 100644 docs/CODING_GUIDELINES_md.html create mode 100644 docs/CONTRIBUTING_md.html create mode 100644 docs/LICENSE_txt.html create mode 100644 docs/Mercadopago.html create mode 100644 docs/Mercadopago/AdvancedPayment.html create mode 100644 docs/Mercadopago/Card.html create mode 100644 docs/Mercadopago/CardToken.html create mode 100644 docs/Mercadopago/Config.html create mode 100644 docs/Mercadopago/Customer.html create mode 100644 docs/Mercadopago/DisbursementRefund.html create mode 100644 docs/Mercadopago/HttpClient.html create mode 100644 docs/Mercadopago/IdentificationType.html create mode 100644 docs/Mercadopago/MPBase.html create mode 100644 docs/Mercadopago/MerchantOrder.html create mode 100644 docs/Mercadopago/Payment.html create mode 100644 docs/Mercadopago/PaymentMethods.html create mode 100644 docs/Mercadopago/Preference.html create mode 100644 docs/Mercadopago/Refund.html create mode 100644 docs/Mercadopago/RequestOptions.html create mode 100644 docs/Mercadopago/SDK.html create mode 100644 docs/Mercadopago/User.html create mode 100644 docs/README_md.html create mode 100644 docs/created.rid create mode 100644 docs/css/fonts.css create mode 100644 docs/css/rdoc.css create mode 100644 docs/fonts/Lato-Light.ttf create mode 100644 docs/fonts/Lato-LightItalic.ttf create mode 100644 docs/fonts/Lato-Regular.ttf create mode 100644 docs/fonts/Lato-RegularItalic.ttf create mode 100644 docs/fonts/SourceCodePro-Bold.ttf create mode 100644 docs/fonts/SourceCodePro-Regular.ttf create mode 100644 docs/images/add.png create mode 100644 docs/images/arrow_up.png create mode 100644 docs/images/brick.png create mode 100644 docs/images/brick_link.png create mode 100644 docs/images/bug.png create mode 100644 docs/images/bullet_black.png create mode 100644 docs/images/bullet_toggle_minus.png create mode 100644 docs/images/bullet_toggle_plus.png create mode 100644 docs/images/date.png create mode 100644 docs/images/delete.png create mode 100644 docs/images/find.png create mode 100644 docs/images/loadingAnimation.gif create mode 100644 docs/images/macFFBgHack.png create mode 100644 docs/images/package.png create mode 100644 docs/images/page_green.png create mode 100644 docs/images/page_white_text.png create mode 100644 docs/images/page_white_width.png create mode 100644 docs/images/plugin.png create mode 100644 docs/images/ruby.png create mode 100644 docs/images/tag_blue.png create mode 100644 docs/images/tag_green.png create mode 100644 docs/images/transparent.png create mode 100644 docs/images/wrench.png create mode 100644 docs/images/wrench_orange.png create mode 100644 docs/images/zoom.png create mode 100644 docs/index.html create mode 100644 docs/js/darkfish.js create mode 100644 docs/js/navigation.js create mode 100644 docs/js/navigation.js.gz create mode 100644 docs/js/search.js create mode 100644 docs/js/search_index.js create mode 100644 docs/js/search_index.js.gz create mode 100644 docs/js/searcher.js create mode 100644 docs/js/searcher.js.gz create mode 100644 docs/table_of_contents.html delete mode 100755 examples/checkout-buttons/basic_preference/button.rb delete mode 100644 examples/instant-payment-notifications/receive-ipn.rb delete mode 100644 examples/payment-search/search-approved-payments.rb delete mode 100644 examples/payment-search/search-creditcard-payments.rb delete mode 100644 examples/payment-search/search-funded-payments-by-name.rb delete mode 100644 examples/payment-search/search-payments-from-email-and-date.rb delete mode 100644 examples/payment-search/search-payments.rb delete mode 100755 examples/preapproval-payments/button.rb create mode 100644 lib/mercadopago/config/config.rb create mode 100644 lib/mercadopago/config/request_options.rb create mode 100644 lib/mercadopago/core/mp_base.rb create mode 100644 lib/mercadopago/http/http_client.rb create mode 100644 lib/mercadopago/resources/advanced_payment.rb create mode 100644 lib/mercadopago/resources/card.rb create mode 100644 lib/mercadopago/resources/card_token.rb create mode 100644 lib/mercadopago/resources/customer.rb create mode 100644 lib/mercadopago/resources/disbursement_refund.rb create mode 100644 lib/mercadopago/resources/identification_type.rb create mode 100644 lib/mercadopago/resources/merchant_order.rb create mode 100644 lib/mercadopago/resources/payment.rb create mode 100644 lib/mercadopago/resources/payment_methods.rb create mode 100644 lib/mercadopago/resources/preference.rb create mode 100644 lib/mercadopago/resources/refund.rb create mode 100644 lib/mercadopago/resources/user.rb create mode 100644 lib/mercadopago/sdk.rb delete mode 100644 lib/ssl_options_patch.rb delete mode 100644 lib/version.rb create mode 100644 tests/test_card.rb create mode 100644 tests/test_card_token.rb create mode 100644 tests/test_customer.rb create mode 100644 tests/test_identification_type.rb create mode 100644 tests/test_merchant_order.rb create mode 100644 tests/test_payment.rb create mode 100644 tests/test_payment_methods.rb create mode 100644 tests/test_preference.rb create mode 100644 tests/test_refund.rb create mode 100644 tests/test_user.rb delete mode 100644 travis_Gemfile diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4688db4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# see http://editorconfig.org/ + +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +insert_final_newline = true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..2e8cfe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,28 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +- Test case to reproduce the bug. Try to reproduce in the latest version. +- Code sample that fails + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Environment (please complete the following information):** + +- OS: [e.g. Linux/Mac/Windows] +- Ruby version: [e.g. 2.3] +- SDK version: [e.g. 2.0.0] + +**Additional context** +Add any other context about the problem here. [e.g. Links to previous bugs]. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..cadba3e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest completely new features or minor improvements to existing functionality +title: '' +labels: enhancement, proposed + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index ff2e845..8dfa074 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -9,9 +9,9 @@ name: Ruby on: push: - branches: [ gitactions ] + branches: [ master ] pull_request: - branches: [ gitactions ] + branches: [ master ] jobs: test: @@ -29,5 +29,7 @@ jobs: ruby-version: 2.6 - name: Install dependencies run: bundle install + - name: Rubocop + run: rubocop lib - name: Run tests run: bundle exec rake diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..cc32da4 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1 @@ +inherit_from: .rubocop_todo.yml diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml new file mode 100644 index 0000000..3c8712b --- /dev/null +++ b/.rubocop_todo.yml @@ -0,0 +1,104 @@ +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2021-01-06 19:35:39 UTC using RuboCop version 1.7.0. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 1 +# Configuration parameters: Include. +# Include: **/*.gemspec +Gemspec/RequiredRubyVersion: + Exclude: + - 'mercadopago.gemspec' + +# Offense count: 8 +Lint/SelfAssignment: + Exclude: + - 'lib/mercadopago/core/mp_base.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods. +Lint/UnusedMethodArgument: + Exclude: + - 'lib/mercadopago/resources/disbursement_refund.rb' + +# Offense count: 36 +Lint/UselessAssignment: + Exclude: + - 'examples/instant-payment-notifications/receive-ipn.rb' + - 'lib/mercadopago/core/mp_base.rb' + - 'lib/mercadopago/http/http_client.rb' + - 'lib/mercadopago/resources/advanced_payment.rb' + - 'lib/mercadopago/resources/disbursement_refund.rb' + - 'tests/test_card.rb' + - 'tests/test_card_token.rb' + +# Offense count: 2 +# Configuration parameters: IgnoredMethods, CountRepeatedAttributes. +Metrics/AbcSize: + Max: 25 + +# Offense count: 15 +# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods. +Metrics/MethodLength: + Max: 69 + +# Offense count: 3 +# Configuration parameters: CountKeywordArgs, MaxOptionalParameters. +Metrics/ParameterLists: + Max: 7 + +# Offense count: 1 +Naming/AccessorMethodName: + Exclude: + - 'lib/mercadopago/config/request_options.rb' + +# Offense count: 6 +# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, Regex, IgnoreExecutableScripts, AllowedAcronyms. +# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS +Naming/FileName: + Exclude: + - 'examples/instant-payment-notifications/receive-ipn.rb' + - 'examples/payment-search/search-approved-payments.rb' + - 'examples/payment-search/search-creditcard-payments.rb' + - 'examples/payment-search/search-funded-payments-by-name.rb' + - 'examples/payment-search/search-payments-from-email-and-date.rb' + - 'examples/payment-search/search-payments.rb' + +# Offense count: 23 +# Configuration parameters: EnforcedStyle. +# SupportedStyles: snake_case, camelCase +Naming/VariableName: + Exclude: + - 'examples/checkout-buttons/basic_preference/button.rb' + - 'examples/payment-search/search-approved-payments.rb' + - 'examples/payment-search/search-creditcard-payments.rb' + - 'examples/payment-search/search-funded-payments-by-name.rb' + - 'examples/payment-search/search-payments-from-email-and-date.rb' + - 'examples/payment-search/search-payments.rb' + - 'examples/preapproval-payments/button.rb' + - 'lib/mercadopago/config/config.rb' + +# Offense count: 7 +Style/ClassVars: + Exclude: + - 'lib/mercadopago/config/config.rb' + +# Offense count: 32 +Style/Documentation: + Enabled: false + +# Offense count: 2 +Style/IdenticalConditionalBranches: + Exclude: + - 'examples/instant-payment-notifications/receive-ipn.rb' + +# Offense count: 12 +# Cop supports --auto-correct. +# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# URISchemes: http, https +Layout/LineLength: + Max: 151 diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..37c2961 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.7.2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a0e8fc2..0000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -sudo: required -language: ruby -rvm: - - 1.9.3 - - 2.0.0 - - 2.1 - - 2.2 - - 2.3.0 - - jruby-19mode - - jruby-9.0.5.0 -gemfile: - travis_Gemfile -script: - bundle exec rake test ./tests/tests.rb \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ed7074c --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at danilo.elias@mercadolivre.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [https://contributor-covenant.org/version/1/4][version] + +[homepage]: https://contributor-covenant.org +[version]: https://contributor-covenant.org/version/1/4/ diff --git a/CODING_GUIDELINES.md b/CODING_GUIDELINES.md new file mode 100644 index 0000000..987b452 --- /dev/null +++ b/CODING_GUIDELINES.md @@ -0,0 +1,70 @@ +# Coding Guidelines + +The Mercado Pago Ruby SDK is a collaborative effort from the start. The SDK team thinks that contributions from different developer will enrich it's feature set and make it more relevant to the community. + +However; absorbing all contributions as-is, while expedient, might lead to difficulties in maintenance of the codebase is left unchecked. Collaborative codebases often establish guidelines for contributors to ensure code remains maintainable over time. The effort to maintain the SDK is no different in this regard so a bit of guidance is in order. + +The purpose of this guide is to set a baseline for contributions. These guidelines are not intended to limit the tools at your disposal nor to rewire the way you think but rather to encourage good neighbor behavior. + +## Language Guidelines + +We use **english** language. This is to be consistent everywhere, and to be considerate with developers that do not speak our native language. + +Therefore: source code, comments, documentation, commit messages, review comments, and any other kind of contribution *MUST* use english language. + +Typos are unavoidable, but try to reduce them by using a spellchecker. Most IDEs can be configured to run one automatically. + +## Code Guidelines + +* Set your IDE to follow the [`.editorconfig`](https://editorconfig.org/) in each repository. +* Follow the [RuboCop Ruby Style Guide](https://github.com/rubocop/ruby-style-guide). + +Generally speaking, be conscious when contributing and try following the same style that the code in the SDK already has. If you have any doubts, just ask us! + +This rules will be enforced automatically when making a pull requests, and checks will fail if you do not follow them, resulting in your contribution being automatically rejected until fixed. + +## Comment Guidelines + +Comments in code are a hard thing to write, not because the words are difficult to produce but because it is hard to make relevant comments. Too much of it and people do not read comments (and it obfuscates code reading) and too little of it gives you no recourse but to read large portions of codebase to get insight as to what a feature/codeblock is doing. Both situations are undesirable and efforts should be made at all time to have a please comment reading experience + +As a general rule you would have to comment on decisions you made while coding that are not part of any specification. + +In particular you should always comment any decision that: + +* Departs from common wisdom or convention (The **why's** are necessary). +* Takes a significant amount of time to produce. A good rule of thumb here is that if you spent more than 1 hour thinking on how to produce a fragment of code that took 2 minutes of wrist time to write you should document your thinking to aid reader and allow for validation. +* Need to preserve properties of the implementation. This is the case of performance sensitive portions of the codebase, goroutines synchronization, implementations of security primitives, congestion control algorithms, etc. + +As a general rule of what not to comment you should avoid: + +* Commenting on structure of programs that is already part of a convention, specified or otherwise. +* Having pedantic explanations of behavior that can be found by immediate examination of the surrounding code artifacts. +* Commenting on behavior you cannot attest. + +### Branching Guidelines + +Currently `master` is our only long term branch, below a few suggestions of short term branches naming: + +* `hotfix/something-needs-fix`: Small routine patches in code to features already there. +* `feature/something-new`: A new feature or a change in a existent feature. Beware of breaking changes that would require a major version bump. +* `doc/improves-documentation-for-this-feature`: If you add or change documentation with no impact to the source code. + +### Git Guidelines + +All commits **SHOULD** follow the [seven rules of a great Git commit message](https://chris.beams.io/posts/git-commit): + +1. Separate subject from body with a blank line. +2. Limit the subject line to 72 characters. +3. Capitalize the subject line. +4. Do not end the subject line with a period. +5. Use the imperative mood in the subject line. +6. Wrap the body at 72 characters. +7. Use the body to explain what and why vs. how. + +Commits such as "fix tests", "now it's working" and many other common messages we find usually in code **WON'T** be accepted. + +Ideally we would like to enforce these rules, but we are realistic and understand that it might be a big change for some people. So unless deviating heavily from what was stated we might accept your commits even if not following these rules perfectly. + +Please avoid taking to much time to deliver code, and always [rebase](https://git-scm.com/docs/git-rebase) your code to avoid reverse merge commits. + +When reviewing, check if the PR adheres to [RuboCop Ruby Style Guide](https://github.com/rubocop/ruby-style-guide). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a64a28b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,57 @@ +# Contributing to the Mercado Pago Ruby SDK + +Thank you for your interest in contributing to the Mercado Pago Ruby SDK! + +## How to contribute + +In order to contribute to the Mercado Pago Ruby SDK effectively we provide guidelines to address common case for contributions. Presently we have guides for the following type of changes. + +* Request For Change (RFC) / Feature Request: These are suggestions / requests for features the SDK currently does not have. The SDK team evaluates these requests for adequacy / relevance / capacity and overall architectural consistency. +* Bug Reports: These are reports of non compliant behavior with the SDK specification and other blatantly wrong behavior of the Mercado Pago Ruby SDK. + +In addition to contributing in the form of Bug Reports and RFCs it is also possible to contribute directly in code with a Pull Request (PR). In the case of a Pull Request you should also indicate the nature of the Pull Request (Feature/Bug/etc.) to help the team asses the Pull Request. If you are enthusiastic about a particular Feature being added or a bug being fixed, a PR is often the quickest way to promote your change as the team does not have to allocate as much resources to process the contribution. + +In the case of PRs it is often best to consult with the SDK team before embarking on a PR, specially if it's a beefy one. Spending time on a PR that might later be rejected because major discrepancies with vision or competing contributions is an uncomfortable outcome for all involved people. Remember the SDK team with privilege overall consistency and progress over any one particular contribution. + +## Coding Guidance + +All contributions *MUST* follow the [Coding Guidelines](CODING_GUIDELINES.md). Contributions that fail to follow this guidelines will be disregarded and told to make the required modifications to do so. + +## Request For Change / Feature Request + +Generally speaking an RFC is needed when you want to add a new feature or change an existing one in an incompatible way that might result in a major version bump to the toolkit. + +Though it seems a little bureaucratic, the process is in place in order to avoid frustration of a potential contributor by making the discussions take place before any code is written. Once the design and direction is fully agreed then the contributor can work peacefully knowing that their change will be committed. + +As of this moment all you need to do is create an issue and use the [Feature Request Template](.github/ISSUE_TEMPLATE/feature_request.md). + +Please prepend your issue title with `[RFC]` so that's easier to filter. + +## Bug Reports + +Bugs are a reality in software. We can't fix what we don't know about, so please report liberally. If you're not sure if something is a bug or not, feel free to file it anyway. + +Before reporting a bug, please search existing issues and pull requests, as it's possible that someone else has already reported your error. In the off case that you find your issue as fixed/closed, please add a reference to it on your new one. + +Your issue should contain a title and a clear description of the issue. You should also include as much relevant information as possible and a code sample that demonstrates the issue. The goal of a bug report is to make it easy for yourself - and others - to replicate the bug and develop a fix. + +Opening an issue is as easy as following [this link](https://github.com/mercadopago/sdk-dotnet/issues/new) and filling out the given template. + +Bug reports may also be sent in the form of a [pull request](#pull-request) containing a failing test. + +## Pull Request + +First and foremost: Source code, documentation, commit messages, review comments, and any other kind of contribution must *MUST* follow the [Coding Guidelines](CODING_GUIDELINES.md). + +We use the "fork and pull" model [described here](https://help.github.com/articles/about-collaborative-development-models/), where contributors push changes to their personal fork and create pull requests to bring those changes into the source repository. + +Your basic steps to get going: + +* Fork the corresponding toolkit repository and create a branch from master for the issue you are working on. +* Commit as you go following our git conventions. +* Include tests that cover all non-trivial code. The existing tests should provide a template on how to test the toolkit correctly. +* Make sure all test passes. +* All code changes are expected to comply with the formatting style. +* Push your commits to GitHub and create a pull request against the corresponding toolkit component master branch. + +If taking to much time to deliver code, **always** [rebase](https://git-scm.com/docs/git-rebase) towards `master` before asking for a review, and avoid reverse merge commits. diff --git a/Gemfile b/Gemfile index fa75df1..188b3b4 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,8 @@ +# frozen_string_literal: true + source 'https://rubygems.org' -gemspec +gem 'minitest' +gem 'rake' +gem 'rest-client' +gem 'rubocop', require: false diff --git a/Gemfile.lock b/Gemfile.lock index e208281..0c2e39a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,26 +1,54 @@ -PATH - remote: . - specs: - mercadopago-sdk (0.3.5) - json - GEM remote: https://rubygems.org/ specs: - coderay (1.0.9) - json (1.8.3) - method_source (0.8.1) - pry (0.9.12) - coderay (~> 1.0.5) - method_source (~> 0.8) - slop (~> 3.4) - rake (10.0.3) - slop (3.4.4) + ast (2.4.2) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + http-accept (1.7.0) + http-cookie (1.0.3) + domain_name (~> 0.5) + mime-types (3.3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2021.0225) + minitest (5.14.4) + netrc (0.11.0) + parallel (1.20.1) + parser (3.0.0.0) + ast (~> 2.4.1) + rainbow (3.0.0) + rake (13.0.3) + regexp_parser (2.1.1) + rest-client (2.1.0) + http-accept (>= 1.7.0, < 2.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) + rexml (3.2.4) + rubocop (1.11.0) + parallel (~> 1.10) + parser (>= 3.0.0.0) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml + rubocop-ast (>= 1.2.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.4.1) + parser (>= 2.7.1.5) + ruby-progressbar (1.11.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (2.0.0) PLATFORMS ruby DEPENDENCIES - mercadopago-sdk! - pry + minitest rake + rest-client + rubocop + +BUNDLED WITH + 2.1.4 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..645110f --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Mercado Pago + +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. diff --git a/README.md b/README.md index 059c60d..d9345dd 100644 --- a/README.md +++ b/README.md @@ -8,56 +8,80 @@ This library provides developers with a simple set of bindings to help you integ ## 💡 Requirements -The SDK Supports Ruby from version v0 +Ruby version **2.3 or greater**. ## 📲 Installation -First time using Mercado Pago? Create your [Mercado Pago account](https://www.mercadopago.com), if you don’t have one already. +Run ```gem install mercadopago-sdk``` -1. Run ```gem install mercadopago-sdk``` +## 🌟 Getting Started -2. Copy the access_token in the [credentials](https://www.mercadopago.com/mlb/account/credentials) section of the page and replace YOUR_ACCESS_TOKEN with it. +First time using Mercado Pago? Create your [Mercado Pago account](https://www.mercadopago.com). -That's it! Mercado Pago SDK has been successfully installed. +Copy your `Access Token` in the [credentials panel](https://www.mercadopago.com/developers/panel/credentials) and replace the text `YOUR_ACCESS_TOKEN` with it. -## 🌟 Getting Started - - Simple usage looks like: +### Simple usage + +To generate a `card token` read the [Checkout API](https://www.mercadopago.com/developers/en/guides/online-payments/checkout-api/introduction) documentation. ```ruby -require 'mercadopago.rb' +require 'mercadopago' + +sdk = Mercadopago::SDK.new('YOUR_ACCESS_TOKEN') + +payment_data = { + transaction_amount: 100, + token: 'CARD_TOKEN', + description: 'Payment description', + payment_method_id: 'visa', + installments: 1, + payer: { + email: 'test_user_123456@testuser.com' + } +} +result = sdk.payment.create(payment_data) +payment = result[:response] + +puts payment +``` + +### Per-request configuration -$mp = MercadoPago.new('YOUR_ACCESS_TOKEN') +All methods that make API calls accept an optional `RequestOptions` object. This can be used to configure some special options of the request, such as changing credentials or custom headers. -preference_data = { - "items": [ - { - "title": "testCreate", - "quantity": 1, - "unit_price": 10.2, - "currency_id": "ARS" - } -preference = $mp.create_preference(preference_data) +```ruby +require 'mercadopago' + +request_options = Mercadopago::RequestOptions.new(access_token: 'YOUR_ACCESS_TOKEN') +# ... -puts preference +result = sdk.payment.create(payment_data, request_options: request_options) +payment = result[:response] ``` ## 📚 Documentation Visit our Dev Site for further information regarding: - - Payments APIs: [Spanish](https://www.mercadopago.com.ar/developers/es/guides/payments/api/introduction/) / [Portuguese](https://www.mercadopago.com.br/developers/pt/guides/payments/api/introduction/) - - Mercado Pago checkout: [Spanish](https://www.mercadopago.com.ar/developers/es/guides/payments/web-payment-checkout/introduction/) / [Portuguese](https://www.mercadopago.com.br/developers/pt/guides/payments/web-payment-checkout/introduction/) - - Web Tokenize checkout: [Spanish](https://www.mercadopago.com.ar/developers/es/guides/payments/web-tokenize-checkout/introduction/) / [Portuguese](https://www.mercadopago.com.br/developers/pt/guides/payments/web-tokenize-checkout/introduction/) + - [APIs](https://www.mercadopago.com/developers/en/reference) + - [Checkout Pro](https://www.mercadopago.com/developers/en/guides/online-payments/checkout-pro/introduction) + - [Checkout API](https://www.mercadopago.com/developers/en/guides/online-payments/checkout-api/introduction) + - [Web Tokenize Checkout](https://www.mercadopago.com/developers/en/guides/online-payments/web-tokenize-checkout/introduction) Check our official code reference to explore all available functionalities. -## ❤️ Support +## 🤝 Contributing + +All contributions are welcome, ranging from people wanting to triage issues, others wanting to write documentation, to people wanting to contribute code. + +Please read and follow our [contribution guidelines](CONTRIBUTING.md). Contributions not following this guidelines will be disregarded. The guidelines are in place to make all of our lives easier and make contribution a consistent process for everyone. + +## ❤️ Support -If you require technical support, please contact our support team at [developers.mercadopago.com](https://developers.mercadopago.com) +If you require technical support, please contact our support team at [developers.mercadopago.com](https://developers.mercadopago.com). -## 🏻 License +## 🏻 License ``` -MIT license. Copyright (c) 2018 - Mercado Pago / Mercado Libre +MIT license. Copyright (c) 2021 - Mercado Pago / Mercado Libre For more information, see the LICENSE file. ``` diff --git a/Rakefile b/Rakefile index a1bbc49..a870fd2 100644 --- a/Rakefile +++ b/Rakefile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'rake/testtask' Rake::TestTask.new do |t| @@ -6,4 +8,4 @@ Rake::TestTask.new do |t| t.verbose = true end -task :default => :test \ No newline at end of file +task default: :test diff --git a/docs/CODE_OF_CONDUCT_md.html b/docs/CODE_OF_CONDUCT_md.html new file mode 100644 index 0000000..110dd41 --- /dev/null +++ b/docs/CODE_OF_CONDUCT_md.html @@ -0,0 +1,154 @@ + + + + + + +CODE_OF_CONDUCT - RDoc Documentation + + + + + + + + + + + + + + + + +
+ +

Contributor Covenant Code of Conduct

+ +

Our Pledge

+ +

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

+ +

Our Standards

+ +

Examples of behavior that contributes to creating a positive environment include:

+ + +

Examples of unacceptable behavior by participants include:

+ + +

Our Responsibilities

+ +

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

+ +

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

+ +

Scope

+ +

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

+ +

Enforcement

+ +

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at danilo.elias@mercadolivre.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

+ +

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

+ +

Attribution

+ +

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at contributor-covenant.org/version/1/4

+ +
+ + + + + diff --git a/docs/CODING_GUIDELINES_md.html b/docs/CODING_GUIDELINES_md.html new file mode 100644 index 0000000..64c803c --- /dev/null +++ b/docs/CODING_GUIDELINES_md.html @@ -0,0 +1,188 @@ + + + + + + +CODING_GUIDELINES - RDoc Documentation + + + + + + + + + + + + + + + + +
+ +

Coding Guidelines

+ +

The Mercado Pago Ruby SDK is a collaborative effort from the start. The SDK team thinks that contributions from different developer will enrich it's feature set and make it more relevant to the community.

+ +

However; absorbing all contributions as-is, while expedient, might lead to difficulties in maintenance of the codebase is left unchecked. Collaborative codebases often establish guidelines for contributors to ensure code remains maintainable over time. The effort to maintain the SDK is no different in this regard so a bit of guidance is in order.

+ +

The purpose of this guide is to set a baseline for contributions. These guidelines are not intended to limit the tools at your disposal nor to rewire the way you think but rather to encourage good neighbor behavior.

+ +

Language Guidelines

+ +

We use english language. This is to be consistent everywhere, and to be considerate with developers that do not speak our native language.

+ +

Therefore: source code, comments, documentation, commit messages, review comments, and any other kind of contribution MUST use english language.

+ +

Typos are unavoidable, but try to reduce them by using a spellchecker. Most IDEs can be configured to run one automatically.

+ +

Code Guidelines

+ + +

Generally speaking, be conscious when contributing and try following the same style that the code in the SDK already has. If you have any doubts, just ask us!

+ +

This rules will be enforced automatically when making a pull requests, and checks will fail if you do not follow them, resulting in your contribution being automatically rejected until fixed.

+ +

Comment Guidelines

+ +

Comments in code are a hard thing to write, not because the words are difficult to produce but because it is hard to make relevant comments. Too much of it and people do not read comments (and it obfuscates code reading) and too little of it gives you no recourse but to read large portions of codebase to get insight as to what a feature/codeblock is doing. Both situations are undesirable and efforts should be made at all time to have a please comment reading experience

+ +

As a general rule you would have to comment on decisions you made while coding that are not part of any specification.

+ +

In particular you should always comment any decision that:

+ + +

As a general rule of what not to comment you should avoid:

+ + +

Branching Guidelines

+ +

Currently master is our only long term branch, below a few suggestions of short term branches naming:

+ + +

Git Guidelines

+ +

All commits SHOULD follow the seven rules of a great Git commit message:

+
  1. +

    Separate subject from body with a blank line.

    +
  2. +

    Limit the subject line to 72 characters.

    +
  3. +

    Capitalize the subject line.

    +
  4. +

    Do not end the subject line with a period.

    +
  5. +

    Use the imperative mood in the subject line.

    +
  6. +

    Wrap the body at 72 characters.

    +
  7. +

    Use the body to explain what and why vs. how.

    +
+ +

Commits such as “fix tests”, “now it's working” and many other common messages we find usually in code WON'T be accepted.

+ +

Ideally we would like to enforce these rules, but we are realistic and understand that it might be a big change for some people. So unless deviating heavily from what was stated we might accept your commits even if not following these rules perfectly.

+ +

Please avoid taking to much time to deliver code, and always rebase your code to avoid reverse merge commits.

+ +

When reviewing, check if the PR adheres to RuboCop Ruby Style Guide.

+ +
+ + + + + diff --git a/docs/CONTRIBUTING_md.html b/docs/CONTRIBUTING_md.html new file mode 100644 index 0000000..09d9983 --- /dev/null +++ b/docs/CONTRIBUTING_md.html @@ -0,0 +1,165 @@ + + + + + + +CONTRIBUTING - RDoc Documentation + + + + + + + + + + + + + + + + +
+ +

Contributing to the Mercado Pago Ruby SDK

+ +

Thank you for your interest in contributing to the Mercado Pago Ruby SDK!

+ +

How to contribute

+ +

In order to contribute to the Mercado Pago Ruby SDK effectively we provide guidelines to address common case for contributions. Presently we have guides for the following type of changes.

+ + +

In addition to contributing in the form of Bug Reports and RFCs it is also possible to contribute directly in code with a Pull Request (PR). In the case of a Pull Request you should also indicate the nature of the Pull Request (Feature/Bug/etc.) to help the team asses the Pull Request. If you are enthusiastic about a particular Feature being added or a bug being fixed, a PR is often the quickest way to promote your change as the team does not have to allocate as much resources to process the contribution.

+ +

In the case of PRs it is often best to consult with the SDK team before embarking on a PR, specially if it's a beefy one. Spending time on a PR that might later be rejected because major discrepancies with vision or competing contributions is an uncomfortable outcome for all involved people. Remember the SDK team with privilege overall consistency and progress over any one particular contribution.

+ +

Coding Guidance

+ +

All contributions MUST follow the Coding Guidelines. Contributions that fail to follow this guidelines will be disregarded and told to make the required modifications to do so.

+ +

Request For Change / Feature Request

+ +

Generally speaking an RFC is needed when you want to add a new feature or change an existing one in an incompatible way that might result in a major version bump to the toolkit.

+ +

Though it seems a little bureaucratic, the process is in place in order to avoid frustration of a potential contributor by making the discussions take place before any code is written. Once the design and direction is fully agreed then the contributor can work peacefully knowing that their change will be committed.

+ +

As of this moment all you need to do is create an issue and use the Feature Request Template.

+ +

Please prepend your issue title with [RFC] so that's easier to filter.

+ +

Bug Reports

+ +

Bugs are a reality in software. We can't fix what we don't know about, so please report liberally. If you're not sure if something is a bug or not, feel free to file it anyway.

+ +

Before reporting a bug, please search existing issues and pull requests, as it's possible that someone else has already reported your error. In the off case that you find your issue as fixed/closed, please add a reference to it on your new one.

+ +

Your issue should contain a title and a clear description of the issue. You should also include as much relevant information as possible and a code sample that demonstrates the issue. The goal of a bug report is to make it easy for yourself - and others - to replicate the bug and develop a fix.

+ +

Opening an issue is as easy as following this link and filling out the given template.

+ +

Bug reports may also be sent in the form of a pull request containing a failing test.

+ +

Pull Request

+ +

First and foremost: Source code, documentation, commit messages, review comments, and any other kind of contribution must MUST follow the Coding Guidelines.

+ +

We use the “fork and pull” model described here, where contributors push changes to their personal fork and create pull requests to bring those changes into the source repository.

+ +

Your basic steps to get going:

+ + +

If taking to much time to deliver code, always rebase towards master before asking for a review, and avoid reverse merge commits.

+ +
+ + + + + diff --git a/docs/LICENSE_txt.html b/docs/LICENSE_txt.html new file mode 100644 index 0000000..09250da --- /dev/null +++ b/docs/LICENSE_txt.html @@ -0,0 +1,96 @@ + + + + + + +LICENSE - RDoc Documentation + + + + + + + + + + + + + + + + +
+ +

The MIT License (MIT)

+ +

Copyright © 2021 Mercado Pago

+ +

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.

+ +
+ + + + + diff --git a/docs/Mercadopago.html b/docs/Mercadopago.html new file mode 100644 index 0000000..fce3269 --- /dev/null +++ b/docs/Mercadopago.html @@ -0,0 +1,123 @@ + + + + + + +module Mercadopago - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ module Mercadopago +

+ +
+ +

typed: true

+ +

typed: true

+ +

typed: false

+ +

typed: false

+ +

typed: true

+ +

typed: true

+ +

typed: true

+ +

typed: false

+ +

typed: true

+ +

typed: true

+ +

typed: true

+ +

typed: true

+ +

typed: true

+ +

typed: true

+ +

typed: true

+ +

typed: true

+ +
+ +
+ + + + + +
+
+ + + + diff --git a/docs/Mercadopago/AdvancedPayment.html b/docs/Mercadopago/AdvancedPayment.html new file mode 100644 index 0000000..0430de6 --- /dev/null +++ b/docs/Mercadopago/AdvancedPayment.html @@ -0,0 +1,279 @@ + + + + + + +class Mercadopago::AdvancedPayment - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::AdvancedPayment +

+ +
+ +

Access to Advanced Payments

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ cancel(advanced_payment_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/advanced_payment.rb, line 37
+def cancel(advanced_payment_id, request_options: nil)
+  cancel_data = { status: 'cancelled' }
+  _put(uri: "/v1/advanced_payments/#{advanced_payment_id}", data: cancel_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ capture(advanced_payment_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/advanced_payment.rb, line 25
+def capture(advanced_payment_id, request_options: nil)
+  capture_data = { capture: true }
+  _put(uri: "/v1/advanced_payments/#{advanced_payment_id}", data: capture_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ create(advanced_payment_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/advanced_payment.rb, line 19
+def create(advanced_payment_data, request_options: nil)
+  raise TypeError, 'Param advanced_payment_data must be a Hash' unless advanced_payment_data.is_a?(Hash)
+
+  _post(uri: '/v1/advanced_payments', data: advanced_payment_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ get(advanced_payment_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/advanced_payment.rb, line 15
+def get(advanced_payment_id, request_options: nil)
+  _get(uri: "/v1/advanced_payments/#{advanced_payment_id}", request_options: request_options)
+end
+
+
+ + +
+ + + +
+
+ update(advanced_payment_id, advanced_payment_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/advanced_payment.rb, line 30
+def update(advanced_payment_id, advanced_payment_data, request_options: nil)
+  raise TypeError, 'Param advanced_payment_data must be a Hash' unless advanced_payment_data.is_a?(Hash)
+
+  _put(uri: "/v1/advanced_payments/#{advanced_payment_id}", data: advanced_payment_data,
+       request_options: request_options)
+end
+
+
+ + +
+ +
+
+ update_release_date(advanced_payment_id, release_date, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/advanced_payment.rb, line 42
+def update_release_date(advanced_payment_id, release_date, request_options: nil)
+  disbursement_data = { money_release_date: release_date.strftime('%Y-%m-%d %H:%M:%S.%f') }
+  _post(uri: "/v1/advanced_payments/#{advanced_payment_id}/disburses", data: disbursement_data,
+        request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/Card.html b/docs/Mercadopago/Card.html new file mode 100644 index 0000000..a7a4042 --- /dev/null +++ b/docs/Mercadopago/Card.html @@ -0,0 +1,204 @@ + + + + + + +class Mercadopago::Card - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::Card +

+ +
+ +

This class must be used in conjunction with the Customer class. [Click here for more infos](www.mercadopago.com/developers/en/guides/online-payments/web-tokenize-checkout/customers-and-cards)

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(customer_id, card_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/card.rb, line 17
+def create(customer_id, card_data, request_options: nil)
+  raise TypeError, 'Param card_data must be a Hash' if card_data.nil? || !card_data.is_a?(Hash)
+
+  _post(uri: "/v1/customers/#{customer_id}/cards/", data: card_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ delete(customer_id, card_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/card.rb, line 23
+def delete(customer_id, card_id, request_options: nil)
+  _delete(uri: "/v1/customers/#{customer_id}/cards/#{card_id}", request_options: request_options)
+end
+
+
+ + +
+ +
+
+ get(customer_id, card_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/card.rb, line 13
+def get(customer_id, card_id, request_options: nil)
+  _get(uri: "/v1/customers/#{customer_id}/cards/#{card_id}", request_options: request_options)
+end
+
+
+ + +
+ +
+
+ list(customer_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/card.rb, line 27
+def list(customer_id, request_options: nil)
+  _get(uri: "/v1/customers/#{customer_id}/cards", request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/CardToken.html b/docs/Mercadopago/CardToken.html new file mode 100644 index 0000000..ff62602 --- /dev/null +++ b/docs/Mercadopago/CardToken.html @@ -0,0 +1,160 @@ + + + + + + +class Mercadopago::CardToken - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::CardToken +

+ +
+ +

This class will allow you to send your customers card data for Mercado Pago server and receive a token to complete the payments transactions.

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(card_token_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/card_token.rb, line 13
+def create(card_token_data, request_options: nil)
+  raise TypeError, 'Param card_token_data must be a Hash' unless card_token_data.is_a?(Hash)
+
+  _post(uri: '/v1/card_tokens', data: card_token_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ get(card_token_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/card_token.rb, line 9
+def get(card_token_id, request_options: nil)
+  _get(uri: "/v1/card_tokens/#{card_token_id}", request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/Config.html b/docs/Mercadopago/Config.html new file mode 100644 index 0000000..ec5563f --- /dev/null +++ b/docs/Mercadopago/Config.html @@ -0,0 +1,266 @@ + + + + + + +class Mercadopago::Config - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::Config +

+ +
+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ api_base_url() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/config.rb, line 30
+def api_base_url
+  @@API_BASE_URL
+end
+
+
+ + +
+ +
+
+ mime_form() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/config.rb, line 38
+def mime_form
+  @@MIME_FORM
+end
+
+
+ + +
+ +
+
+ mime_json() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/config.rb, line 34
+def mime_json
+  @@MIME_JSON
+end
+
+
+ + +
+ +
+
+ product_id() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/config.rb, line 22
+def product_id
+  @@PRODUCT_ID
+end
+
+
+ + +
+ +
+
+ tracking_id() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/config.rb, line 26
+def tracking_id
+  @@TRACKING_ID
+end
+
+
+ + +
+ +
+
+ user_agent() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/config.rb, line 18
+def user_agent
+  @@USER_AGENT
+end
+
+
+ + +
+ +
+
+ version() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/config.rb, line 14
+def version
+  @@VERSION
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/Customer.html b/docs/Mercadopago/Customer.html new file mode 100644 index 0000000..4c0f513 --- /dev/null +++ b/docs/Mercadopago/Customer.html @@ -0,0 +1,228 @@ + + + + + + +class Mercadopago::Customer - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::Customer +

+ +
+ +

This will allow your customer to complete their purchases much faster and easily when used in conjunction with the Cards class. [Click here for more infos](mercadopago.com.br/developers/en/guides/online-payments/web-tokenize-checkout/customers-and-cards)

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(customer_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/customer.rb, line 20
+def create(customer_data, request_options: nil)
+  raise TypeError, 'Param customer_data must be a Hash' unless customer_data.is_a?(Hash)
+
+  _post(uri: '/v1/customers', data: customer_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ delete(customer_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/customer.rb, line 32
+def delete(customer_id, request_options: nil)
+  _delete(uri: "/v1/customers/#{customer_id}", request_options: request_options)
+end
+
+
+ + +
+ +
+
+ get(customer_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/customer.rb, line 16
+def get(customer_id, request_options: nil)
+  _get(uri: "/v1/customers/#{customer_id}", request_options: request_options)
+end
+
+
+ + +
+ + + +
+
+ update(customer_id, customer_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/customer.rb, line 26
+def update(customer_id, customer_data, request_options: nil)
+  raise TypeError, 'Param customer_data must be a Hash' unless customer_data.is_a?(Hash)
+
+  _put(uri: "/v1/customers/#{customer_id}", data: customer_data, request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/DisbursementRefund.html b/docs/Mercadopago/DisbursementRefund.html new file mode 100644 index 0000000..20082eb --- /dev/null +++ b/docs/Mercadopago/DisbursementRefund.html @@ -0,0 +1,183 @@ + + + + + + +class Mercadopago::DisbursementRefund - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::DisbursementRefund +

+ +
+ +

Access to Advanced Payments Refunds

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(advanced_payment_id, disbursement_id, amount: nil, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/disbursement_refund.rb, line 17
+def create(advanced_payment_id, disbursement_id, amount: nil, request_options: nil)
+  disbursement_refund_data = amount.nil? ? nil : { amount: amount }
+
+  _post(uri: "/v1/advanced_payments/#{advanced_payment_id}/disbursements/#{disbursement_id}/refunds",
+        data: disbursement_refund_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ create_all(advanced_payment_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/disbursement_refund.rb, line 13
+def create_all(advanced_payment_id, request_options: nil)
+  _post(uri: "/v1/advanced_payments/#{advanced_payment_id}/refunds", request_options: request_options)
+end
+
+
+ + +
+ +
+
+ list(advanced_payment_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/disbursement_refund.rb, line 9
+def list(advanced_payment_id, request_options: nil)
+  _get(uri: "/v1/advanced_payments/#{advanced_payment_id}/refunds", request_options: nil)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/HttpClient.html b/docs/Mercadopago/HttpClient.html new file mode 100644 index 0000000..9b1442c --- /dev/null +++ b/docs/Mercadopago/HttpClient.html @@ -0,0 +1,249 @@ + + + + + + +class Mercadopago::HttpClient - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::HttpClient +

+ +
+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ delete(url:, headers:, timeout: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/http/http_client.rb, line 61
+def delete(url:, headers:, timeout: nil)
+  result = RestClient::Request.execute(method: 'delete', url: url, headers: headers, timeout: timeout)
+  {
+    status: result.code,
+    response: JSON.parse(result.body)
+  }
+rescue RestClient::Exception => e
+  {
+    status: e.http_code,
+    response: JSON.parse(e.response.body)
+  }
+end
+
+
+ + +
+ +
+
+ get(url:, headers:, params: nil, timeout: nil, maxretries: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/http/http_client.rb, line 9
+def get(url:, headers:, params: nil, timeout: nil, maxretries: nil)
+  try = 0
+  headers = {} if headers.nil?
+  headers[:params] = params unless params.nil?
+
+  begin
+    result = RestClient::Request.execute(method: :get, url: url, headers: headers, timeout: timeout)
+    {
+      status: result.code,
+      response: JSON.parse(result.body)
+    }
+  rescue RestClient::Exception => e
+    try += 1
+    if [429, 500, 502, 503, 504].include?(e.http_code) && (try < maxretries)
+      sleep(1)
+      retry
+    end
+    {
+      status: e.http_code,
+      response: JSON.parse(e.response.body)
+    }
+  end
+end
+
+
+ + +
+ +
+
+ post(url:, data:, headers:, timeout: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/http/http_client.rb, line 33
+def post(url:, data:, headers:, timeout: nil)
+  result = RestClient::Request.execute(method: :post, url: url, payload: data, headers: headers,
+                                       timeout: timeout)
+  {
+    status: result.code,
+    response: JSON.parse(result.body)
+  }
+rescue RestClient::Exception => e
+  {
+    status: e.http_code,
+    response: JSON.parse(e.response.body)
+  }
+end
+
+
+ + +
+ +
+
+ put(url:, data:, headers:, timeout: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/http/http_client.rb, line 47
+def put(url:, data:, headers:, timeout: nil)
+  result = RestClient::Request.execute(method: :put, url: url, payload: data, headers: headers,
+                                       timeout: timeout)
+  {
+    status: result.code,
+    response: JSON.parse(result.body)
+  }
+rescue RestClient::Exception => e
+  {
+    status: e.http_code,
+    response: JSON.parse(e.response.body)
+  }
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/IdentificationType.html b/docs/Mercadopago/IdentificationType.html new file mode 100644 index 0000000..bdc86e4 --- /dev/null +++ b/docs/Mercadopago/IdentificationType.html @@ -0,0 +1,136 @@ + + + + + + +class Mercadopago::IdentificationType - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::IdentificationType +

+ +
+ +

Access to Identification Types

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ get(request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/identification_type.rb, line 9
+def get(request_options: nil)
+  _get(uri: '/v1/identification_types', request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/MPBase.html b/docs/Mercadopago/MPBase.html new file mode 100644 index 0000000..24c7709 --- /dev/null +++ b/docs/Mercadopago/MPBase.html @@ -0,0 +1,316 @@ + + + + + + +class Mercadopago::MPBase - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::MPBase +

+ +
+ +

Module Base

+ +
+ +
+ + + + + +
+
+

Public Class Methods

+
+ +
+
+ new(request_options, http_client) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/core/mp_base.rb, line 8
+def initialize(request_options, http_client)
+  unless request_options.is_a?(RequestOptions)
+    raise TypeError,
+          'Param request_options must be a RequestOptions object'
+  end
+
+  @request_options = request_options
+  @http_client = http_client
+  @config = Config.new
+end
+
+
+ + +
+ +
+ +
+
+

Public Instance Methods

+
+ +
+
+ _check_headers(request_options = nil, extra_headers = nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/core/mp_base.rb, line 31
+def _check_headers(request_options = nil, extra_headers = nil)
+  headers = request_options.nil? ? request_options.get_headers : @request_options.get_headers
+
+  headers.merge!(extra_headers) unless extra_headers.nil?
+
+  headers
+end
+
+
+ + +
+ +
+
+ _check_request_options(request_options = nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/core/mp_base.rb, line 19
+def _check_request_options(request_options = nil)
+  request_options = @request_options if request_options.nil?
+  unless request_options.is_a?(RequestOptions)
+    raise TypeError,
+          'Param request_options must be a RequestOptions object'
+  end
+
+  request_options.access_token = @request_options.access_token if request_options.access_token.nil?
+
+  request_options
+end
+
+
+ + +
+ +
+
+ _delete(uri:, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/core/mp_base.rb, line 69
+def _delete(uri:, request_options: nil)
+  request_options = _check_request_options(request_options)
+  headers = _check_headers(request_options)
+
+  @http_client.delete(url: @config.api_base_url + uri, headers: headers,
+                      timeout: request_options.connection_timeout)
+end
+
+
+ + +
+ +
+
+ _get(uri:, filters: nil, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/core/mp_base.rb, line 39
+def _get(uri:, filters: nil, request_options: nil)
+  raise TypeError, 'Filters must be a Hash' unless filters.nil? || filters.is_a?(Hash)
+
+  request_options = _check_request_options(request_options)
+  headers = _check_headers(request_options)
+
+  @http_client.get(url: @config.api_base_url + uri, headers: headers, params: filters,
+                   timeout: request_options.connection_timeout, maxretries: request_options.max_retries)
+end
+
+
+ + +
+ +
+
+ _post(uri:, data:, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/core/mp_base.rb, line 49
+def _post(uri:, data:, request_options: nil)
+  raise TypeError, 'Data must be a Hash' unless data.nil? || data.is_a?(Hash)
+
+  request_options = _check_request_options(request_options)
+  headers = _check_headers(request_options, { 'Content-Type': @config.mime_json })
+
+  @http_client.post(url: @config.api_base_url + uri, data: data.to_json, headers: headers,
+                    timeout: request_options.connection_timeout)
+end
+
+
+ + +
+ +
+
+ _put(uri:, data:, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/core/mp_base.rb, line 59
+def _put(uri:, data:, request_options: nil)
+  raise TypeError, 'Data must be a Hash' unless data.nil? || data.is_a?(Hash)
+
+  request_options = _check_request_options(request_options)
+  headers = _check_headers(request_options, { 'Content-Type': @config.mime_json })
+
+  @http_client.put(url: @config.api_base_url + uri, data: data.to_json, headers: headers,
+                   timeout: request_options.connection_timeout)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/MerchantOrder.html b/docs/Mercadopago/MerchantOrder.html new file mode 100644 index 0000000..ca22529 --- /dev/null +++ b/docs/Mercadopago/MerchantOrder.html @@ -0,0 +1,209 @@ + + + + + + +class Mercadopago::MerchantOrder - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::MerchantOrder +

+ +
+ +

This class will allow you to create and manage your orders. You can attach one or more payments in your merchant order.

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(merchant_order_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/merchant_order.rb, line 19
+def create(merchant_order_data, request_options: nil)
+  raise TypeError, 'Param merchant_orders_object must be a Hash' unless merchant_order_data.is_a?(Hash)
+
+  _post(uri: '/merchant_orders', data: merchant_order_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ get(merchant_order_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/merchant_order.rb, line 15
+def get(merchant_order_id, request_options: nil)
+  _get(uri: "/merchant_orders/#{merchant_order_id}", request_options: request_options)
+end
+
+
+ + +
+ + + +
+
+ update(merchant_order_id, merchant_order_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/merchant_order.rb, line 25
+def update(merchant_order_id, merchant_order_data, request_options: nil)
+  raise TypeError, 'Param merchant_orders_object must be a Hash' unless merchant_order_data.is_a?(Hash)
+
+  _put(uri: "/merchant_orders/#{merchant_order_id}", data: merchant_order_data,
+       request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/Payment.html b/docs/Mercadopago/Payment.html new file mode 100644 index 0000000..cde980e --- /dev/null +++ b/docs/Mercadopago/Payment.html @@ -0,0 +1,208 @@ + + + + + + +class Mercadopago::Payment - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::Payment +

+ +
+ +

[Click here for more infos](www.mercadopago.com.br/developers/en/guides/online-payments/checkout-api/introduction/)

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(payment_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/payment.rb, line 23
+def create(payment_data, request_options: nil)
+  raise TypeError, 'Param payment_data must be a Hash' unless payment_data.is_a?(Hash)
+
+  _post(uri: '/v1/payments/', data: payment_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ get(payment_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/payment.rb, line 19
+def get(payment_id, request_options: nil)
+  _get(uri: "/v1/payments/#{payment_id}", request_options: request_options)
+end
+
+
+ + +
+ + + +
+
+ update(payment_id, payment_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/payment.rb, line 29
+def update(payment_id, payment_data, request_options: nil)
+  raise TypeError, 'Param payment_data must be a Hash' unless payment_data.is_a?(Hash)
+
+  _put(uri: "/v1/payments/#{payment_id}", data: payment_data, request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/PaymentMethods.html b/docs/Mercadopago/PaymentMethods.html new file mode 100644 index 0000000..a06fc46 --- /dev/null +++ b/docs/Mercadopago/PaymentMethods.html @@ -0,0 +1,136 @@ + + + + + + +class Mercadopago::PaymentMethods - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::PaymentMethods +

+ +
+ +

Access to Payment Methods

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ get(request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/payment_methods.rb, line 9
+def get(request_options: nil)
+  _get(uri: '/v1/payment_methods', request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/Preference.html b/docs/Mercadopago/Preference.html new file mode 100644 index 0000000..8ae8899 --- /dev/null +++ b/docs/Mercadopago/Preference.html @@ -0,0 +1,184 @@ + + + + + + +class Mercadopago::Preference - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::Preference +

+ +
+ +

This class will allow you to charge your customers through our web form from any device in a simple, fast and secure way. [Click here for more infos](www.mercadopago.com.br/developers/en/guides/online-payments/checkout-pro/introduction)

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(preference_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/preference.rb, line 14
+def create(preference_data, request_options: nil)
+  raise TypeError, 'Param preference_data must be a Hash' unless preference_data.is_a?(Hash)
+
+  _post(uri: '/checkout/preferences', data: preference_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ get(preference_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/preference.rb, line 10
+def get(preference_id, request_options: nil)
+  _get(uri: "/checkout/preferences/#{preference_id}", request_options: request_options)
+end
+
+
+ + +
+ +
+
+ update(preference_id, preference_data, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/preference.rb, line 20
+def update(preference_id, preference_data, request_options: nil)
+  raise TypeError, 'Param preference_data must be a Hash' unless preference_data.is_a?(Hash)
+
+  _put(uri: "/checkout/preferences/#{preference_id}", data: preference_data, request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/Refund.html b/docs/Mercadopago/Refund.html new file mode 100644 index 0000000..3080ce4 --- /dev/null +++ b/docs/Mercadopago/Refund.html @@ -0,0 +1,160 @@ + + + + + + +class Mercadopago::Refund - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::Refund +

+ +
+ +

[Click here for more infos](www.mercadopago.com.br/developers/en/guides/manage-account/account/cancellations-and-refunds#bookmark_refunds)

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ create(payment_id, refund_data: nil, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/refund.rb, line 18
+def create(payment_id, refund_data: nil, request_options: nil)
+  raise TypeError, 'Param refund_data must be a Hash' unless refund_data.nil? || refund_data.is_a?(Hash)
+
+  _post(uri: "/v1/payments/#{payment_id}/refunds", data: refund_data, request_options: request_options)
+end
+
+
+ + +
+ +
+
+ list(payment_id, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/refund.rb, line 14
+def list(payment_id, request_options: nil)
+  _get(uri: "/v1/payments/#{payment_id}/refunds", request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/RequestOptions.html b/docs/Mercadopago/RequestOptions.html new file mode 100644 index 0000000..c2514ce --- /dev/null +++ b/docs/Mercadopago/RequestOptions.html @@ -0,0 +1,433 @@ + + + + + + +class Mercadopago::RequestOptions - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::RequestOptions +

+ +
+ +
+ +
+ + + +
+
+

Attributes

+
+ +
+
+ access_token[R] +
+ +
+ +
+
+
+
+ connection_timeout[R] +
+ +
+ +
+
+
+
+ corporation_id[R] +
+ +
+ +
+
+
+
+ custom_headers[R] +
+ +
+ +
+
+
+
+ integrator_id[R] +
+ +
+ +
+
+
+
+ max_retries[R] +
+ +
+ +
+
+
+
+ platform_id[R] +
+ +
+ +
+
+
+ + +
+
+

Public Class Methods

+
+ +
+
+ new(access_token: nil, connection_timeout: 60.0, custom_headers: nil, corporation_id: nil, integrator_id: nil, platform_id: nil, max_retries: 3) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 9
+def initialize(access_token: nil,
+               connection_timeout: 60.0,
+               custom_headers: nil,
+               corporation_id: nil,
+               integrator_id: nil,
+               platform_id: nil,
+               max_retries: 3)
+  self.access_token = access_token
+  self.connection_timeout = connection_timeout
+  self.custom_headers = custom_headers
+  self.corporation_id = corporation_id
+  self.integrator_id = integrator_id
+  self.platform_id = platform_id
+  self.max_retries = max_retries
+
+  @config = Config.new
+end
+
+
+ + +
+ +
+ +
+
+

Public Instance Methods

+
+ +
+
+ access_token=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 43
+def access_token=(value)
+  raise TypeError, 'Param access_token must be a String' unless access_token.nil? || value.is_a?(String)
+
+  @access_token = value
+end
+
+
+ + +
+ +
+
+ connection_timeout=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 55
+def connection_timeout=(value)
+  raise TypeError, 'Param connection_timeout must be a Float' unless value.is_a?(Float)
+
+  @connection_timeout = value
+end
+
+
+ + +
+ +
+
+ corporation_id=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 61
+def corporation_id=(value)
+  raise TypeError, 'Param corporation_id must be a String' unless value.nil? || value.is_a?(String)
+
+  @corporation_id = value
+end
+
+
+ + +
+ +
+
+ custom_headers=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 49
+def custom_headers=(value)
+  raise TypeError, 'Param custom_headers must be a Hash' unless value.nil? || value.is_a?(Hash)
+
+  @custom_headers = value
+end
+
+
+ + +
+ +
+
+ get_headers() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 27
+def get_headers
+  headers = { 'Authorization': "Bearer #{@access_token}",
+              'x-product-id' => @config.product_id,
+              'x-tracking-id' => @config.tracking_id,
+              'User-Agent' => @config.user_agent,
+              'Accept': @config.mime_json }
+
+  headers['x-corporation-id'] = @corporation_id unless @corporation_id.nil?
+  headers['x-integrator-id'] = @integrator_id unless @integrator_id.nil?
+  headers['x-platform-id'] = @platform_id unless @platform_id.nil?
+
+  headers.merge(@custom_headers) unless @custom_headers.nil?
+
+  headers
+end
+
+
+ + +
+ +
+
+ integrator_id=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 67
+def integrator_id=(value)
+  raise TypeError, 'Param integrator_id must be a String' unless value.nil? || value.is_a?(String)
+
+  @integrator_id = value
+end
+
+
+ + +
+ +
+
+ max_retries=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 79
+def max_retries=(value)
+  raise TypeError, 'Param max_retries must be a Integer' unless value.is_a?(Integer)
+
+  @max_retries = value
+end
+
+
+ + +
+ +
+
+ platform_id=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/config/request_options.rb, line 73
+def platform_id=(value)
+  raise TypeError, 'Param platform_id must be a String' unless value.nil? || value.is_a?(String)
+
+  @platform_id = value
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/SDK.html b/docs/Mercadopago/SDK.html new file mode 100644 index 0000000..3e14714 --- /dev/null +++ b/docs/Mercadopago/SDK.html @@ -0,0 +1,528 @@ + + + + + + +class Mercadopago::SDK - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::SDK +

+ +
+ +
+ +
+ + + +
+
+

Attributes

+
+ +
+
+ access_token[R] +
+ +
+ +
+
+
+
+ http_client[R] +
+ +
+ +
+
+
+ + +
+
+

Public Class Methods

+
+ +
+
+ new(access_token, http_client: nil, request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 8
+def initialize(access_token, http_client: nil, request_options: nil)
+  self.access_token = access_token
+  self.http_client = http_client.nil? ? HttpClient.new : http_client
+  self.request_options = request_options.nil? ? RequestOptions.new(access_token: access_token) : request_options
+end
+
+
+ + +
+ +
+ +
+
+

Public Instance Methods

+
+ +
+
+ access_token=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 62
+def access_token=(value)
+  raise TypeError, 'Param access_token must be a String' unless value.is_a?(String)
+
+  @access_token = value
+end
+
+
+ + +
+ +
+
+ advanced_payment() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 14
+def advanced_payment
+  AdvancedPayment.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ card() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 18
+def card
+  Card.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ card_token() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 22
+def card_token
+  CardToken.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ customer() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 26
+def customer
+  Customer.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ disbursement_refund() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 30
+def disbursement_refund
+  DisbursementRefund.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ http_client=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 68
+def http_client=(value)
+  raise TypeError, 'Param http_client must be a implementation of HttpClient' unless value.is_a?(HttpClient)
+
+  @http_client = value
+end
+
+
+ + +
+ +
+
+ identification_type() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 38
+def identification_type
+  IdentificationType.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ merchant_order() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 42
+def merchant_order
+  MerchantOrder.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ payment() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 46
+def payment
+  Payment.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ payment_methods() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 50
+def payment_methods
+  PaymentMethods.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ preference() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 54
+def preference
+  Preference.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ refund() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 58
+def refund
+  Refund.new(request_options, http_client)
+end
+
+
+ + +
+ +
+
+ request_options() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 80
+def request_options
+  @request_options.access_token = @access_token if @request_options.access_token.nil?
+  @request_options
+end
+
+
+ + +
+ +
+
+ request_options=(value) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 74
+def request_options=(value)
+  raise TypeError, 'Param request_options must be a RequestOptions object' unless value.is_a?(RequestOptions)
+
+  @request_options = value
+end
+
+
+ + +
+ +
+
+ user() + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/sdk.rb, line 34
+def user
+  User.new(request_options, http_client)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/Mercadopago/User.html b/docs/Mercadopago/User.html new file mode 100644 index 0000000..f5b1af1 --- /dev/null +++ b/docs/Mercadopago/User.html @@ -0,0 +1,136 @@ + + + + + + +class Mercadopago::User - RDoc Documentation + + + + + + + + + + + + + + + + +
+

+ class Mercadopago::User +

+ +
+ +

Access to Users

+ +
+ +
+ + + + + +
+
+

Public Instance Methods

+
+ +
+
+ get(request_options: nil) + click to toggle source +
+ +
+ + +
+
# File lib/mercadopago/resources/user.rb, line 9
+def get(request_options: nil)
+  _get(uri: '/users/me', request_options: request_options)
+end
+
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/README_md.html b/docs/README_md.html new file mode 100644 index 0000000..38ab1d0 --- /dev/null +++ b/docs/README_md.html @@ -0,0 +1,181 @@ + + + + + + +README - RDoc Documentation + + + + + + + + + + + + + + + + +
+ +

Mercado Pago SDK for Ruby

+ +

+ +

This library provides developers with a simple set of bindings to help you integrate Mercado Pago API to a website and start receiving payments.

+ +

💡 Requirements

+ +

Ruby version 2.3 or greater.

+ +

📲 Installation

+ +

Run gem install mercadopago-sdk

+ +

🌟 Getting Started

+ +

First time using Mercado Pago? Create your Mercado Pago account.

+ +

Copy your Access Token in the credentials panel and replace the text YOUR_ACCESS_TOKEN with it.

+ +

Simple usage

+ +

To generate a card token read the Checkout API documentation.

+ +
require 'mercadopago'
+
+sdk = Mercadopago::SDK.new('YOUR_ACCESS_TOKEN')
+
+payment_data = {
+  transaction_amount: 100,
+  token: 'CARD_TOKEN',
+  description: 'Payment description',
+  payment_method_id: 'visa',
+  installments: 1,
+  payer: {
+    email: 'test_user_123456@testuser.com'
+  }
+}
+result = sdk.payment.create(payment_data)
+payment = result[:response]
+
+puts payment
+
+ +

Per-request configuration

+ +

All methods that make API calls accept an optional RequestOptions object. This can be used to configure some special options of the request, such as changing credentials or custom headers.

+ +
require 'mercadopago'
+
+request_options = Mercadopago::RequestOptions.new(access_token: 'YOUR_ACCESS_TOKEN')
+# ...
+
+result = sdk.payment.create(payment_data, request_options: request_options)
+payment = result[:response]
+
+ +

📚 Documentation

+ +

Visit our Dev Site for further information regarding: - APIs - Checkout Pro - Checkout API - Web Tokenize Checkout

+ +

Check our official code reference to explore all available functionalities.

+ +

🤝 Contributing

+ +

All contributions are welcome, ranging from people wanting to triage issues, others wanting to write documentation, to people wanting to contribute code.

+ +

Please read and follow our contribution guidelines. Contributions not following this guidelines will be disregarded. The guidelines are in place to make all of our lives easier and make contribution a consistent process for everyone.

+ +

❤️ Support

+ +

If you require technical support, please contact our support team at developers.mercadopago.com.

+ +

🏻 License

+ +
MIT license. Copyright (c) 2021 - Mercado Pago / Mercado Libre
+For more information, see the LICENSE file.
+ +
+ + + + + diff --git a/docs/created.rid b/docs/created.rid new file mode 100644 index 0000000..cc0e60d --- /dev/null +++ b/docs/created.rid @@ -0,0 +1,25 @@ +Mon, 22 Mar 2021 12:01:51 -0300 +CODE_OF_CONDUCT.md Tue, 16 Mar 2021 08:22:05 -0300 +mercadopago-sdk-2.0.0.gem Tue, 16 Mar 2021 08:26:19 -0300 +README.md Mon, 22 Mar 2021 10:59:38 -0300 +CONTRIBUTING.md Mon, 22 Mar 2021 10:28:39 -0300 +lib/mercadopago/core/mp_base.rb Mon, 15 Mar 2021 14:37:53 -0300 +lib/mercadopago/config/request_options.rb Wed, 17 Mar 2021 09:12:20 -0300 +lib/mercadopago/config/config.rb Mon, 15 Mar 2021 09:05:43 -0300 +lib/mercadopago/resources/payment.rb Wed, 17 Mar 2021 08:50:55 -0300 +lib/mercadopago/resources/refund.rb Wed, 17 Mar 2021 08:52:40 -0300 +lib/mercadopago/resources/identification_type.rb Mon, 15 Mar 2021 09:05:43 -0300 +lib/mercadopago/resources/merchant_order.rb Wed, 17 Mar 2021 08:50:18 -0300 +lib/mercadopago/resources/customer.rb Wed, 17 Mar 2021 08:49:34 -0300 +lib/mercadopago/resources/disbursement_refund.rb Wed, 17 Mar 2021 08:41:31 -0300 +lib/mercadopago/resources/card.rb Wed, 17 Mar 2021 08:49:08 -0300 +lib/mercadopago/resources/payment_methods.rb Mon, 15 Mar 2021 09:05:43 -0300 +lib/mercadopago/resources/card_token.rb Wed, 17 Mar 2021 08:48:21 -0300 +lib/mercadopago/resources/preference.rb Wed, 17 Mar 2021 08:51:15 -0300 +lib/mercadopago/resources/user.rb Mon, 15 Mar 2021 09:05:43 -0300 +lib/mercadopago/resources/advanced_payment.rb Wed, 17 Mar 2021 09:28:02 -0300 +lib/mercadopago/http/http_client.rb Wed, 17 Mar 2021 09:35:21 -0300 +lib/mercadopago/sdk.rb Tue, 16 Mar 2021 16:47:42 -0300 +lib/mercadopago.rb Tue, 16 Mar 2021 16:46:49 -0300 +LICENSE.txt Tue, 16 Mar 2021 08:22:30 -0300 +CODING_GUIDELINES.md Mon, 22 Mar 2021 10:32:48 -0300 diff --git a/docs/css/fonts.css b/docs/css/fonts.css new file mode 100644 index 0000000..57302b5 --- /dev/null +++ b/docs/css/fonts.css @@ -0,0 +1,167 @@ +/* + * Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + * with Reserved Font Name "Source". All Rights Reserved. Source is a + * trademark of Adobe Systems Incorporated in the United States and/or other + * countries. + * + * This Font Software is licensed under the SIL Open Font License, Version + * 1.1. + * + * This license is copied below, and is also available with a FAQ at: + * http://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), + local("SourceCodePro-Regular"), + url("../fonts/SourceCodePro-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), + local("SourceCodePro-Bold"), + url("../fonts/SourceCodePro-Bold.ttf") format("truetype"); +} + +/* + * Copyright (c) 2010, Łukasz Dziedzic (dziedzic@typoland.com), + * with Reserved Font Name Lato. + * + * This Font Software is licensed under the SIL Open Font License, Version + * 1.1. + * + * This license is copied below, and is also available with a FAQ at: + * http://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 300; + src: local("Lato Light"), + local("Lato-Light"), + url("../fonts/Lato-Light.ttf") format("truetype"); +} + +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 300; + src: local("Lato Light Italic"), + local("Lato-LightItalic"), + url("../fonts/Lato-LightItalic.ttf") format("truetype"); +} + +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 700; + src: local("Lato Regular"), + local("Lato-Regular"), + url("../fonts/Lato-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 700; + src: local("Lato Italic"), + local("Lato-Italic"), + url("../fonts/Lato-RegularItalic.ttf") format("truetype"); +} + +/* + * ----------------------------------------------------------- + * SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + * ----------------------------------------------------------- + * + * PREAMBLE + * The goals of the Open Font License (OFL) are to stimulate worldwide + * development of collaborative font projects, to support the font creation + * efforts of academic and linguistic communities, and to provide a free and + * open framework in which fonts may be shared and improved in partnership + * with others. + * + * The OFL allows the licensed fonts to be used, studied, modified and + * redistributed freely as long as they are not sold by themselves. The + * fonts, including any derivative works, can be bundled, embedded, + * redistributed and/or sold with any software provided that any reserved + * names are not used by derivative works. The fonts and derivatives, + * however, cannot be released under any other type of license. The + * requirement for fonts to remain under this license does not apply + * to any document created using the fonts or their derivatives. + * + * DEFINITIONS + * "Font Software" refers to the set of files released by the Copyright + * Holder(s) under this license and clearly marked as such. This may + * include source files, build scripts and documentation. + * + * "Reserved Font Name" refers to any names specified as such after the + * copyright statement(s). + * + * "Original Version" refers to the collection of Font Software components as + * distributed by the Copyright Holder(s). + * + * "Modified Version" refers to any derivative made by adding to, deleting, + * or substituting -- in part or in whole -- any of the components of the + * Original Version, by changing formats or by porting the Font Software to a + * new environment. + * + * "Author" refers to any designer, engineer, programmer, technical + * writer or other person who contributed to the Font Software. + * + * PERMISSION & CONDITIONS + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of the Font Software, to use, study, copy, merge, embed, modify, + * redistribute, and sell modified and unmodified copies of the Font + * Software, subject to the following conditions: + * + * 1) Neither the Font Software nor any of its individual components, + * in Original or Modified Versions, may be sold by itself. + * + * 2) Original or Modified Versions of the Font Software may be bundled, + * redistributed and/or sold with any software, provided that each copy + * contains the above copyright notice and this license. These can be + * included either as stand-alone text files, human-readable headers or + * in the appropriate machine-readable metadata fields within text or + * binary files as long as those fields can be easily viewed by the user. + * + * 3) No Modified Version of the Font Software may use the Reserved Font + * Name(s) unless explicit written permission is granted by the corresponding + * Copyright Holder. This restriction only applies to the primary font name as + * presented to the users. + * + * 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + * Software shall not be used to promote, endorse or advertise any + * Modified Version, except to acknowledge the contribution(s) of the + * Copyright Holder(s) and the Author(s) or with their explicit written + * permission. + * + * 5) The Font Software, modified or unmodified, in part or in whole, + * must be distributed entirely under this license, and must not be + * distributed under any other license. The requirement for fonts to + * remain under this license does not apply to any document created + * using the Font Software. + * + * TERMINATION + * This license becomes null and void if any of the above conditions are + * not met. + * + * DISCLAIMER + * THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + * OTHER DEALINGS IN THE FONT SOFTWARE. + */ + diff --git a/docs/css/rdoc.css b/docs/css/rdoc.css new file mode 100644 index 0000000..35aff77 --- /dev/null +++ b/docs/css/rdoc.css @@ -0,0 +1,619 @@ +/* + * "Darkfish" Rdoc CSS + * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $ + * + * Author: Michael Granger + * + */ + +/* vim: ft=css et sw=2 ts=2 sts=2 */ +/* Base Green is: #6C8C22 */ + +.hide { display: none !important; } + +* { padding: 0; margin: 0; } + +body { + background: #fafafa; + font-family: Lato, sans-serif; + font-weight: 300; +} + +h1 span, +h2 span, +h3 span, +h4 span, +h5 span, +h6 span { + position: relative; + + display: none; + padding-left: 1em; + line-height: 0; + vertical-align: baseline; + font-size: 10px; +} + +h1 span { top: -1.3em; } +h2 span { top: -1.2em; } +h3 span { top: -1.0em; } +h4 span { top: -0.8em; } +h5 span { top: -0.5em; } +h6 span { top: -0.5em; } + +h1:hover span, +h2:hover span, +h3:hover span, +h4:hover span, +h5:hover span, +h6:hover span { + display: inline; +} + +h1:target, +h2:target, +h3:target, +h4:target, +h5:target, +h6:target { + margin-left: -10px; + border-left: 10px solid #f1edba; +} + +:link, +:visited { + color: #6C8C22; + text-decoration: none; +} + +:link:hover, +:visited:hover { + border-bottom: 1px dotted #6C8C22; +} + +code, +pre { + font-family: "Source Code Pro", Monaco, monospace; + background-color: rgba(27,31,35,0.05); + padding: 0em 0.2em; + border-radius: 0.2em; +} + +/* @group Generic Classes */ + +.initially-hidden { + display: none; +} + +#search-field { + width: 98%; + background: white; + border: none; + height: 1.5em; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + text-align: left; +} +#search-field:focus { + background: #f1edba; +} +#search-field:-moz-placeholder, +#search-field::-webkit-input-placeholder { + font-weight: bold; + color: #666; +} + +.missing-docs { + font-size: 120%; + background: white url(../images/wrench_orange.png) no-repeat 4px center; + color: #ccc; + line-height: 2em; + border: 1px solid #d00; + opacity: 1; + padding-left: 20px; + text-indent: 24px; + letter-spacing: 3px; + font-weight: bold; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} + +.target-section { + border: 2px solid #dcce90; + border-left-width: 8px; + padding: 0 1em; + background: #fff3c2; +} + +/* @end */ + +/* @group Index Page, Standalone file pages */ +.table-of-contents ul { + margin: 1em; + list-style: none; +} + +.table-of-contents ul ul { + margin-top: 0.25em; +} + +.table-of-contents ul :link, +.table-of-contents ul :visited { + font-size: 16px; +} + +.table-of-contents li { + margin-bottom: 0.25em; +} + +.table-of-contents li .toc-toggle { + width: 16px; + height: 16px; + background: url(../images/add.png) no-repeat; +} + +.table-of-contents li .toc-toggle.open { + background: url(../images/delete.png) no-repeat; +} + +/* @end */ + +/* @group Top-Level Structure */ + +nav { + float: left; + width: 260px; + font-family: Helvetica, sans-serif; + font-size: 14px; +} + +main { + display: block; + margin: 0 2em 5em 260px; + padding-left: 20px; + min-width: 340px; + font-size: 16px; +} + +main h1, +main h2, +main h3, +main h4, +main h5, +main h6 { + font-family: Helvetica, sans-serif; +} + +.table-of-contents main { + margin-left: 2em; +} + +#validator-badges { + clear: both; + margin: 1em 1em 2em; + font-size: smaller; +} + +/* @end */ + +/* @group navigation */ +nav { + margin-bottom: 1em; +} + +nav .nav-section { + margin-top: 2em; + border-top: 2px solid #aaa; + font-size: 90%; + overflow: hidden; +} + +nav h2 { + margin: 0; + padding: 2px 8px 2px 8px; + background-color: #e8e8e8; + color: #555; + font-size: 125%; + text-align: center; +} + +nav h3, +#table-of-contents-navigation { + margin: 0; + padding: 2px 8px 2px 8px; + text-align: right; + background-color: #e8e8e8; + color: #555; +} + +nav ul, +nav dl, +nav p { + padding: 4px 8px 0; + list-style: none; +} + +#project-navigation .nav-section { + margin: 0; + border-top: 0; +} + +#home-section h2 { + text-align: center; +} + +#table-of-contents-navigation { + font-size: 1.2em; + font-weight: bold; + text-align: center; +} + +#search-section { + margin-top: 0; + border-top: 0; +} + +#search-field-wrapper { + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; + padding: 3px 8px; + background-color: #e8e8e8; + color: #555; +} + +ul.link-list li { + white-space: nowrap; + line-height: 1.4em; +} + +ul.link-list .type { + font-size: 8px; + text-transform: uppercase; + color: white; + background: #969696; + padding: 2px 4px; + -webkit-border-radius: 5px; +} + +dl.note-list dt { + float: left; + margin-right: 1em; +} + +.calls-super { + background: url(../images/arrow_up.png) no-repeat right center; +} + +/* @end */ + +/* @group Documentation Section */ +main { + color: #333; +} + +main > h1:first-child, +main > h2:first-child, +main > h3:first-child, +main > h4:first-child, +main > h5:first-child, +main > h6:first-child { + margin-top: 0px; +} + +main sup { + vertical-align: super; + font-size: 0.8em; +} + +/* The heading with the class name */ +main h1[class] { + margin-top: 0; + margin-bottom: 1em; + font-size: 2em; + color: #6C8C22; +} + +main h1 { + margin: 2em 0 0.5em; + font-size: 1.7em; +} + +main h2 { + margin: 2em 0 0.5em; + font-size: 1.5em; +} + +main h3 { + margin: 2em 0 0.5em; + font-size: 1.2em; +} + +main h4 { + margin: 2em 0 0.5em; + font-size: 1.1em; +} + +main h5 { + margin: 2em 0 0.5em; + font-size: 1em; +} + +main h6 { + margin: 2em 0 0.5em; + font-size: 1em; +} + +main p { + margin: 0 0 0.5em; + line-height: 1.4em; +} + +main pre { + margin: 1.2em 0.5em; + padding: 1em; + font-size: 0.8em; +} + +main hr { + margin: 1.5em 1em; + border: 2px solid #ddd; +} + +main blockquote { + margin: 0 2em 1.2em 1.2em; + padding-left: 0.5em; + border-left: 2px solid #ddd; +} + +main ol, +main ul { + margin: 1em 2em; +} + +main li > p { + margin-bottom: 0.5em; +} + +main dl { + margin: 1em 0.5em; +} + +main dt { + margin-bottom: 0.5em; + font-weight: bold; +} + +main dd { + margin: 0 1em 1em 0.5em; +} + +main header h2 { + margin-top: 2em; + border-width: 0; + border-top: 4px solid #bbb; + font-size: 130%; +} + +main header h3 { + margin: 2em 0 1.5em; + border-width: 0; + border-top: 3px solid #bbb; + font-size: 120%; +} + +.documentation-section-title { + position: relative; +} +.documentation-section-title .section-click-top { + position: absolute; + top: 6px; + left: 12px; + font-size: 10px; + color: #9b9877; + visibility: hidden; + padding-left: 0.5px; +} + +.documentation-section-title:hover .section-click-top { + visibility: visible; +} + +.constants-list > dl { + margin: 1em 0 2em; + border: 0; +} + +.constants-list > dl dt { + margin-bottom: 0.75em; + padding-left: 0; + font-family: "Source Code Pro", Monaco, monospace; + font-size: 110%; +} + +.constants-list > dl dt a { + color: inherit; +} + +.constants-list > dl dd { + margin: 0 0 2em 0; + padding: 0; + color: #666; +} + +.documentation-section h2 { + position: relative; +} + +.documentation-section h2 a { + position: absolute; + top: 8px; + right: 10px; + font-size: 12px; + color: #9b9877; + visibility: hidden; +} + +.documentation-section h2:hover a { + visibility: visible; +} + +/* @group Method Details */ + +main .method-source-code { + max-height: 0; + overflow: hidden; + transition-duration: 200ms; + transition-delay: 0ms; + transition-property: all; + transition-timing-function: ease-in-out; +} + +main .method-source-code.active-menu { + max-height: 100vh; +} + +main .method-description .method-calls-super { + color: #333; + font-weight: bold; +} + +main .method-detail { + margin-bottom: 2.5em; + cursor: pointer; +} + +main .method-detail:target { + margin-left: -10px; + border-left: 10px solid #f1edba; +} + +main .method-heading { + position: relative; + font-family: "Source Code Pro", Monaco, monospace; + font-size: 110%; + font-weight: bold; + color: #333; +} +main .method-heading :link, +main .method-heading :visited { + color: inherit; +} +main .method-click-advice { + position: absolute; + top: 2px; + right: 5px; + font-size: 12px; + color: #9b9877; + visibility: hidden; + padding-right: 20px; + line-height: 20px; + background: url(../images/zoom.png) no-repeat right top; +} +main .method-heading:hover .method-click-advice { + visibility: visible; +} + +main .method-alias .method-heading { + color: #666; +} + +main .method-description, +main .aliases { + margin-top: 0.75em; + color: #333; +} + +main .aliases { + padding-top: 4px; + font-style: italic; + cursor: default; +} +main .method-description ul { + margin-left: 1.5em; +} + +main #attribute-method-details .method-detail:hover { + background-color: transparent; + cursor: default; +} +main .attribute-access-type { + text-transform: uppercase; + padding: 0 1em; +} +/* @end */ + +/* @end */ + +/* @group Source Code */ + +pre { + margin: 0.5em 0; + border: 1px dashed #999; + padding: 0.5em; + background: #262626; + color: white; + overflow: auto; +} + +.ruby-constant { color: #7fffd4; background: transparent; } +.ruby-keyword { color: #00ffff; background: transparent; } +.ruby-ivar { color: #eedd82; background: transparent; } +.ruby-operator { color: #00ffee; background: transparent; } +.ruby-identifier { color: #ffdead; background: transparent; } +.ruby-node { color: #ffa07a; background: transparent; } +.ruby-comment { color: #dc0000; background: transparent; } +.ruby-regexp { color: #ffa07a; background: transparent; } +.ruby-value { color: #7fffd4; background: transparent; } + +/* @end */ + + +/* @group search results */ +#search-results { + font-family: Lato, sans-serif; + font-weight: 300; +} + +#search-results .search-match { + font-family: Helvetica, sans-serif; + font-weight: normal; +} + +#search-results .search-selected { + background: #e8e8e8; + border-bottom: 1px solid transparent; +} + +#search-results li { + list-style: none; + border-bottom: 1px solid #aaa; + margin-bottom: 0.5em; +} + +#search-results li:last-child { + border-bottom: none; + margin-bottom: 0; +} + +#search-results li p { + padding: 0; + margin: 0.5em; +} + +#search-results .search-namespace { + font-weight: bold; +} + +#search-results li em { + background: yellow; + font-style: normal; +} + +#search-results pre { + margin: 0.5em; + font-family: "Source Code Pro", Monaco, monospace; +} + +/* @end */ + diff --git a/docs/fonts/Lato-Light.ttf b/docs/fonts/Lato-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b49dd43729d456e489a8f4c8ec323a47ab8b9ae8 GIT binary patch literal 94668 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

FsulxL_Yn=fqW!JSYn4UZz_VI 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 literal 0 HcmV?d00001 diff --git a/docs/fonts/Lato-LightItalic.ttf b/docs/fonts/Lato-LightItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7959fef0756e905627298817d86513fdf26d6922 GIT binary patch literal 94196 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 Sv(kH?wp@?o-S`p3*#7{ysOP%? literal 0 HcmV?d00001 diff --git a/docs/fonts/Lato-Regular.ttf b/docs/fonts/Lato-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..839cd589dc5eba0da98b43451b4ec6c328ca48b8 GIT binary patch literal 96184 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

ucu-&%9a>XM7550A4YWv99%x~0LA&?HZ)eRytM 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 literal 0 HcmV?d00001 diff --git a/docs/fonts/Lato-RegularItalic.ttf b/docs/fonts/Lato-RegularItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bababa09e3fad2aa3e788898e7753ff8d80a8e8f GIT binary patch literal 95316 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 Zdy6Gm=sD%RPg|bPWWD$h#s3t#{x=NUkZJ$` literal 0 HcmV?d00001 diff --git a/docs/fonts/SourceCodePro-Bold.ttf b/docs/fonts/SourceCodePro-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..61e3090c1c6944db11572b8d1e3177402f128c02 GIT binary patch literal 71200 zcmdSCd0?DXxj+7%cQP|sCz;GX$?RKZPclg+``$K7leFoUbfaY{1qxIsi%_s^QfgUS zp(1iCf(t6vs!&^0uHwe!a*^wH5xrKbB6_j<<#PQhOunDzocGN;NxgFAL#c&TCbp}ZtjY{O@+ym0%KyXWRG zGPAvn_e(F__5K~N@BRorZ~n3*op^fZ1>4X6+fT3h4&I~p+jgSCFd%;%pKZb4;hmT6 zxpv2sTmBn=|5TDnZrpYGdE3vuB=;*kuN!|~ed+dVcbBYT58!>wNAh2`{n87DU;7UF zKDS$vx@LA?e&wFF>#9B=G5z->sV2AkiVJp^-uRmjN>b$y(SJaqwX>3q-_SiaeNJ`v ze@i~yYiN=F)n`AgUgusa{EvKC_X7HsN;0+LA3mr1Y2lCf{o341bI;0$`AFhD@mo(V za;LOf(o5$_2Ic*7v`Nxwf{3J(XXK~xt|T9jY4+pd%C<_)%#YRzW0|f*C(9-H!zf8k znk)Y|Fg&!tNXkgvQm@n_wW9q=X%F5%7e79!Oj;}D0lBTx zE-8i2j!9k8uyhGp2Bj$e3ZrK;`t<{+O7N5#jQM@EUnH%^h<9Ve5ot)uVvK321@}{U z+DberjQcEq?ZGpf(Bi}ABlx{sx>))>K2I3&J!u<09Y*W#r4`a{$s#={CDCKKbb<7U z^boEOOOHt}yUcJhX4=W?s^~}HW{PQ%1cnwHyJU@#W(YzME zQdoQOtAFkdV2}Ybo?7zi0z8KS(UsVf-lA8P6u{qun1}M3dkJgI&c7^DC1yMDhT`9>V_q7#MvMcKbQ$b?FDv0sQ` zI>{z&lG2hL_fyggKf5&2v-srF&l~{Vx>dSa`X}iVpd7bw$bAAW&q^Pf|GAaly@RLI zKb`Wb7t~LFo6|k;6{$r2CEoioU~9lSK+dHbSrZ#&7qA=IK6W>|kA0jSW3RB^vfs;f za$X*ir{%Tsth`;mK)zglzkIuVm;A7NO#YI5LVjBQhWxzzbNN+J%Sv6f&Z4W+g>? zez)K25BfX(!~XaA-|xS}f0zHT|Kt8g{h#uG&VSth75~X#ZO{guM*pgSjYnAvTgi4R zvp&kc!2Xr}hP^I3`K(uA)-y%3KFDW%Tz*PEC4XK1j{H;kv`*3)FzZ^(I;4v#vtEH& zPhr;U=Vx8%^?SqKgtyH*=-ueu<=yAK%X=T6^`HF~ztdljS$AO8yZw9oH~8;VX8lS3 zXZ>HqtiP(vS~vGUbHAQ@cJ7;V&&+*&?rU>jnEU+P(YZr&*UViuw`;C{E;8qyGtE`a zmCxzsq{9Cc-YA?d{Jii&;cJDb3tuffRd}*+tngUjk-`THw-s(F+*G)(aAo0&!li{v z&TKrh;mq1IYtBrcnL0CZrs_=jt7l(5`szKe-u3E%SNFYo-K!VBdhV;!ua3Ps^6Iiz z`+oI@)Bk?@#nbB;%Llv+NI`J%FgR#bib)Mp9Mm)kE|La4&VoBOfdb`l_F6e* zZI?Pgsk=a5dqB7PKzE3r4}p^`1C3b$x;6^RJr1riAx(l-tb$xK4Z6ElS_i(q0kmUQ z+6Y>*S=s{bbq=`nc1R27VgCE2J3tfels*jFc@$LTQBbE(OP>O@`mFSM>2uN(pkH5< zj!DO*FF_i43RL=pbW-}N^mXZL(lB%8d9IKyMccKIJ|s}>hw%F< zyd=m6@8?(X>oUkS5~%dkpi>us%1f+|zj3+r0bI`q)w*5!2&-iloK?^m_6PPF`yDue zBz=puu|LVx?2qg$|AZu6&t7N$h5HXmcYy=kEgb|OxlcL-KJWl&r38-fFlge(r2l4D zvzw$V*$tp!ACUI4n?Vz})5-DWP%j5p+K=ixDnXM!=OfW#2(3eQMl)Ocz}>vwG&( zzTvuK{ll|$fq;M6v1eAz9D8QCE-*WbUWWOZV#YUI6t|hOj_K~uQUJ>7z2=4c7p9&g~4zM1?s3F6bJ<{ z&)H!-yDT-nW@Z^?8kkK3os!aV#^fYBF4OO)uUEZgN|_FtUaO8) zZ?3+s`f&B}>X)nEsD7(vPt9xQX7l5i=B-SI^C!1D+$ECp=Gj zQ{EQuZtoM`6W(unpY!$lcKfdL-RwK)JM4SJcii_)-%I|mztP|AAMvmCZ}ac+f5-ol z{}=w({ci>2fGOY(L<7x%gMlM~M+3(KPY1pi_+d~E-WY79WcWMbm%_gYzaF_Pa$V$uk^3SKM;?zn8F?#ub@b-w zUC{@lpNt-lC1P!{!PsPMV{Aw4<%X*pZf>}%;lYMaHXLvGdc$)KKW_L{!y656#rMY# z$B)K87e5hyHvVFwCGq9NGl}ODKTVuToK3u)EKORI{$wiIo*Yg-o^q$6speE~YAm%r zb#CfA>6UbVdS`l1dSCir`bhe<^qUzeQ<-sQ!kNZQcV;B>!OSl*uV>!M%2`v^osDLX zWFO5Q%RZg`UiOFCUp96&zTEhm#y>X}n#!B(O~Iy2Q)koirs<}wO&2#^-E?!)T}=-* zeX{9z)7P7xYx;51ubSRy`fIbHxwhHcoM^r$SCgyHHRM`y{kfI7ncVrg-MPKF{kg*} z!ItY0({{G)?R;t8n)l~Z`S$#9 z{&;($y{&z)eX@OH`~4k;j(r_(b?)kXva6EIuj#&MR> zzij-v@ehvQH~#SW31;+qpMPrNlLO}0$-PL51YPi~&vF}Zv4y2)E7zd8B* zgT3Ar%$XITl2ZK;kEnM{$ZW8 zu5{hXb-UMnZoOfB|N6u0|GdG!;oyeXXUb<%Grcp@Ggr(!G4sut*Jn#-yJvUI9+^Ek z`|`%pjbj@RZhUT2`KDEyj%<2)bN%M#&09fsWa)czZ?b#jhan%B!PCKHmd${3Wb3{P zp`)sIR%xiFhH6Pi4P~!@&cD*wWQpaBx{$G@E!S+fSq-6J^fmo`dh529j%2cfUb5@9 z+X}yVES=A%(;Xd+=+8v`xe3p^ z74!3`q=w3(hB|7f6BFZ8cTj_a8ctz#B=?mhPjS169(Q0cH7BI<7f(ngy!5#D;%dfA z#=Q^MTD%zUUAWp_Y;4MhT66rBGv@Mm*+Tpk%7=_03x3@*w$3!Q$+p(I6R)XFRcp_2 ztg~O}SoaIl&Z<*eFWdSU{^4@!)G6k=>@r#`lltfGlPl!kL5f;|m723Bq!?b&SH4Pm z&6{Y!^J`x@i9M;6qUPF;6H+y1Q(N;@NN4QLlaS7$QY~+fqGuel1gi)IZB}myHo|BN zwPsi>?`65>w$_$RNoz}6zBOm_G6y>m>WeQ+4vY^Z*RMUdX=k**ab06LnjBa;kepe0 zZp(y^{j*Ta+upt^hRziZ-#H8tO$u z0Lvz@5IAyD0LwlJ;WZ%TH~^{ufFyuZidPQz7D7&3X+$J24%8~#b@4kF-tVQY zwc2ydd4S5qELKM^Yi)^!f(E^b8SM^Z6s@6PMs98CmC=VT9M4U%5rFJv`A3=>{Qgj% z+f<#l)JJL^7AL#DI_1wbgoc+#X7jnp);hB%YO~tyiSEeQ8ha?^aQ66X>&u>sWE|e1 zusMwJDQP;mloko!Kz3;ndY#7j2tOl5O)wjPnVMQ_aUI zBSL^@I(l`07~vTq-Hqw~xOMgHG>vsda(3HAU00vND10!E^U@~hvTe{hvcLmV_9VtN zNqWAC3|mvex5kJqqtnMvD6W;*ras`ZBcF5R9Y%*SX1sR$M;wn-PF6nR_{jGDJ$r8d z*zk(v@#D!A!yilC#pNvqTCx>VQyXUMfh?|40dd9+$`i^kvIS=w2Lor?7JBR0v0eDj z>^o1K*a`AObAECz#y$@lMJ-=7;g?O}~6QbiWvm)wnv3a{3%J#CeJX{{^(T{l zyegAx_pV-j-I{oO&2_6+?_Hae1J8?O@U~Q(Z&-Fkdw6^2C^(%wf zrkH!m6?Ij4TE{XCYu2o3(CNW(G0z0{-GX_hp>-?sbkVe2Me|HhLqg0`klqTspWt(> z$Pxo4F6F{(YdH=CaXu>XF3?tGI&!F$m=6(DECHN|qp}f9h)@EuLhLgCRH|jD7Sh<( ziRM(aKQNZPq_<^#Z?M0kdpf>sbMy4okc!8B2U&Tr<@lJW61RdCYVZd*2xt8qEqH3MdLTj8%2_NX&8)g6j2+t{?`%Gl%XNOMzT zv#zwVEWrl$UQ=pxHjd?5r#rm4C_pTAV+{e|PBm;k8`M=~X%*R`RYa&ELfCVPuo>)^ zRuREW0S8bFC*I8RRXEXB!Eq^zI}7e`-Z+)uc;nSsNUXtfiWeeSGI+6rby`AoH7$wy zZjZs?4L@q__Iq06ZaKInoLJH7jr2`tnl_K5G85;v4)5@vTj`3`H6`nV(VVY}-Bep= z%dTt>gt5Zr=E-(Xc;z)~XK!8`Px~-U%(@o~uETy+<76xQWu%1}i&k1p8;w|jp09;C zORiU!53~ksCY>?#&n1rJaC70G+0VPj6163Vr*3=ym3@0R4qbJ_-CO8cI;jV6tp{AI z0GnP7vN3vItmt{2)X=G&OUR81+)e_HI?1A(&=XP?xRC`tHbES!0Iqn6rI5Ho0-+4i zCa)Y$$R|dUa3C=X5l20zI&n@j^3#J&>AXGO9;^#}v@w$kH7);@C6IJAwE8<%Wg92j zJgrez%3tg6+1Qz%=?#1-k&QLjy)IjowfShWIg$=XVyRa>*{HX&q<%%NVIbplr3Yf^ z<<62yUqj9x?a$V^GW~#qEVTj-?#1|}pp$k=6oljWMLR|KMOc-UBJ)@!Yy`BvZ^Lsp- z>02ZC(X%snY#APZGjpjAm!)$d6a7hk91KQ@MC1%TKRklGUM zg?_V;&6r9Y#aijh2D3L7bSC`1M#psc-0tLf-tP=I1g*NGs-`N<1zHn9zu)5bxvk?3 z&DMBNJkZz>j3hm(`bzleo4Ztw%D2MO-4EOLDX?;e^GW(;6YlK%t`m0#e%Fh;8r+eT zZjhQdRAk^`58sJMClU2Lgw+a~NNSpycxVjj7U!W3(w}pd5WB3p%3W1b>8`5&)VCY% z|CeL`@(?q1H(i!%xwNVK%8$wi-`RtC=-?rc^M7F2^L9&C(1+!*%WRxefi1s``Xy z`ABqlQ|o_zyRESaX0@w3div#q)zRLpJr(sDORB~On@6$^c3UzM@qf7RU$e>BXR#DO zCl5N;0lnA@Z;68GdYZPr2%>IkaML#R7O*UO{x!*mzExGmv+Uo)Q zN|99>(%$^cmOxms!SI<844oW?mAE781ZJkfFv;?Y$e(29fiJGuGo4Pa-aY))&qVvu zE?2rQYLgE}r>QF1Kd_+~P0Gu6Ut9R0uaTn)VAKy7Ir;vK{sa4S5};Cdr3`a~P7bb2ysHHKi6j&w z>EqDFN!g;G{zJzP;lF(FZ-0Ad534Dh#WTn7OcQ_RJS8e2(3BLN8x1Ffyoo0$m;u`# zo<+|j2@TpDWO!T1oU;YSjvQgn9ywCz-pdZ}-CNkT7tiX#zLeluR(Lj*Gpbl4HCm%t zMb#CR;#q>z=DDy%&oFa^2U6EPorAgNId-3`bIVX&XM2n7)JSfa#jY<*H?HfCRJh}y zQ1JXnh*6+3c!~PlCAjx@7QJw)z|NC66@n+z9;n=zbQ^+(4%c!Hd2`N^(^*0~SPzFk zto!FjzV+iz99a2b`C#F{Sw-RP!nMqD{uk(MT!Q)eF+V+AW6Hyp%uhjJJYB$rcGiqj zaLFMSER2JspB1_&(HjTG@@TlfWGoMDu!nH}6lt5-YgO`~`Fk*b(%Fa(**Q+t@YVQO zt`F*2h+FSMFpXtd$gA_P(7>TVyUyNs=$aCPK?luxpt-3;XE2mpB_I6l#*M#yXU~u7 zrq)imzx2_Me#woSx*yS+2Qg2gMHWrFTw)>D@Q(OBlPW+3RO&+(tx{!DfeVj(ZXWC!m*&|adixl_4dGfv&zvabWPWXtYq+uQkDJShr1 zZ3g|YfCkKCs$%KTFjWC7-w|QKAzO~16pQUOF;#H~PhqLf?aQLkW!pQ|Yp%OHhgW5G z=Eha4ZdjL2ufJhx)r~XR4_tZPxtCpb?s->YPION5fR_n-LKbdrm|wE9iV(qZv=V&< z-K>PxLc3|>&>^lu`?`Ru*g`5R9($v8%d&>}^35%q4*mL??k*f0Thr>UjpR?(m zxx}|YWMwHlHz^MTMir1O=Pg}|jah?{l`zdJFfE21MBE|dYce1M2SBZ?xTCX8cPFGU z_KXD$g6~2wun4LO`KDNpBK@K*&*Ckeoh`YpuGh?szQ$Dpjny+dqr=;}I=2l+x2`r1 zg{tc+WETOCfcVZ>S*1HO5OsZazY5@+KH~}1mFj6NWZ!~?mE)$cdf7Q13NgnLgOS55Sh>My`HvBRcjUPnCJz0!Wz({T z{+2^*+xEujJHPw=@8yHm>}2Q27DwT4fLb%~F$P#?5$U1qyqy4RFQU;YYDf{JRi16Y zpLRY+J7z{w*-1#(b}5B6&9;$|vn&InGdINx$%i(;2UodjRk}U0A(_jX+!5#6x?I!| z>YHip-klx~4knV>?(EdSc(8wK&)`k1PkEz3Pqp1#T^26)Cp*FoFc_o~TU>R%dau_U zbgo?%AI%4{S%Mc%mIQf?U_NgPP)vs!#1-QJ)!`*$MzM~nzwVU5ADXOom`bXhriuHX{URRs zV%r66_|FeWnJ=Ry@tS+gvRdhc5rLRA_!sIlSR5~k% zKgOn5&-IR+&zEytkAS)px4Cm(Z_W)@Drua8K2$?OQ|7${?h3Eckhho=8_75-j@^Q( z*+Rd1>ES_>x4NXpTRr&TONU=!$37MviN!{uA1kbSg`VAxXNLeYiqBP^ts@ZWiq5_w zMDepPs43apbqh{Ro{{a0L1JiU&4u5y=L-MES_`&WcH;Wk!l;lPzCX7UG3w89I(Uk- zOu(Hqaq{@WD@HysMY{Vwi#_#J;XmYOC*SFx@a6Hq{>Ec2ck}9M^auD z2Z7yYo;QgIQzfh&x}NaV-kFkIEZG^cpY}X2#Dv#m7a8|O-lY~Vv2c*8y9pO2Fi4e@Tz^omO z!62f#PeMWC$e|L?XgD*Ts}FZiBtpx4C6!kmvZbx@_D$Ke{I$kMO$>opBt5y!PvYIIB37K9C+tno0iDO*DZb|cxpZ-%l{ zJ3G40@ek+o{i`N=V}tJQ^rgA3^T!i^>D@jUih4H1Rt^lTtha25hC+kefp&m>7IUiM zun%dlUotC2XcaC?Ld06yom#>><NDeknpiK%6X3!nQ*i8CibB zN(JnNbJgyMk+P|p;Z&UCD48W|TC&rvKXh${u6`t%oydD1XwJA2R%_fI@A^y6wxO`c zIq{iyhH`b`@X)rtv0?*#cCgft7nlJ#o4a0=Q#qHRD$PDtu5i23@9 z_Cr|a145*P_ns_05n=kwCr7q4cg%EpOXR}w($)E3PoOcev$^y9u_W7($u;zr^BITx zH{`70vi2skd8W=68rrre(UNJTJre%XQThAeOY7Csp_tON4Ov1eG^Gc@G61wt>#M=! zNI4_wAY6q+(-hr!uS>V0co731V|Q@%0%+0P!jPT7UUtYmNMNZR9!xa?`smz5G1b{BcWs3)*4LbIy9-|-{FV`GF0oVc8=x9y zcu*E{VQqqnh$l!6W}$h84RAPAl3)-Z^owqR44sN~6yKm9NNbn_^7vT(`wo-e%e z+yqS1z_(t|R6pit)2tjzrlT=yRl8L!34Gsp3<|kc;QouYnnS%TRORqgo1>0^H5iOK zww`m3{Iz%H96n2_v22&2+*oq?IqY^kI}F(LfbRH_H=rzZiR7SwVhOOc20zgpuI(se zXbeDUP(l{CY$2nou!xWrK{hV3g$UbC8SaF&izEvX-bN55K1Y%TDQU#N`EPz+AW+b; zAz{lL3SU-HVrohT(q*RBL`&y^`Z~+|JSJM7(JYynyh*na~ah+B|SYNb~1!o=-pnpyK+DYZe zv$KQ#%+m8tGDjS9U0@em!h?$~xI$_p0hJ^NA)uW9SV;mA9WThBBYaLa?Crb^syGrfJW*68twEE&6$mO+3Y3DPhswA> zeiA3cB9-w|Myy!ihXr@!m7!>sVmZjqSLh%Mk3bd@E{Mg218 z=y1Es7yttVd$T|1Rr+$dJ?_#HOXPUSfa?*ar9V(7VZc-azi1nUAb=`4`E0JY zyj=?qrLsLsj=&OPvGAb7!Oypij({)<(-Ejycmx!47mn|qYb$k;o!x=B-Rp?dXJ-9} z*x6k@UFGH18;xy4g@QP%6iZQ$eJHZSDR`s-{oUQ!P!qOog|8=7;e(e6NBv(MkPu66Lz*kEuZmW^41S$AZx+3WAw)IGGX@u51u-Rkg| z%Uq$1H`v+WNV;aMbyiD7t*Odb?g}>ggPlo4mw@&(VLefK53rf+Nu+#o{cOo$DJD0X zRe}5*YHTTm3X_&bpazWzwZibiJ%Wl0RiH@g6F1yydH+iFGwi|JxOQCh&n z6dPdPoRh0S7z3-?)~!6`P1GmdhgL+>ySBo9a=JO=46x;ZA-7{j=tdoNsFGI32r z69z#}mgh}yx{&YiWTm~Lq{3D?dFPX#VP{{Du8hT2Mqe+$5`|}SJ0PAJz)AUspQ&u3 z20bk@P8mZB^A~~5WN{!xTbS4C@n{EH7S2^M7m}T=$jnx9k5_Nh>-6QNz6%4!N_~mm zp!a@o;_-TYnZ874EUo(#JNui+NHjVYdh}7cjzoS_sCg{3qM>d$_ZVMe1T>%-YjkOR zQL(vcD_BDDmY7*IUUU*Cj!7=QBny^A7Bae$D#HDwu_BwH(NVORAAJ1bTt$6VNx7{& z_246)d$_~oF_j?qtLZ@|zp=`ewAoVDRdauuwxw*gqxxcjm;dPa` z-MDQc?rX4@=`(F@8GV_(!55#{wz0e}5sNvi+_oyVo>kf0RgQ*O(!IK8(oj=pYnV)T z{94II?VGV{+31F0GQ(MZ@yW6<84H7a2w|zVdE5Q zq))Z-m4OeyrbTNczgPqA$d}n5#l#v##3n_@axIpJ7$#XO>1vQEc#;7EA?b=01oyRIIUVws~)4J#8+mNrKBet#8Otfld%Rz(bAo(vufY$&00sS>DddPfM3lf3ZM@YDgedtts* z{I=VeyExu#+uTo(Cv-QgjA3L%E2mRAdx(cTMW#fKa;Jz@L#U)BlB0xBTmp*>;GQfo z2HdN*j4Iq$k}8S!9C*)>g>8l#8hp6$4EBHE|314a|{gwGi|Nw`{JeBx0HAs8=bns*%Bnp!ZwNX z8by3(LW|#0*rFEQsSr+ZK@mM%!52mTa_lf!1TbY)HW85{ezcTgF(DY4C|aKqd14Ut zRErAim>DuN!<3>LSCAtmM+=^oLEY}Pr4_;MwavY=p($(1)0i*Sf95{MT%NsqH(96J zs!Z$k)&^^KWveFCugj7I!|g z@uKE%xS3veOlJoCdHeL(Mwe^j*mSx-katXvZK|wvZekVb*48v$1TDpHc|9b!T`Kk{ zLWTx!Mg7nkG;M>F3st3{oT`c!Rl@{Xx}3nFYP1Lgg$*qf%1}=(x*|qPxivh$h9ZyX zrF*i+R9{^JzSMK*6L&oR_~VB@^O?`w@d^3*+X91r{J*X6v*r2ahYsNvivYeF-7;b_ zM7i{!Tq3H4XFh>~IiTBuiV+N+A4A3{8 zeWx1lkQv28fRqG0!ba@A-SI7duGbUxH}`lWKX)h;TtDS*5R}F&o19i@7`%!CsthTPsk6hx^fU_p*2zDl%@#J{U zX|dG1z3KjJbjV?Da1XDGJGmcdH<-(7@=xIhqIh1!iO>CyybN@Oa(|X-{#iv!(@;T^ zNK`G7v}4$+aSqei`WAji>2w45s}p}=^SO6kRVNXP$gM7d3liTWj!0mbKa)IcQOMku z^u&&ijvW(e_1f=)gx$2N!>3-`>l^!mu~uuo!eNTUq5(^tDeK4wqJ0@RTQ+$e!co>; zH#vFzhD>I|^^?8llXvp`-k$SUM58Ot?@g^}uJc%XDyn+Yx$dfpVT+?aH%fl82c@^! zx8-$!&&N2tl9CH@#edeu*dIlnD*L07r>f+Zu^WMfhrhIwWVn`1XNFSdp(_#HPzMCHkS9cjipj!ZC>@-WN&B>h1whJ>h&Fe(CjIl= zTv1WohP6K;uVPOk*Vn)f@U!?3yNi8IegbRvaXLw>6>^gbfp=SxmZiYb-qx4{E*med zb~{}o5qhz^FlT@98kWZc{&?IUKpvRP<7GrHAbAaNn#r@I`MZUfAi~*6I4A*CqbqSu zGP;toNX{hT$EYClYf;jm5hA0KICzXbUua>`ouB^n&i!pWv1GvDVRnLjQGUDDD7z$? zVL-G!#y*E)64d4fi56`y!%zEt?x(#SA0%66w>%EHHipU(A~%@NdWl_OiRs9{*u+?@ zWKdiMMPrjjU#4W7dC;aga8;|Dh%13kNm83V*U2bZlv0Rz#CkLa?Jv}OC=~QGIu0YG zLbg`xjfUE)h_k7qs>IqGu|`a+#PDI5!cVs)f=Sk#+O}n_&rvI1sy8BqBwbe1eO?}W z(>QmG$8+jn?1-p)qpVU3PEe>28h|07_ORXx#P4Ek?|t{RG&F4(j7A66Hzg2R7-lw4 z*M^S1b**->2PdRIu%qlJwZuIn=`VZ_zB?CUw@4+x&5y{mC(mM^_Q_|lC(ijjxeYYo z-#JZqlz*lhG$F%j!dZnToE0%cEmgduwIe5wuWfOA_&wU8Ll^a5F+UDQD{3E^Z%-^}zhS;TMeUM|x_pwn2C*mx zSR!|*xV0p2LDLR#5{WWs9t|quqe|DLj*}`OXaR^m7$7;RL`hyeTRyb+!-%ond(++r2oLjfA<7HD zS{gVEv*bQPJCB9uu*IqgwhC@9ZV$gldt^a7!BC8oP};`;D-$0-vtaKQx2t=%xLw^l z(N5!waT2r@z+ZTR5Tkk!r#zs=EG`LR)})PMqDqvSr7YQ|`g4_YIxYat|)Kgrx`d%()~3;o~cw1k499XSDyYCsh2mkNJZ;}VS&@+eRuYeQO z05fh-PfL`zNwg?-OXDUd(bJ{Wrl`RaN#UdrAYu0@oqvz?GV)zT@t%k>p%$vQL3>w+ zD}9=ZHIQep0drP_=4h733)rlV`QXl&F*dK$L5cb=cO=&>%hCFHuG_%6U2cj}p6<#` z_Sbpnc3ofVJPwoZY3G7H zUEHqj>Ed>EPenWJofwDj9magR(ypcK7Q{TS6qj4nTu;3>c4?66rfn=gD*yKR`jf1yX?3Q|0JbH-zF|(>G;K}y* z!%eY(#q4y}MRMU_cgk(4J-@ojVYSpd-N8)2n`%gU+@bDV0b&=?R9d$KGFOxQ4% zmA-rX?eEdPe?j{T^W)sHp#7)w?RPF{KRe%kH??CoYcQYH;PH(B^fJ`9Q}#l!zH9c( zC4L0ulxlti&8s8w5=DM2#R^h1HN;yOfGGZ(qA%$j-?qXX8wv(oRTUK#P?YT%L@ z?S=GDka1o$1~iIzSpD(Ee5L0dY^9cqpF~XGEsiYFup);t?n&3`Z~->ePxe(8Y96Jy|N0$%OFQ z!++!M!(0pfVlo&^(yQ=maZR%Fop^qB?zf16r2yS`j_ZE#mc@^K2tAld(-*rZL0^&Uekbe^+3q=hrmppf-f3c6YYL+ z8*59_K2i)(72o%bV&9=8yj%P2@6o=0K|AfQ80Sujy&H*QC|9i2xW_rYW3 z!dgs(62zf#*(K3(iYZ+4vS~pQBmtHx@vkE%{~_uRIG4=@P}iCA4;nO2tRkyu_5>|MT;Z`Ax+@LEIfn>VS0pZymdFbR zxfL*_$UvOV`E(8NGKwmL7?X#+jpw!t>j~w5DLL*gQ#IRX?Q%B`);K+t4Kb1LZVNc7 z95ofzQZ4Vj&{l12N;~2Km+_-K1ztA0z10>=nVzq+XD$OZ=WT?a_P_?AOj=Q&v{RfW zf}bvu+BD0)@)5;cq{IvxIoN8zHH@>-+M+UZF5m~76n%6}l<-_+=^)*AJL)wP+lJ>s<+Iu|DZ zaD3u<_goGKCISD#Z2%|mjK|FLb2}o=ZIK+%QPe;39{u+(=)VDYDaMa4=>G=V#rOvo z^e6ll{WA;tlWZ#b->dW=0FtNpe9(aTX9{BeZqT)Bbu#*o{+{ec?aag1rRd$Y22`G> z^Fe%X8gz*AAm=4aFQJLIC^lLtx}gy!&04D9jTU2b3TJ~sUL;RS0HcUlKB`zmG6dPL z)u3>SxFJg;Nt{-t0t0182(6InLsSB{=o-c~j%x%Gg`xy<8H;>T&(V!NyuZHn|^rMFc*;Jr+a9N+t#g6FT`FF(a2M0EHb#565B9K3|Vhkc0 z;Q}ZY^nRjI(B6nf*+sjM{fI^hS?)kpaevxF(Z69qf1**M|A!XzCma#|;|ux|j)?vT zsXt)56*LWoO?X|lswaJkhFBcD&aGHM+S4E%{ZlY|s)lwLe<8*Z0i&>3Qq@Il`jWy3 zp?S(B?7p0;1?HQ-iB4&0zye}6RPCs*Dm7igi#< zM26=?G{KiPzY=Ah8qHb~601-(kf>AmAj+5V`D^5ff=!V2qO63-62#CY({EGa{sh_x z4Mj<$h>2Ko*%U}R%UreP=2EYv)0ysySk0CSN}yPpS~0*gDl(3+x2}4g>_j@vB`h?w zt(Q_miV`h8O(_=hc%|Vvo|31lo;qWbR_NbmR>=;7_^nOzbAt6;iDWtVVgZ6(4> zNV3OCtOZVa!KbkXEl)t$NF7*(9jl-#S=R^x+$FyxbwXVejMV?WFo$Ar@X(V_vWJy4 zieIq`o<{L~IW?dkA6tIAh82>}mAMhRnjikCDA!(Zm?;=SVxgj54sIElO6EqsBEKM``ERkQ8 zcs;H-P$;oj5LG&)oC}ecT!+&TApH`{c~@C2WGT`-nf<$LV}s9S27MHwS(VjMmKai# zUT(OuP*a^D9cmWLJPr`O5qnA^4ecH6DWXP!)l?Vu-Tj;j2*ir93L$%oOdOGY z!;@|}j_|rIobF@=-BIW)<=}7|3foNWOtqm5&(%@A70e6H7PKF6U|N{(O0**%2JNdv zyHm^;R8bzqe2emA6n?y9hqQ(zRBB-kgs69$ z9b)`{Lw~e?w(tV*AprPNeVHn)euM%&jp%DJVgk1*8VL39gmqJa9QlZdu2bqEMTHs3 zMP$y~5c%aVjE{{Sdf|n=d%qLEBF@$p-hAH`@4F8ps5wR+Ej~?=KQuC}5OUxm?HAIa z`BTYzK~E#WM1=5D3)L+kUk91Q5uhhT6KIJ&46}jc8nDrPcz{e>UiK?VNbh^!JuGzi zu#%coE%K12`>yK$#-7(#UA6k-B0q`tPWY&ZP6{7Y*dX=@S_AkG$rQrwb$hjFAH-gx zj*Z%%5o*vlBWOpizSUJ`8NE6o;c2EaV?;}SBCi6aKjj>mi;Vhm zeZ09f(b2PEhVAgIXdYX3$mMkg?8tRtyR(}ZYffbH>&B;VXt>LlzGO?`c@}6&yPbtE zv9tXIE8(9bUe?0Tk;==2O_6w+u=yQOV7u7=r}8q&@%*GNa?!u@uD=v(N2;y!Aw_hq;82r30$DRv+B4{|#cnHsgn|sh6=I4F`wX@p^ zInllx=NmPHfIGZDJ7N{>7oc7EKSci{N0t7I#?QRR`1dN~^O`@L=d_FY7{xd|2Z_&T zM$D&Dv@h--d5`}4=lh4KrV!>Y#?LA`Ml1X`f^LcNKLSQd>s>s4<~_#0R~g^O<1Pq3 z9enmW`cuq|=$~3J zKKUj^|GO9T*Tz?A5{+LY6HOBR@1g!Uh5eAnsWxB(s<59}Ak%3SNr_$48X|O*m9o)D zUPQ1H9pwlPCIzk09inf*%omnDGA_~exgnBDA!V|eyLu67Yb)gz#h|cN*zAUjcNSMi z+Io%0K*r!)qpd_>D;TnG;?(yGo_ zyoEK|5N_;%>geXgiVA)bu_BdDEm9g-sCX2cRu^T2HAfd1Qyt}%3o^tON$fV`=%SP{ z;2e&cyq4p7H^*Hy)`7S4v#rR}6vm4Fi(?(s{)>Gh`;{{(`cupV1WeGf1c4pnwBxxU z{@gy^9yW<~qJ19z+;ga%-R>yvPx^)EA79X)>=~l}!3F&Zr$ztFg8n2siT?LefACoY zaGmPMl*8INZ#z{iquRzRqKqakD!3w47xKDl7Oqp|ZHJYPwE8-zpC-QH8kx2P z7oz}FVLPpW#_#0)sG_OR=7K<)z>8$cL!1q+K3rp@s&W^6E0Vso3j8AM0`7?-_5WvT zRhgv)XSgW!Lnt_-S_3$2IsuzT)O<5wHACttQ50_NfEQbh zsoIw?MUq`utda_BQ2YUoxCkC#B*JNtw$0Gh7HYOKakj!APj9$k)v6meWT;G`-Mwa=hoX%$b4Nkfk02jlP@Sz7 z>vW1zr-8;4WCNf>d>}eRqNbQ83HJ2>GYLt4fSG^w4uTqxBJ>dn!Z!Fc5d90o^vMO&b`%8Iy$dW*?m-Z1XemwKB=TgvO|oTaiuZ%l^r zmwYWf*%>G^?lQ`((%+W6?*c5X*sxE#7hN8juszD0;@&WdQQ!CWImDppZh z65-3Qg-#OYxKxX!L`hF7uKdUo(@-FNp$A`lO-_uZlsb^Cr=qsEF&r;05jogi=P%du zT8329Q2v-H?#gvnCOhgxm4VUmFekAhC7FtbbW#F71HN&5-6%_`T&qQV% zpbYWv!@4j|!gzJ+&i@xv})emF$s+9qm9`R9p3ovKm<(J9(!ECmx zb6z5kD?6Z(yCrrFEm@ef<0{U?)LH~ofq*=TI5GmaRCmq-rll-qbwzD^d|^U!lgZ<# zF4xQZv7V-m%0lm=1ZS}vz6IbPgjiFYe?Zy-Ur}YW#c^Nv(w3pWuu&2}K+mH7Q`per z*qeJ58|7lXP90z9X~aK-UUx5sr}2eMr^!%ie<7n$e<4HNyFlh5Sx?Alu+H#tcz<1o z+Fx#5(4S;U(H|CpqW-Jq`!~Nw|JL{D-|`;)^Y78WP3gbbAEAEl!D9c#y`W}-o&|Uv z+bA+$=4-SnHgWBcC{iQWV?)4N9VgC2k|`dTFiezOqPVp*$2EMN7x&B4w?1g@AAG0C zyb!gZ-t7}yN^Ed+&vw`gk$p-j15H#=C?GfEk~xdAHHmzSVi)AXNMMN~n6Hs9 z)qgvBhX_owqa1aM|sMA_Mx+j{2&=QLaz1BMNRc zp}koDIxEsfwtHqC~T$gf=DV2yKvnh+8wh@k5ShH-PlEQLH>627F=b>@YjN)eBa3(U_Vf&1d~xfAxm??+ryoP}41{U=OQ%UZ^poL?9)u={Hw-KqGP33y615~*$-<(XWqu1;Z8 z8f2G5plZe?3QKY+Ceh;hkhDy-U9A);OnMZMBn+eov?11jg+b`hVn@N>)Cx65;i|Ru z>g3?NmxYY<6qki$7bg1BR2R~1+fH>MS^c}zg(P}S^=c}?`97eod5PgkiM-N)u*B!0 z)#w+3BFXeV4koNSQgHav?Gy|V>UOnmxZnP zW)muBi7dSqu86-!Ez2c(Z?RUZ@nzCm1&(WTrkHU>jZ>hhDi{j(=TWbDs(hd=IOuCi zUfA4)`t$MSTXLN<-QEv2H7C1_XHdejt*O?$xvm~l?djf*c#DACkjK77Xs8B{RBZHV+|2BQE8}w z?-s~5@Vt))3JPa2iUH8+<|QFw7Muap&k)(W_78+6eEE(NookfWqY8CRCMP>^)NkIG zxH$DwCk{ozVF}lp+fr6@Hq`H|4-d??b!-_3_vH%y3oduoGmG7Q3{jbZMqlqBu&A5Y z<)Ruz^YXo-p=&3931wG2n;KNKIxpmNE9cc+)VggXkchLR2VW9mm#U>ueWIE}r5@C6 zQ%g0Tc;Fn*e1Rgjn~l>MVUizbqyzRgzh-4obSG_|OUScAe6=3R#5Gx}Si9o;Tf7n( zyGbRuNN1_xH4EX*!)jnFzz&jB36lWs47gidZEwC76EEfZaPW{bbVi z7ll?X2|d<4*)$nYb&iEKz&9Jet0T-?GQr}hf~t^wgxCOi?f+WIYH=Mac6LD>D-W1d z2XevcHM_k+IW>c(7K5&=THA0@yqIEUMCm7CsHBii1KG)lgI2TR3ilQsm4t5~e%oq} zXDVxpYd}3;8*g2fv4_od@|2;$lP-AFB2aQ!W~9j_ia_C8IzZPdu@{w^Jg&@0+lM8! zx0cYg651(zl`?ttWl(vQ8i+fQok)w&!*Gf+-Kb-QfH1jIDOZXxj1%mJZ$Hn%6otX0 zhgb>wk^BKnMnu&D;dXoxjN*>8g&x|euWb!? zH1D*!YTY$E<(GDMo4q5w|MGQTeU0g7BxBqr-OBEj--34GgLicyT_~fcB4i8;RHHzN zV51ZEXuiBGC|7ZIUJnc9iz0zO_G?qPJL74zdM%#Hp!>#S-e}b8iN)lJ!VBJf+*MUR zT4wNtetl!WQx^)=dB7Q^9|InLl-GflwP8l|edqkVD9F!e1RieMpAx-U>(1i!pT z6+~O;$LmXV_WqE)&Sb4|THLLco$|y;JXUI0uP+IvKF!bR8a($`@&wK)_0`wN6Ng=mE?2YT{PXGB=sH|@YKJ51Hm5>60GOMk+t`n> z4v$86m1C$)S+R_uLF9(II5171)#97tO_(m#tr6t@-Al1Op|8}t+(!M)JF}$~M%hqd zXgF_AWqmN?t+7?qzAWn;W;5&C@5s0uS?B)3Q~pL@O^I%j>-HyDkliVN6*U!J<9|Pg zzyFE<{X4!Fud}z=9WvD(q$)lVu9Uxw`f#`ch{E#R+D4U;Vy{z`qt%m>tL5gX*Bfoq zEo*OIMm}i3;s+RK_xw1h-OtCV!h1B1@{K$;14V*3*zV>?L=1Ft!9cJ@96-&D7vM)i zBp9Es_BUDVnDk5bes(Q#=oZ&Y(}jL{#J5pCQ}{5tVVnhZPVo1FS|0d&;dd}#Tzv86 zwfII&F)l5N&l^mKU5kP7E+VY(xsPCe-$1ORfgv&ke?JGQ=q~vU{C$xBeF~oYkD+FT zf!)pj{xM<)ACqMK{UHDQCb^IO1hJR~b_f6a3vv&>_xXqTn<7W>-R7uo@e*j18J^9B zRD#ncsBa*tDwUw%QqA+KR09EFc=B`gj&iHXj5?&l-NW)rg=27?>Q@m2p-RQH%0@hW_lf&+;E#-9E(>`lFV4I#ytnso-%(YdO)wN{?v%_c0bk^1MRGBI( zOy*KUjXhvb_tudwXfJ5Q%Q#z3Zgs2%jhLqs8hug#r0@}(v6G->)x5?Zio@e%k&HuE zvh5I`uq>|7$ZMzI`#gTX^KzfDwp6D#8Qi-ry8QBBtwk<189lq$7aq=`C>H+b9{;CY zy@zgSpA`I=$3vYsFF8l(?)zsik$?Ru^ign5>4U5f1*h^kw(OGG`{mwGp$YvI9LJe) z71b_6tpLoNqNDlDF*4;Zy|MTFOIk}>=?OfhS-~g3iE8VSV@!NM7FE)-BF38ZBPtO_ zF>qw61Pp|-Oj2-;w1EuD3mc4~o634KwLX`jI1zQ z%npi2$5WK^h4IyTOY`6E5_p7J3xAM5zlHiK=LJ|qYeUQrK27M$BlDECQN^TKPM8}| z+lHkg`EV_pF7bK2zLIHH8_vtU?qr9TzH{E&k#y6z%DIDYik?qwipC{MqXnC>loAK4 zMZBVyjEW7s?iM~v+M*~Zq9$O7ctHbT#lQWnXtZ3>{Wn6XR49~8K805Z_i|S{7)YlB z!L)j%IsQyev%{c?)i_1sDPnJktsAg6q=WPQphE=)KpMBPQ0opS&6`)^OJVEf3w2c{ zlUW|qH8r>+t|~$y%wM4~eEtqlZ3>s6SUmd9uv&uYqWshamh@Dvw>L*GN^Q+um-F^)|oHKG>L(ziW*#6e;knNeoe37C!wZs*hbN|4A8-;`PM09;)M6+VVsL zIdR0G#y2sX!R8agjoD(X&ROT>!!dB-&w>x!sEkFU7vl!zCVZeOR$P{C0UZa1eO3q01NE`1SwmVp5#8L7h^8NpuxqI(|q~s`H@_p}t+?~5~r<^%$ z&di*dNeyQeRCXM!S3gcEx3Q?%h7~u=Bjj@o_|?lv>MfTc>D%N1)2yPb0Z?2Xo^>3+ z*)E^;s>?0vo0mTkmj_3hgx2(*b>yMcQ<_&EzEacNT!YUCP5AAWoz<pe-UtE)o?0$c`bcke*Wre&hR)*Bs$FT#O&K6Uv%qnF87T#G|lxVlSy>eA0u(PwTZ&CS_*=r`)HxnNxelK<&CxDErZAA z(tIU>%C0>N#rZp`v-?`ri+lHG?#{~{E-D+Fc%-(Vbgw@*FE_h4t-`?geb_>Uz&%fK zFK|W*#sbh55jIw1>_qd0Y+I#4YcdMFqZ*Ra*bS&M(5Z^!2DNUoWzM*nb_iXagJ}$U6}O; z&m~E5Y;&42^%a1(vZ^sZX>m5)SI|{G*V^^S_{oT}W?2K8GlgKcGnJGvv6{C0ln zi>5nwW$k!nRt9F3eb|lqAL>tF7gmBNYQc%L2jzTWnw-?Tjw;hewjFW zXI1AuyJ=5jVUqf0x}T@iRgKg%9qy|9QI%cMoB~J=x0jXg-dmenl3HI=e4wDHwC(VC zMQx>x-VEdA+i={R{_;Bi=28x5(G5y57i1ZA4lt-b!Wk47=!y3>d zSH~3WfWqm9YT$XP^}uYC#%$chSl6HR~taG2wCP((SMR!tHG*sc~X};Rm3dNbOEzyYFx$!L{E- ze->(bVIzh%4>;2R>D1NwP%W2dx!p!a_r=C!pbabcsOV`J_|g?)Hbw`riF9A4UEPtL z-cViNJfF8Cdn!LK`;6~IYf*JyiM_Y`$3Ljp`CWd<^X5E3Juky^f~ii}6N_ll+11PG zoPeRTJvTn11A(-?rm}N?ZSDTfN+-Of+P16tQNPuCxV^Nr{cvmR;kHunc57>Qck8aM zF0Ci-w%(+^4;&RiuBh9TgB_PB(iISdN1>*jgK>Gpm>i5-1Ob(cML2y+ZzNfc64l)3 zULs=DTYOoacv8M4=;ES4#i3E^x6tm`f4Dz9kn>})8qb6YD8S5qeovlizc zF6`RX+MSm%h!fu04x_$@(6;~ZeFroj0GDPuT+6bEy$hsSV%@<4sj&n;bP*eLU^557ayfAC|M{y^>f!pZ(G zoW%Ui;N>J=oAz;O1y925;$KlE;yV$KyAk30GA8jE5F+V=#ovm1 z2H?#P|Fve0pHaT}ThWhfT$ld_`dcCXFzSVmKH}lfMtBg-_@ju&-ets}ka(g-r|(Ee z|L%DDj)e5@HtEly9PhruyKE`vppIwxP~of>Zr?1wpYi(K1+4AtX!14xx_)c(oz9bV zr^(Z--f;P^tS3Er&jDB7y6%bB#dx=_drV!V1@4_kdH#g9Hy|GOd?9{X;?2Gn*#}48 za!knpx2>rH^HC`FD$L0_`|RG7C-Fll$Ggui0k@ugc6XU_h5)}eJ$6nSS_~)b%e%*< zA4U1z{XBP>{XDlI-n*aYu6v~%onGU%UvP`#=79Mk;#TL;d$3RQoq9vFes?e5jRG!j zJ@=S;2(P!EdrUpD?}m695Ih-PkbOYJ({+qjZ{kD(%J&0aub+o6*D4lrE z-iU^4q<>vPdhT`DukoW@ESz%mIc_&<{Jhzum%S0hCm5G}XUdno6vXGvf=`2=0pJ1m zFC$*>X;2P6Nq^jvf_T}}a94rAukTb!T0s2uC?`$5`SSOzH$kD%SG5=Z@w==g#~yaO zTWCIZI;~tWYxQi}bk8r4dnsfvmjMIc);5-VX#=+%(m8?$Q8((t3_P6)CwRTfPq2PE zl^iXETi^~??tRhW)3@$8TC%IQsCf6`-2>yrrcwR8(=}iXOy@YHu$GSF74shn+^>Fyukgn@AM<7XcGqLb23-C+ z&Yu6gK6}0t)k2U_)`wv8yvO$oP&*&;4wJ^QdfZh~IdB2VVZO$%LFG9Z2@As?`q9$u zp2gsYo^e-zS@(T7WBmzz#(JgHjX0i#{|Oye6_2|gai7#M!W+SykN+U@KCIL2jK_Td z>Es;!nt0s%5ciPIYscfBQZH6-OS%zfyVu6!9z)zKbzGgqfd;Z>&vDWfYxb@=?On6? zA*nNZbR3`JS8wXUqMoqAn*Cf_QgLtNK)_kFKe4OGvu01aTt2QoZ@n8Zf-aX&Yg&Er z@@e%7>sRGWdK34Xh2wo!AJRRc^8(kNbf3_1z_p3HA9+8i z^8(iN7P230KbpY2U?tO@RNaqEvP25wLE~&R!|3`3b;vPfXD|H-j%{cHJ z=YJl@*rEcR1LuD*42Pc!ho6pf!lRsy(#Af!1}q@y87Fhh>^6tNclvx!q_x%-H5JuY zAGXJDs%+ti^l2XUMjYCy>SdkpKbT9J&BTJ)fz9x<(W(}Hj}LeBqlI*BV1euREp-GpN^OAFx? zuJ<#PVz&bp8F9WUCK$yVl!u0J4?EUAkP^2!;iv@V&nV3D=jLYhG_^FS_NE*9vi;e` z1v&oQyuSU=_xN7PD;2TN`3PFq_m`8dwX(uDK3f1A8ZSzWS3*F@o%iQ|YpR?%7l>k--&lIYv-d#Tacc~}vD+Tk@b*XZJ;nYLB47vq=V_B)AE0i3P$8`uf+f&XYWNXP|4B2|hbeReD z#!oD4*BAE|Q#YmH$UGjtF57Ck<1?UA+xoJ8^(~owZL0S``tCzhZEbHH8F{E}>d>xq z%qlk3kNx~;Q{4l&XT9)S>Sc2&@6T^O#Jy!`%Ztz!zweEB+JVveDThzoW02&UG4bMZ z4tSCyW*kq?IsjV;Wzr0Qoy}09Oxp3L4U3ZfJV02hRWk)uSR6lKF)km@`HD;GflD{3 zjDou28vm~P()z+L99_srD%n>*annx!A-l1&H2LnkFCIIlmU6RqH+8k`C{m%3)Jtm( z#pP#i+%?o$R#-HgcdQ#jdvv%~JH{7Ba1UI!drHg|dcoZd^$4_K1MC~>!H0Q=7bKi| zfLf9M1`PZ~>qO=)p6U`|PEEQ{R7L$53~DU+GkPXZ4=B zfnai4b{hVVq^#f8(ll9Ec5u(JVz_r4@84U6?isR)eopulcim%Yrq}gR@1W3kc!b_` zL0U6%t&Tgzf8XjrYeZUid?P*;g_TF)S!z7Co>Iw^T(S^yvogabgp6m8!gSP-ynUhF zggunlz8+ z=C(HurEcg+>F7zhGk0e< zM_}kT&?i@*Pv*P|VCHbs_`A7s?B3k+sLs=*vBOQ-DQFKDV0a}RR}f`F-#G^vZ4BVN zvn%g8bVUJ2GpXZ`*NnBE@z3n9tKB~nIJ4_`HK{%{dTg++Xk6WL>B-85w6kZ^yHDPF zBp8|P&0GqnwbV?Nl;0X&TFJQ$Hjda8KZNbyV7=67#T8s`cGSAfa=nvH!`&UV!qdPH zINUulA_pyXu5&Dhz>~t%!=!K>DXLeGu70&6I>UTe1H)b2{?31>o$Nf>d&6Ku{oxz> zPwtwiIk}^*Xm`CYH~*H|xmyZ$HngXQ7gD>XqsNX!XM56bdQnQVJ(*LKa_NRljQA91 zc5qkaOM&fmr?pq;-YT+qm50UMW6;2+AeGFe(kS8~hBTzOO-g)Jxpj_YCEJTPJ3FyV z-d^eU-1J?-#iORH#}2t#U)HZxHKvarOCRfd^nv%CI<`^v)X7)n1P6|(kNdjw{WZr9 zpDg;}S2mA~q}G&e0)PhSre?IG-nz+Yhv{rxBAE>dkW8^n9>LlQ?nBYj95n#34uDZ3 z@tM-d`%TD=yv>dMXBp_yC>x#o^_odDk0;ZgfIbq8$AYQsnmuh5D(PbSzR0}`bNGA5 zz4*I5skpAKG9@>w$}SvP4%Q|8r1fNLKR$o>@)IXd^yBkEEf41IIrJe{`c2`MI^0$E z@+FST%vchBf&YknK8!{FS$$rO=yj^?o`G>AjTg6()nuhx90WYKahgkH3d{cj@t@)?vo1)Ae%sk7rEC6+Z0Tno&QTATTRd17j@{%;Y%h5|CbJ z9nd|?BQ<_FLsRqPJKBr$%j=t}?V`f`y1ZSbBdz7T?ZUF1SnzJ>uB;iYe+lkX$60m# zxdqvIJ2DOyl;xDx7FE_}Wj0lnG*;y8r~vKn1K>{p=P3Y)2LfNF=ombG z0(IK%?R@U`Sy@JtvpBf=BWH2A+p!90)@re%X2>Dkj9Y~`i}Z7oiSFT@NyW$Wcb61Y zlo#fe=4+DE%d-6YiW<7B>qdwo_(~U~r&r&1U42qgprf>9XFd>vKc96!==n*| zGXuTSsDm5#9vrzsL$2oGiOa4riAI8^bVU;LoBkoDZm4QzcQh~3{Yc>DEw5ZG#gP(vEh{%Et^TLJoD#eE?JB*x zzBt3TUN_L&v-9+Ty>I_eGi}um7(UN}Wz*;0E8jy^-y;XJ)uVj5ovtU&6r8TA5xxIx2c{%xIcQlojRu|Q^ zSM(j-S(;OlpHWoby>tJu)4BOOa&{D?rIx%TyC{1{PF8N-Z8de-$$3>fi)+hrx_4Dn zWhJNO0gVN<<$1lJ_xsSUhcvyLU3z;>GWrovbBHX^%Z5~Tj#MF);mm@rnr12cD@ca9 z_ePVP<|Vv2jHONQ7Mb-{zDC^Fo?4Y#AIPaLXsS)F?P%BZt{-SFD&BRVrM9o+$(qdc z%EEiHvf67aJ3C45^0tGGwFf#YOA1Nvr!Id`y-mFj)pGukp5}V~5qQKQ0I>FX`RY@9 z0+X$~cC}6h_IzM+YoM!Zv43E(t7~8j`5#06SH|-rx6a=P%sakvJC%B+r+_J4z(Btg zpn2{MzR#+yB+g9}2F~RW227CEzu}&fn@N2a5cf3FJRVO&r&FfE{6#>W+B|uW@3R+# ze_xGsPa>W8EmQTl>`MPmeIIW>iiTs=t6%cgm)r`+Wn{i^;DF?RrSEg0mZ?B?;vhin$E?m3)m4{g!}2+vzQ5V??E749 zer{2DaM%Q><-NXdsE3nq1;bVP;PtDvJ8BQi<}u<@=1fGwC!i|6D%Hja^-h`1n5K z+!lkp@X_>rT75I=DDsNWG8Vf%*z)>ldd~-bE+0+br(1T?LDT&Z#_#$*uHKn+9y+NU z{9z$vCrFC?avsZno16`g<)ks6_E^pZ^Uz=UVfCJ*+coU}1%KsI=oI)XKddj(#%0?5 zrMz_vAJzd{`3g19ioY^fUE~y!?f$}rm~x}X@dJl$zy7Va-!M;(ya0|?Rw6$W!{Tww zE;J4F=G}dYuEy9Nte!Ls4UrLsR@N8chx&>aMJT5 z8Y(L4o$ykSeaaibgI`bj7@p|SPMLLmpgFhaL!B~I;M@#ntQgBv+i~e;?X`S|wZ!e( z21wG!f*F>MUzuQ|ordsRMu7L%$@8z+ZYqr-u75RYEbSI3r z|8Y}y>s8thT98k+wf;Hl_uqYfvuu0)k6*a^iq^Yr=bgDV8visA=={nHP(?y%s$w1n zzc|8SYz6U8mVFK^{Q5#ia>v4{mo;t&WNPo;tDpiHcr|$8$)v|MKME|@(n!LO<=_p@ z`&^qJ3yoxL=gD18&++N)C{YC$F6`eAw$QYpd^mhT+PMDyjw+KK)3)%CLDR ze0P}VB#i05W}cI+B1Hp^e<{|W`nY*cwF+?Svc#uZFTtJ~c}}+~l3r(?Gpy{SPn+i~ zt32sh^PH3a-R3_w&$(8^o__(isARfl!6VB&^M?1JdG^74+%(U;8}8NSIT`bv|6ra| ztXHZ|^Ng7!<&>FbeI6&8N%`qkPtr;AoMDwE-EW?=EPv8h%yUltr;@bp;5thtTn6`Ug+M(i4%`4qFP*^BFu#b{`KX?flbt!#v&YoU!W z;%896CX&u0nGH|qh_#@frVt0ugPF)?bUthkM;5~NR1^_Ih+RP%YbdgU?{3hn3*Y_L zK6q7*;B^pB-a?%srNH)h0g`@F=dijvFz(woI5HI6CpEG{)Yr~h5I;GDUd3DLm7v=3 zlD7kG3#g|wN@74#1cX&7GRDJrP}9`<5ab^O3dleBIICwQn_aE*#l7 z+p)5I#^2G~(YuHKz+NO=3$+FTUK}Q7v;kfWjR@hhp}B`dXCtC$hK**N#rGh{96>Y4 z7&G9tnC7KbopTH*Br>9!1Id5nvjwDF*2vue!kBLkzn0_gX7J>2Bx_$oj!s<)>y$iE zEAx1mKoj4T@) z>w7ypx3;!ALTrA=d}OtA@4b}F`!`rHB z+|n$tgc_$cF{zr)8+I85v?R2Rts5b*Aep8)fyIQ*EB62$3Dl+i)@`z-wg#5qA z=s7Tz`I!ZtMNC~Bv2AC8tu5dxs&OSLsBfsj*B~k)hGaAfHO0vh#u+#$kK^|w_=9O} zbXgAe#}i5*pIl8FQr%w(Ut;YJ&MCy}C{^I08d*WimgWc%eJ3S5tQg)=C7j1+8NWkN zJS)g!BL@`-xrgd%6kK~!KW{)@>}|Xl0~W~l>&QW+L2bW+kcw&%@-vD2V`=t( z{vYw@Qep}n=7et7B*Ixdje|hp6b^^j1r6(u>+u%Wq#9n~^)301Fj zH{>Gn04*2tlh`=?rXC_+u4~;Rnn=1o@-KA`Igxo;(y~r(Lk1nWS;w1*bqh+F*E~nb zaiG{lsWi}{h;gOR%}ZVln{ve_38Q4bXAbH&fh2^o*&DEnc1%1#nIm@sp}>9~xdb1Sud^B^QpZV4+=#Z|JJHdCO_~bQ-EV1KHLs=A zX&>RINkM)TBO-?PLMg)Tlut@Ika$gqb)9wt?V}cBUdpvsAGjt1W!>R8>P^Bg+`)QC zMQR>GWd1&D;@ozTwtT}p)JbQM(=n19 zEU#$ngfwJ?k+ft9E~Lbs!`*90K~AEsBqtNEd@pUHVMbmiM-v~m?m>tNw`GKw6q`pn zX@^tenl6caKv=1TU2b=%9n&}9+cvM> z7wGsdvG;TMMmU%lAub5J(1F-t-NcM*b8uKhOM_V6j$4P?4sM?hBUi_>)J}M=mS6D5 z5ycjuAibg<%sNyS{1STNmOMdh+6Ldu_8n&&)xY7OCHEV_eM^AqFDIMO-^A<6w0itrFgqe&6B02zYZ-Q%7KNb)?gJ z_UXd4jx4+U%{IFh58HJu3b^`W1iccjbw}?z28kJi-k3oDOl?xCvO_C(w5xog4ht(X0m*cZ;+g>cmrSR1me_0Y4Y^Qs0qJ@Mt>+u| z-cAZy(6phM-Ue4tHbi2nH6)gH4JD7YOKJyJp@5f4v|rw{7M;QJ;F7# z2t*@O5*@pcFbcgK3)97j*gwz39iq)??~yyU5Ryk|3DTNfi}SOWx`P^b#77jGQS{h$ z?dM>J)S#YT)a6U>#u}tWVZ4<%>Az(HlNPHJPnjYXXus0lpxkUBk4z=8?Lu2`zsEk0 znwao2H6ax_Aop*#zyt#h{jQBG7XuurO=BE0hTehWH}(@Y+%c%J`8;w(|1qT@qRk%D z*bvA>tCB|S3514%0mA86Opb-<^dQ0$9L0t;Z#xte4VTzK<0AoWJ$}mUri4&ExAZ~4$AaOLT+b1!AZkj z&@J0}D=n3A&wsA9qAi^9oYQ&-QhsGettF;)WJtA@izdY@vpP=@<*0|(a97j$QZh9eO5MuYaMj^DhD7#+i6OM5t zl+<+iLFO7bB5>0S%{b@kSkN-p=RhsFuV#C9AjhocG+Lu9k?nLaM4oWQfno(F@~C4I z5>E13J3<+wvMg$<3mT?G%Wnz21UY35>4|an*6v&$xn5>6#AX)$6Yg|zz|jHwA$~6- zJ?j$s5|d0FzG~^zKZKSwGGxC=9Y8)MmYor$Q=iiUf#QrVnN|R~$ZZwz%-mNSpGWY9 zuqD=$h-bD~<{?=w<&{0IU_8;{5*-`$$WOp%5B6lwC#5e$R-{Ik|E2*KTjY+F-Ja30 zw!PyIT1M>KXg^#4y=1IOUEucDq#n6W`lze-hKc>3W7#+yL3xSdAL|ku%eDW8HJ>Ef z<=)YfBLgBIQifOqoUe23={3Mk`Z!}#r|(F#6NDql-wu~h_lsmYs~5s8Oewf@dUax% zbaYzfP}@6q)uZVxGV6|89E>O0lh4<3H zLm8Z3A%`w#tI2JlqkmnSQ25~L`1obJvGB$D^b%xAC$2hW_} zmzoke@me){%Xc`;JAU~8f1d2xJmGTDY~*#ELGSOaB5 zM>w=PkGGtoB_~nWxcK*Kp6%ApcB`8Cs8t<1hzp>0?5FYO6n=4Da0KynNHJsH*J(|58gFN@m_G^khFQFk zGNzG^D|puv~;3XGCXFFLN;; zF-J%T@tMN+G~RNZat^upi?MSEr;tw8Em<<5BD9=aoj@7WIy{0>34yG43a&VYov0_`kP#=OGGTE`VgJv%1rFl>lqrv%0&M>{{;_1? zkSpP!+r}i)uvV5$7bn3zvBot`FLs3DE(a3o5!6C>*>0ESUU-T5D`{{w9&mVyWsy3> z$GFDA4Dc5OMOc!=Fh9A6{5@I!J*7#kbWmYO~JdAx4ji?*J+J27wdv& zLP$Pgjm|8IOJmkam>qb?v*aa55?riM$_NQ-BCYw0HBb`BNt3`S-#Jn!bvSgK(|Mgz znJ*E)jll@)uMRmI}zI&9&qzTOn4=-)kZ%rMut{m5j%7~w7e2Jvl15cgzVA5lXhrhuWhgx zn~yH9Z^Sxc%PSp`=wj#O=r}8Af8l>QnYs~E!3leGa$?pV9~%x%%mlq{u-k2apFJ8r z6Wt6&FM{G-{r|-(b26u+rnW z(6#Be^U*NU!s9V~_AFj#P(t(c-J=^S=(DoCwz#>Bs^?Mo>gpyO_27#qv;#~i{XF3a z*=M6+1jrE~Tbzx8qXFhQdiZU@r*%m~6SG%C7eRhIwuDA42nVdP5d1*O^-y$U4L+Dl z%j?1i+6ORZcnKI99S6IBd1AT=amHj@5EWt3o8Z(oAZv30tk!0)Mi!ROlIaK=>O@WQ zT)PNDM3>JC+SzPiXg;(?aLzzzRtQLV^-OqSflrB004{nv>e{qwU~w@={0xE@07Ym+ z*A#U$#~M%!=`ql<*@SjGARd@C3f%XAaVfF|28wE6*<`>Q4X=bluCNmram1waB6-Xp zUCNDyZ{1vuhBg0zfeevB2*iazP)B39TEt$60BTkiT3-kDkyhg`GQX)y(Hx1UY{rOM ziiHpth2zI^)YCxWi;>{y*u>cE*yO}aPG;RGdEQZ8bpYcm*ol>}q*z!>$=T%4zA>^m>t`kUm`}(PI9>L1}YTqY+Yd+SYa6) zWi*)(!?aq^T-G&6v z=Au2n6j}pn7Qt}Q)ev=Il+jd}4l5?2gRE<>g}3bR+WF;ZWQ};1<_>OdEJdPMHZr!n z2=xYCz>30rf_%g4e|4458{zq-wdHxxW-AJR=qLdY*;@w_gCJW=5zv6{(4xQ$TPHxJ z0hkI-pBS5&flSy<_VDDyh$A0U;ppmeO#8TlRpDP9MhgMJ8uVeC=x}x;(9Vlt-D41q zruN904Tv;R5dswJ&d*E=9<&owuP^onFrLASf%ma#mBu-}>Bnui84Nym(*YMV#*0uHA!Z z7Goc6x{z=PeX%AVISB-nt`t@SEC$AljSB@0qfRTS4Qe&7){h~fbZ$n^E!YO5)Px(* zknJJ#s4!Z>7dC98{FXLXLu>6YHx{&&w}c03X5bI#q~bw$5RI%ymucXv0!Rpmn|w9A zfs7k4GnT_E3o&gRFdr*G5oe&$V4#U&2M}(59s#f>kAWGz+cI?b`Q`AI^q8z192?d2 z34lE!SCI7DR6#}!{grB4`VaIpF*|%=9r#<`&~m*2^9T~<5kn(?R5qf4qv+$IXtn+u zj*~>XCDY3w1=N7i(`&S1(3?^^j7|U|(K`Vp><`&vP-Cwn7jzU^K{`Y>TYAx+R&Cob zB>^|0y}fe%O8OX4ah|k^k^}<}l5A`WRHLf|fmb6N&<)|Wg-8^bqqr@=0NGf^52~8& zvV^1;=ELh+tV8qX)*@T5r4|L{aZL!>_P}v9nAvF)wH~0OVqhW`HpO!gNOMK6U?-u8 zMvc+5L^E79rS$_1S;N~<+AC=C>Sj#aSKeL|w1Dvh;$3Mbi8|Do3=+K=CB5$A(12)y zbV95C_uFI%n9wMiWtTHCNIT4oBaO;{Q3>Tqn{N{wK}wvDEW_GA>u6dM#!)|xs*anr z5PV(y$k@#A_~6)y;514<8k8a1%;f0o>A~rsJvL)cO;4U08wrlsb%QhbUDsxx9-BQn zIX7z~#q{9B?DZHu*n<<-+sDTyM%wJ)br^}w%-ECD_SlK3@v$J{#wLcx=SIdRj@U!U zH!;aU;fb+X6goSpvznsDg2*>&1DN5XD0y&bY(dunicc5HZV zd~n*Hnwy@Q#Mp9hVg$ubj7^MAqn6-_AjX|2Xn1n!`suMFM`zoRX%>-f_U!cFNbtnq z^zk-AIEf}t+d4@HphOvV@Dwx89331Vw~3H=8TQf1@e!mR3Ih5;j5GxtG+ZOF%^n#% zF?fV6aLQ#e(*hR*#MF`CL~wd=yv?4O3J#C)0jL|B4h{oAqy)Orc*LS47#TCclXHkb zI;RTI;Al{T4wwh=f0*ncEuKINS*2!j@ZUI zpb$yHW&$tC!Z^OuWB52jAQf{P#Ek?8$59~oV&clQV6PXl!>d!TTrFb8oBLO|`oD^& zYw!E&TnR6RRyvk8R*{P5aNzIqCwV&lm47}Qw}@S?KIKz5(*yf!Q*b&!8uqf{&?4;8 z&c>8^E_UGVz&RTQ*gsx`lNn2JmP8p&38=ts{wf^$y%W32ZL1cOeZ_jr`fV&$&EtNM1?!KnpzvkutJWW5pYhkN$E}}Yx#CZ)Z&-hV6QLKer}u5v zQ`VE#H$jk}S$}K&3O0T$W2up(S+nlNBFC**h~xq%-3-rTq3>_7EPfjnGhd4HQ(uOY zd+x(t=9gQqueZvCD0h{{x1DqH2?h_^iJS?iM8q4HIMDzq-+aD*aNtV(b)U#Tin z<*Gtesw!2jcB&d>t6EiOJ!Acws#guFQ8lS%)uLL}F11^=sdj9`?o?f>TluYjx4xwU zsz>#zKGm-V)E>20?Nj^J0bCk)$odQGFV$f+sD{+A8c{(ts*b3mYD^td$JMy?yVis1 zgql#3YD%3{(`rV|syTH^omSUbe`WnhU9WCXFH$$Eo7BxXjrk=iq|T^$wV=Z4tXfn{ zYFXW)&Z!maQMIbpR79;?Keql_-KwH0rZ&{3IDhkn|i5wnYvxQT-|~5!tTVm zHLp^yReYwGLjarMVIZ~RYi-qxS0C)GFAQ|epl+v?BMchq;)_tc-O@2elEAF8L- zU#P#tJ@7wLKUROOexiP={zm;w{apR6`aAXa>L1iUs{gJ2N&U0>7xfGEuj(1~Z|dLG z|G^Ep&#Fu6vX4UQ;}yfc6kn<@&6n=W@MYqZKHT%<%k|~q9+7vh&=tO@33#s zH{=`kjrfATQJe*O)Hmik<~!~i_nq)f_$GZ*zLUOb-;8h8H|IO$JMFtJd17vS+&4U( zhDpAzuE8!7j-+pFMLJ@e>#@v@CCr%VM|n5Yn+`KyA_ifzV+@=Yk}!4fOcYZ~sUaPt z4MrA`@?2U-!mQ!>RA&IrS6 z1xa^4u_0-vG8r9pMIxTfZC76-4F&$*hxX8$gxzAE-uc^IvRDSmvg7pPb zXQi+W3Fd@2m{uZj=A0Htm^vrSwW))YxhN(UQa1UWGv{qZ&ZhTQ+MFTbrXk^J7rLx1 z&-3-3=Zo%h>J8G)+jNk5L!9?AZ;L-ls|G|^y9Z1w_xMvLF#)xf64Bpt`g@b#l74u^ zga$jqCf|rDXQW%+j~Hx?1kCRq6B=$9F%%lGOOWGCa zl1c+zQfZ(|Dh+f=rGYL1Hqa$N2D(kT-KJbahk)Pw_M3YArXIhk$8YNKOQQpU?$nU9 z;*10f5=ak{x+uTSNw6w`^gOBS@@qqaO$p9RFfYMb32xH?vELn(h9J}gM5qBls2kQD z^lJnn)CfeV8-h?X211P(gc>p3LD8}ZbpsLV1|rmmL}=0nO!^*;xbC1ZDne7fC{z5_ z2t#Pf>oMi^nDTl}dA+8*UQL+pV6SP9C^!5z?ddb^5eDxLin2qf35C$)?=$)P3_kis zQ%_?O3f=XV1gAyuZ0R85G*;3ubF>`G*m9l(zakLbK~X#1!9AwEdrWAe}&h zbPgnVbRa=O1Id|K0wiZ*iIAL$Wz!_^_wLbPJ!5Dpf zl(xzf+p5#Ctva2wRX<8wbwb@%K6%>8pWe3ecNW_Ujn*+AS~t(#o@c-3IpBHj@jUl= zp8Gw|1D@wSp65Z&^N{Cx*nRdVlmqyB@&wKSKD+6<_`BQl&I>!=4SU{s%Gde2JnwY- pGo+5;j*vY0`#M6LBv3d@nllHAKfbp5;2guR7vH<3!FoQyOfp$!lG!(gVc14NL^gTKGK?&P zAP*7QRYbr6m1RZ|5&5B_;_`f`=$Gw_iin8vTprW;eNNTAxt+=2d;k3Y_z`;U?ds~f zRj1B5b@rB+BuQ1$rIJoMFg!dzwfC-lk4nt?Hd-CibIGO;e*N#|lElu(`yIQ_+<9R8 z<-1Rjq@qPhDlFQ4-nnk+n`Ix6q>5U6?%jLf)H92gZp}(k*$#Z?oKtt6b6|NHBQxvo z@Okm6XMAMuuS4J8B}s;_O489=_noqH&wu~;L&xyhdw8|%Lqk!A{7rnf8Snl3&OG=0 z3obn{jQ1}{Qo$u>oV|Nz^Yv-A#e4zg!jP=}% zBz5dLaP~Rpwp>v0QHkmCyz2CU51w)$_!Zv~Nh<#t`u9n+c2=~rfVSFmdhh&=lgt)S8QWJBdwXCp2SD=&S0=&^nQZ3Du|JOIz zKP2@^6<)La)^ZWegc){7><0Rfy)GZd#Vs+h60}V5FG>6vlJu(dacQHpAUULn^se;0 zbb&OFci+M5SJG~2MA{_{No`U{YL%v>VQEkrK>K&3^YQuV(wR~tMm|;Q$GdZ+E2WGy zEp3<9<2zU2-#IBI?M070_)Y|$M5R)xMG6ASuVCce(%Dj{^f>x$m1b}^gmFf3ze&mh zKI_r4Re609?L&Ba8u0GLcq7vJOpotRVjZtaAHXN=QU)!XrJE#|^aVV30e=Uihomp# z`k-{b^au1A#k_xw^<69N#9AF#(S?}%${(<@A8QbQ+p!AztLAG+VIB0hSBhg5;x8zj zA}wN;+MfZd7*hT=VHNZz*3gM7{Vm`%rTjHwbp*ThE3bZhKmWCW^;Y8>=U~heUm2_> z|1}NBmP#hfc+;BKdcboRAiAIL3GIt`MKJ>H(N^`f{07$8x$^QzW!Sk-;&m>+4&a&j zuL$NvuW794WUo@}RuF5X{T^9)nWS#C(R1iKw0@ei`u@amXpQt4J(r%9mFlEzc)wNZ zl6vr-;F-W(3&)K{$&MYrTKbDLi+_JC{Q~&>E9qYR{R6o02jJR2r2C{dq#xmRoAf>D zY3VNMcC`KhJ#Iq}`s^m@O?>`6w45RRO*+neX#1S>pZI$Nm~;f#b-#3#bcggQ=^N6= zfJ^sF_h5`0q_0WO09Lfa^rCrBW0v$HXb&h*C#=qcIN*Av@|s$KtqNCypZX#=5)=vA z0;U94@tVQD(^`K4NS=zne+PB`6!?87U~xbGj!2KYI@=o~_`E2CBFBkrr**Sc?X-|4=`{RQ{^?uXr9b078Ac+KD*^j`%q`VQ92 zCfPn^)_1Tkvmdb6*&A{#pY;r8y_h%atNE-SmLHXm$xq17$S=q*>m*$fW?h3>`*cBN z)+3npG-kbFW!B{`x6AK}xLREOu1&5pT$j48b$yc0`W?5?UF&vW)@_*e0r$D?i`~~K zv;MsMOYVm->&KN@>z4nv{C}69UVdu%$>k@Ozp?z~wapRwG#99Xt5 zS1wm9moDp;rQF|gZ{=Rj{W|x<+&6Mx&pn=dH1|mENbYmFyK-0LF3){D_iwoia_8he zm^(9f`fHnB+xXi2Yjdy7zBc{Z)N2*5mA?A+t9QJ5_|z1i(aX=h{K(4>y!^43FMavqmoIqvLoc89@~JQHeR=oG+h5-L z@}`$`FEN2R9NPbX`lm?7NsqHv;D7$i*@_HNkl%cgdrmWu4~lU57fU7J4rNj~aIO;4 zTD4@5Y9u3gfmyOhR;gC9fg9F=vYa>*>w%XZ$t(FJzZ3xH2uTf67#uY!#c-x2K=&zd zlO}M{X7H{S@Yz!0rJG6v;@AsS=s^)xDA|X2Tt8xII|_`Ao%Aeq-(%IZvh|u95}@1!6UvPeNp-n z=Q0n1OFaah^04$3aMeepN2JH3qu|m{fa88sdJ-d?i<9_N>2&rMWR<(64}xP!kVnqI zzlWq-@$ZN5lBCn5kMOJb=Pc( z!`@`SW51V34*fQ3VSkpZ*q_+j{2P*VA$x=U5%*Vs|6eX$hqLB-@ctX5!{EI)qx~kF zCbvtUmEL9Nv44}!VHbmkeN?)LeGEL|!xEMw#U>t;N@f-xV(i+b$Jp}ak4b~h$FZZj z?c3syNi61e51lr6gzdl^IfjOa2Y0%dd-#YhFg&~HTXG+A9~#?p$UW@dw{y>tf&jnb zgHsMICEZ7)xy94)@BE_YNbgeJ%IzsjOYIn^fX2aB(EZR7M%b^6fGclG9!ICb*o6Ct zE;zHee(}hqgLOxG2bbzR9{13ZCubIqJULkBSz1D`qLrCq#uuMftIS!CITuCnd9fH} zZt+NO-4SW&&>BNR!r2&w@7=XmkW9-ry42Fx( zQ%4OxkI#d7E)C+@C9#RQ#UaepvlIt9MWu%slcVfmnf`rL?rn*9Oj2=FdX!D|Hu;;0j~NIwY2pnVE+bO%a_wqIeT3ym%H)01h2z*Jqubq@xNAl z<0$jvM0lOOC%fcs`CR#C&gXxplXZJ^x9Z+1*irCsVQt~ng-;cY7Ja?w*`lB6i}W@6 zLH$j|<;63_Uo9yp=`Xpo1^r2(x=NzW$k5$%U&vPF2AJw?TW#Qhbw+l>8@O? ze5}e;HCuJC>ho1kR{f^BxY|+eufER^G@NI6t7fw1R^xu-Qzpr@!Ss34Z_K;QM=h0> zgI38pX??g>uH8_3*e2U{*q*Tc)xN>L-~L=(DgIjP?sAkm_Bft#yyiUMJl`d`id`n0 zI8CnmTo1e6s*lyT)c4kp)<04IcKtuyvb!9orQ4ly_qu1?ci?n<%>A_cdH0L%-+B5y z>pYu0dp#fYT;e(8xyf^v=Rr@-Tk5rVz21bk-8<|(*ZZEY*k|&&eKB9F?;_vd{RRGN zzr)|)Z}#{4{~jm^R0kY^hCp+mH!vAk4D1QK9e6KT95e;p!C0_0cz#Fhc|?Gh0h9K5dK)i67fb7k@m=NWHz!b z@?>;0Iv?E;JtKO4^s?yT=&jLvqhF0a8GSDLLaaCTaO{cL_hLVfy%KvX_RsiY{F(Sq z;{Qw(C2A6`L?m%h;$Y&tzI6OSdHPCTD@F=%}X*}d5hW-rMe%HEW{EBj#fX!e=xPqM$szR|j)^|jWw zTi{H7+WtgGYsVEGuXT2IKHKH$x~uEW?&j_T-7ogE_FUHURBw6jaPNJ+ z|Ll|dO8ZiM8~V2O?d`j??_l5IzMK2*@B3=s*ZZFCd#>+ieJ}P`_wVaJ+W%btO9RqC z>%io|1p_w^JU8%PgAIe@gZl;#4L&^h0+c1!(CpA9L-!B8I4loahW8IYGvXcDJ1UP3 zj@~-@!dTPTMPpBl{dGJseqj8z@%zRf8Gma0hvUB-e|`L&@!Uk|gk{1zk(lV5n4DOg z*fVip;-ZOz6E{xWF>(LIV-rtLJU{W`#2XWTpDdWHo^(t$Og2yUPEJlPPVSjJFnQ7B z!O0sZ@0h%Q^0CRMC!e2uaq@SQf1TPlb?(%qQ&&&jJay01k*TjwJv;T{)Z6PU>)O{1 zuA5o6W!?UDhu7V^?#Xp8u6upjKJA}QOt((=Pft#7nBFnHfBN3(ho`?j{mk_9)4!a4 zZThY0zt6}s3&=byW4zIp!sh2X-q3xC~EyrFu-_=Yn!+_xdO zv329Yjju177B5@;&0=oJz0|ZcytH@euBAtoUV$RnylLB}!pHL+3@zg1NY*_Lp`)UENolB}hAK%% z4J9vv&%c;zWTCWP=hHX0q?;^eQ<2XbWJU6fT-q9sx?E9u$-UdQste4@nexq^2*4h@^<+UxpFkW8s zT-%N9kK(`f8{3|H?m1R?-MUP35HMvyH2Ay;In&%N<72vTga?=b&u*4YS2DfDdV$HCu-CWS zQwv^qWVpK09B@|Gd3-^(zi-sPu{AcDcA9*#TC>$0$auQ?Z4FI!_gvf&uAHoC_IGB! zTo-p69JP@>Esic0uWNTz)q4UKXSC(`cTHJeLtSd1!QB!M)r6;gp4Le1XuG>P88)T2 zg&MZE^_|z8Fc4n73)r7C?Pr{o{QLX@MxuR6yruA1iz0k$(Ko zqTS#AcK5gWINw>0va4aesNria2jrABX9-P$fSzE7`tNji%Y`L{?nKHRk8hp3(=px2 zSRfb(4RtJjq@L5v0*lHzc3Mr5Z02MC3cUDYXaHrGdY*H5yDNgTX|C*13Cm2YXk31{Ak4hD>9~QWfW-7{lsg=?BKy==dGFy?Cxp8Ubw@ zzhzIo?q9df}4he;du zwFq-eL&H|)=%gt*^I(#qhLo5i!Q?2Y*eRv>{3?=@4rM7?~z1gLsbpTaEyWLCO*j%fvb+M;yy2(1y5ub6#8uoU_r`p_;o$j`n z&EGShnmgdT%#|>>qIHg>x2C7Y9kV4{{LW@y+!F2#wU3($^mXADPh>D@%hJZnz*kB3 zVBbrCdrRsn4YVjj-YP4o0qlvS0;~w%Bw4_KRS6y=0S8Ke3zfLi@lk?nHLlcd1Xl@^Wl<( zmu>z2;Bdyng4JP-mcQ$uybZ1O~w7Y*Ol-#<5{l;47=sj&J7`HW! zHzp=pT*0YxrgmJp5DGz@p*Z+vr(3X%H|qa+um-FfWowGy&=8SuqTN5=~9g+!BuTu9ggkx|x@ zWCMXwz?67T9_c3J>o$&$PS&@KMUve=p6Tyt>9;4k{$3kwv^TUlGo#VuSh}vQ!JhCM z>)RKyEgL&MUuqfbZt}$4wn}^7zqJpi`dX9Du-o>ur#VtzUSJzb2Rfs*ws=nG}c8l3H@_E6>I`iPraf zHayJl^K4d_3E;1gy@bcc@%Rt1xcYEeIuo+b|B>&**+Uj)h2lbl@FBqz!5VOw(_=$e zmIsI}5mE=cq1~)Lcq$95`C92aMK!)y$ezsx`|29KTiPRojdgXQI3TfCRaAfHZ%s6W zBKAnOzAo-dSi)_7PdeHVOS|)wS6OOYJ|KJL3t{ahKjJac#$XpG{W6I=6TfT4T@k;7 zvVpUP@KQ!gl0!uXHn#Jf2>3!cPlRFt<%|wdj*mhOfdH=R92^@9iFUJ@N+x@o^aYlY zP+ihzI(VtU-xi9`_5}Rh^NsNVrz14m)Ukgi8J{`5yLqz7wk$;ht*!eO_q01AHQq+o z)Vk_Qe{aeWnY(yy=Hd-;t0i9NNbkOJ$Bx508vVT+(?@&_y_ZxX>_Ud+Uy@s4p)3JU z?o;=plJ=uAPg~1BS4*+p60Da_QB{+zz*ZSZst!T1;^(K8^yakD$F8Y2xT_1Q-G=&K zyw$Vt>utYYWMzA@XSTJSncXw+tbF)5tnJ`wr(zx+%)(GXi9d`ji7lP)A??G#+gsIm^nsYG9%qusiezj?? z!_(G2I^*x#oc;Fa=f|cdH|$>6vT5UP`EX6JE7~|+RZzBWFg2R0W#_kNTarJ|eXnPr ztL^VZzy08A5$L}jct{lNE~F_J=0Q^t&aeiuO{nsghghD#k{qFIh~c+?hI0U}#rY_wM0f(3g%kB{ss9 zA%pfMIRH490(L7iTmxlAq~@s+T6xghJav1>&ha4A}@H`=_;xtzI z4R%_{a%K2bNYx|=sek9NPvySJs&ap36SSyaged!G9yc$4YpBE*e&u-v-<9n8+*7O~_m??5>^H-?U*cIA;D8x85YpDU1_v}bP~d=&zv&dK z1%!`+Kl&66*@+dCJxIk1mwX~(WT49$6iyPII=$D^68BXmYr9hrc${_V$&|0t`0?l6 zdwRR~O-6tpAKjR&v^uIXcCU&d=9(`J<=%A12uT?Hb&_1d_i5~Zu}?<ZXh6m(TQkDg1C8MHdc?`EGNZT4)x`)+p2-FN5qj>x*<;p4|g z@T~PXhyEyE4}8w3YgD#h<2BXv@alXytOU;z`lDiWGeG(?D7w#;&e7mVA6B&2lAh~o zJi;&Yb-~6)ceuEzgV>L6~$l*Dme-)6=yN+gSZoV z4M9T(Xp{=*r&(HW^yy$T+%>Obrfom^?batgNIUQ-8~bN&KU=u`d79r9n4c5#D}?Rw z{pP12GoCJXTkNjcbHywh%AE$5{wPR}V2rW!7|W^A!5W&=c;PYPGT3WX;-L9E`EJs# z3cZxHHF}!Sn$7~Fd4`{iaf$%ty=~H zfq^Zp*{yWlnhkVEYipz30i1cbc9o}=J~};p@y0}Qq#q8+mk)_OngsyIyT*iW*?8~MSkm_`6aMm#teO2DK{#$(00 zLwZL`_6lpXD;VgCT5%gnxkKK>PE&iz3?Y>W-3r?wb!uW+6~dY=t=oJNF*f*lqDyd`fZ z*4nCyV1=-7si5YLRNR@hL+Kf#IFm)J5n~E%~TdHbu?uCf!?G& z?r(8=((zi4t)`@*ygr=uhX&Km<~Z>X7|Z1Z_CT-M5)@OUMxlyv0hmuVX`#!J_QoyJ zbYA%wqPz-Tn3uVDHsnwtDyf* z&zl2HE>}~~yx!BkK9!p7fb^Z)n;wapOwo}vyCt`8WLJ;F(X&hN@+j68#~kwPBx~lN zc@I^Zp*fHp9~>J_6tb2W(>h;talgS)Q&3V}RaJc2!t)T*a<_HtX?Mb??qs`2As`h{ zlGovU_Go9v8h-4iHM<4HQp})G8{L4aumn^Ae~B-XSIv#9z+*8J*2B_PJ}1WKq!Wq@ zJe{R;8M#EKD>Ii4bqtl5%L;VGx~A!!TPF17g}S2h;?Yg=^|?Kf>2P=^{LVWK>*>mF zJ$^PbIy;^CKZoEShA1fsIwbAcRu#|J;6g3Uzn12I6#HB&$-r>((TF?356~aZl!}#> zTC`N5#iXTT#G#|9o`ImWtZyf=YAwro~5}-m<&0&QMTkuh_N7=2+Lg z)~M4NwceZiX6~VfYSS)Py7nQOcM$V#;``jI&U+2qm2*%->U?&tC&Mci0%Pi`slm-6 zzqq*D=rj*@;Jl>#5KI$%$ zZC|&FlCq3!attzhA3Hnu5c?X8av#bCn`GN?)A8R4e12tlANw!)Y0#<_8a_C@qRo>h z86GwArzz6oE6nuMpXT0_pH3YwNO5{RiSI?B1@3#1VXrWznQu4wUgT%qyM^Go8_)aj z%JZm&{M5%tm%$%BuaE>*$dfGd6K2Z2xlevC_1-;rAd}8!4)%Na?n|&cCpl4NxR47m zF+v|9{4yxskcc1`vEtEBkM=hfH1?0mx8*K5a{1*)&=X^JE}ttqmX8r^6+4qM3;0E3 zN6tMo0yx1|^tjx`&Xj*#Q^X({0y2=BVLN&UbeWVcRcE6p<@yyXwPs%w=3Sd~I0EakhuRu$P6N3%gBg~yPd>Y~XNM(-V4ve3~KkgETI|8FT5dB{oVhvo^L}^2=u3ypPGd>HcWIHOK148-rLBO41Cd=8O#9<1EEI2= z28(>u;L?z$R;)e%IUmpg53BjoO;A0G_?DWmV3LF&{o>Bf@5nFb=XZqr1U5oC^D2Kp zFa#q^zWWAlo2|35Z)3D^GHv&F%|w0cp%L`Y`bO;TmIh0;r`hiw3(C(vwawe$>)YJg zy=xGzx0Vmq+v^%f;|={uyDtdbnZdg2I1a2>5EPX_TXjALoXo~STZauhQI%C}95d1J z-Pz8KuCS{w7#VJK)HM!8;uH1$hTSb~J4YMd>Du1!jW{!QS6$OkgbaN?d&b}3?Slr1 zed&a5_uqV9{Mx>(nV}*)3wJ3+!zjKQel+uqQle1!z7zv($uDyh?5#%8%*it&c7x<5 z;rT1Z9myv`t9SE#QP&zGkE4d4+|(ybJe>h-Mtsn#n;q2aTyyc%RI6)YVsNz2)8j@^ zM(sNt+xz`q=cZ%FTYKx{-o9D=D$^K{OqD{Lj9?pSTDxy9=B^=;cTw$2o4^<%FXxBKsWpf(VF6gyKc2FCz#SIT<|tkXwBj*kIwhx5`NuoJ5G% zS^tSoY(HgmP`;qDWS}!PklV`c?k)^3o#7xF*GZ$xZn*`pH6XHi0a3>a$p+|L3P{?N z8mOTmuR*bCYdr?2$ADD0!X)!oF|e|Va(={9P!dEZw2~S5F{uebL&LZ`3gvHDYT|4m zgPsobYCx|r?-jzG;E@5`t>c?%C6hAgC@^wDIYAH$1qq4xj}>Q-70?kDQBq(aG+R0t zMSF3lF4wqJyS3%I_3I*oDO_Cs!QnmKr+?^I$-Wv_*lG>CYWmj)QwE3M=&RKg8pBR!tF@pkSZ{4K78rYC4ZU$& zc~4EVJJcPumXy@GopsIK-tL5Bn4R98u|-@4gDYaobkp82NLG?u#_9YNbzjyn+coT1 z(Ka+H&)4dS`;t~K;vR&yNBmXzUse7}$BaRt1cPtuY(Z$TZR7gc=1xn%A2iQ`f1VR= z*}XIO6XqKlD6@Dhxd$*`84>RiyG{NsIEew?oz*9~h9_F|0(#)tn&-L*&X95vE?`45 z_yT#66`NS|>?=%m1_Dk;Fvwod+1cG+@H(A7pVR5(&(1D~__NJ8xmT=f3beFmE7}Qg zRE-Fr83;=P$?_J=z#(R!7`@cvWzBp{$#osUQD>dK&EZcu%2v&;GCq-Y87sRgD&elE zXJ5;oD)x0hfYr?-rq5KNq?p9CnXcLBd}`v{Tay&YT7$T3&b?vFm5TWelkdL> z(}l>Gs62=JdH7)$%)n~(_jIhG+3aa=ShxQ3^0UYPqa|tWE;lT0WKfzRs{tM{@E|wx z85FEpgVxIP)&NLra1;OG+LAJcrhX_5nqWc@b1POE(n5*>C$hJTlY-7TiV_i2B77_a zMa4>;hN1_B9Pwd7A~Q5oya0k2Hui_q zD6_DI)wZoymVGF+Y8XE zOXqQhijjw~=*uK1d6(ji6I_sud8a+HZ`js9ugI|Bd*rWlyCV={+q!oS`aG_ldi&nZ ziUdn*?p#i@|K_;#uVlnERJBG%R6L`6&6vpcAqnQN^F+Beon_=N!dtAanEG#RYB9Eppi=K zLtL{5uF)nV#JM8Ewk3RWMR+UJLKTyaB0|q7MSy3TJy0{n=II$0SbfxJwFBX8{r$Z| zOTmFAmpwhzl-=iVaIcGd6OQuP{@vRh+4apZ1D@xCeb5oJl-PX{yE7dy2W%Ouqs(Zp zbcGDI-d0z0gEd|c{zP)PS3V0~XYy~7a?1~*HH4GTk~GT&`D#df6`ll&4i_8==aMf2 z;|`BiUF{0a{P3!)%Lf1Sr*cQi=WDgscxD<9sbeGw_Ta&R-+CIohVs(Ra)UE79>@F; z)5ZRQ%p{Y>KNTft4N+?i3Q}nDl7co0QXrm%)AnlqN&ezgqeoG8aKypz2r;xJiv#u_ z1Nwr%#M9BKls0XrlP56z*-a4 zo^SUk0>+C7c1lhlGal&}6yTpX*AvW=nmMm{z5@ox0)1t1$8cwHWpRPNtf*t%{@v~R z^5TM`@{-nFSkrHP{a){Y_r3S%+V5kwoc+IiLjm_-7i+X)jW%un72BS+f;Ak^ zM#N_$;#0t)omWRm9*}H&|BYA@S>otgfh+lZv!OiOq~4lmoBYR@HcwSJs|qR|6=NG8 zIJ#+}%2QoX<*J%leD96ZO%anRW;*T9?;bEG%$BH?+k+dIlX3`icOYw2nTR6bX>(VY zv(})@T~oR8t?y(|65ON`yHAl+2$|-dgdV2LN1aOKT!gaorPi`^Z%x&!b04m(uPUgh zE8oBF=av4ZzOdh6xI$OZ5%;s-=KkUy_xZ*=tm61P{_eQF6edjuKNw;RG5580O>L^0 zwEDlXYmTs~+zafs+{0`!myWRy55#g;4FH)CKc?6<+h8I)21;V^d6AuwVomM*4*p4Q zDL)Ep0ive)x(i{A$q(=)9|~fUmC!j6C`e)c6pF&z6EX^t=yc@>=#90x%S$YY;bd2H zu(7VRDAe2>Dk`mO3^pUvBw;buH6{|asya($bET!ODz&valy+65O3l97=;mZ&8X1h~ z#`Jum)@LqFRk$!?re7{%>*cqwJCw6P_E?I&XE+#{etcYh>%Cem742kGeF-*Iu~ury z@)Z(2llSfz*~OrgQ*2f_u4Gcg9t&-l@*jj6Obd^)jN;Pb(KcqqCn{ouGB*Vq9i>IV z=H_5gsiQHN?n(|NEG6pV0S8NBDA~1-)|8mXYWSLxo1^NQLd{!KD-f_H5{-2n1~lVI zX<063pThoxuwTGO$V)VH3WF=go$%okMN!&|jeIF2S5rg~Y@dp`j3lB-`)JUW42R6+ zW^+wRMtx@u8<=G{Yj@lAMz6hgxCM7!Dxm z>H`nW^5id(`M_pZr+{tRwv8=*!5R-+7FL zK8}XRNDu_urKNhXL}DTmj!rM`Nj)pVJ%#QQ2r6)2jyaJ7){6JmB+!EAu+-zi)1kQg zPf3D;2QXwnKsRe|?d@rM(lr`N$Hz0y`j+uXI@W7#FvaceW;6SB#bW=!VnvDFt2=dH zp}%WB(>&MdFWP^q?6ox4SmfNja$ODW)f5&+@w;IyK24ETw1`!Op@Ll=BTp(Ym=;E{ z02l#Mt`5^yWftLGb)$unmweb;%1WTLnh-=lHBeWPUC1ayW*W-D)0<^uuA`@`_(QwP z%&zQIs(ZnivUWuJhm2+4c%Uc{92seHY;UtWn+x1sZkTKAQFqen>T7m)xLfO-nc;fw zGj5mWkagS#O|KdBatz)D2HPcJA2L4RaV4)r5A0_|D#*hjvl$X`NPH@ybR3dVL;4d{ zlJnw@qV0jAx@ZlWrXsu#LLH&B zz_RC6LkA@S)&jSx&?3U!$O1?1ZwC<_P6m>2$;n1JL-g`d+!eiahqf3z#)2Ae&6e4t zcRl*(qqAT8+Sl%UT)yN>o&le4!1JZtlgYl+ZMUWRlB`#f^Z1({Cn#~aLU1?{$)j>Q zEA(aJcEs;;nWbHEJ}c>l8kVwi z+`e%4n7cj@?iri6xB4Q%NY7YLq%mAsRU7H>XScYU>|K#?JkmYh9Z5G-8jQ%yZd&hp zvNGuP#yrlN>Tta$>T$5sP4a9TSE;^no$!8RqY#@3P6Qs zPPH~bs1NVjxm+vaGgZ}etyXT$_iYf}=2_5P;j!IqZM(<9>NVl+m}^4Bsaw4c*CjeU zzDAR`y55v%&BX0NgUi|+q?`^mFnQrZBC&Ac`6g3lME_t;T+9pLj>?$?`>n%Upk(=|c%C(6%de?o93 z(HGC3W2XTl$uG!#lbjEb%`xLyU=Q}^ZbVMW^0z6Dd{tgsfph@m@jKWzg}tL2Ufg43 zNx`^;pRlpPLPU2hxNE{45;g(X@bfTle;;uoXc=ao8i#6T zvCvT3Nj7K%X27jI7^=^PtkzJr9xg7cwV@?E=}wvri3HM>2TZj_tAq78n@3}@(PpQ5 z4OoG%z7Aql9X@|Y#L9}D{+jxtx#8ix218X1iCS3yL-G>)g8WIq^bi_k>C5Z^cAxwJ z)?d&0DXmz@Tq+b!wyKp34GW9e;y#nf7q{6GUbESouz4d9uO|{=57c;)P8U+8YP?C8 zGwG?p^aF`Rz=vEw5z{Mj9;-m_3Z`p5c_CJaP<~P}3&7>*N~f!YD;f95fhE%X%5dK2 zCr9exMpqLgA7KyXW?8EHi6^=r>Vpv;FnEwX1{l0sqn9CJG7N~e``P{M9^PgLN{O~V zz>j=8_ak4)@oZ{&NKQZ|Za`EpTo|gZyv8Q6MjxpseWX55AIUdk)?*nItwpL;nN$xR zNU6W7gSi%WLNkS>SGYx>kaGDU-OjSsB65E4X#HTw!NBl+Q*+I2#$YgHnv-?aWd(YD zxzQQ)7wX*WlfDj}XEAI9`k{A7TF& zF%>!(O9JZtC@a;1C=^bF25bOD2&$O@9gN+$etnBOgA^2h&xWQbA}rmk$(EUI>sX(* z2weOX)1#8iks3NtB!(CE;n&DvJx|gBKR;bW@1MtB?Ua9yy{cW=mutZnzQ_5(J^VX6 zrDnN^^M$uLUwE7N0=^4XRql~5LEd-ms=V(yiWpTs?>x!pHj2E)=Wvwu{NOC^pcjlm)@x4R&;N>V*l z04&JXw;bfm5(wBjyq` zMjq@n@qU_Csr1miBviaemB2}jr?eKq2PnOWL{bszEDTaSxx>ISI|?DABCY`8H9`zx zT{=_LlwddI-nwmUBP(D7-?-rhCbP+w(^@`!Y~-8YL}2_6M*f5u_b*2&Hv(&E;4n-k zF$c5*#pD_eTdbO3TYvI)|NFEDR<#oh#W)eAeLGhA4?aHFW!~PM*sku~iS6p%iFO)a zjKlW`xLb|+gDAm3ZCdQ*zX;;aXUODL5yn)CW5-62jsOHF;ggs%k6D8@fQU3CF$b2>sVi;kh$;u>}Mb3i5D*>j|0AQm|vlea4yZ)A0$f@+IdVd zhYJ+KJh+_LuEOQSb`>t7oyHgAs5mX!30|UIz>5K2FJbQ>>#Pi#l<*Xg^jix1h^Prb z>K?=T=}H#S0!Ra*5`ZWJu=kc*V(R~2y8X8J?YGBoyFGr#9VGX~QC&4AKZw!Hh)}v% zrHm+@8qvHsGA(EOD0;e-`Wt3EkrYrD_CnZ(N>@Ik*-*}K6rYJ~4QjEVh4zWGIQq5^ zS5g|{m@}7@$*_X3RBpmIo2)oig!MV353Q(pP^+FaXWbNUZL2r8dMMz!j!imU6otL1 zHB~imY$a6xppUoT`%>v+MN`4y}g%R9z6$19ZRXMY4_Ind1Dl!ja#wDJa&}t zar>%0KCxZh;}hG}Jr?b>mtq{gm%t(HwcNzVhdclr;^TlOPC+{&N>%QW>K>mM~xJ%6(P@X%KUjN!Qb=WRD!?HG9|`Znx~p-Z~A5L$Vf}>Jz{W+ zu*o+gzN8J_cZCNkI)D~m(niS9mM2nZ)nL}E$Ldna;2~rP8DL9IwyiRK7CZ&9Z zKqyRWRV5yR0YeR92NoU8>f%DaJQQ2U)TLn?y0dM}dE+WWd{lXoHsq zZQ+$Rvcw1tFNV7gh5J5^T88AmKoJg*C>hsywFVT6;g&a2hdta-EbMQha!fG5b32Qw zm=H%2ED4*G;i8LJC~5Dr*1KlnsgBCpp;RCnsFCGdPS@GtNSd9tzF=mwHas2d9A?YK zCQog$t?3Rkxblt&wCJQG0O&@lI~7sc13SQ_*;0;y>$K zqqfq8BGpC#k8RkwpKXK>acMi2Wi%J=`%M6hV*v0@xA#sywfoxJ_Z_h~=4s-5;< zjB}0BPBAW@<>S9A#!rdysr^TJ?N{ctzm(U0Ft7a`=<`8T=_UNVhT6eb$fsT_{}SR# zo0dV`HZLGsf$ABE^`qD=_caMbJT^n1{ zFcU;P9On`+??@wUbtMvi5_k z+G%_-&Q+`0X`e(pSzn0W7o;7i!;{7tZv~qSz!IQ(AYjD?TqOwb6wgGa+$vnnq;}>- zH0kmR;Dks8jalpKt$0oGe{pvwS4N+8)mmLHYppByLveNe0SA!|>;64r8jeE_K$eIm z2Pn)#<2RZ*N!GG@g@;h>4Uz*$pOiUvl!E05eNvSJh+}AS0GXpn4)EYg-}d85ascHC zWuc#N_OHnSmiH9|z8h|*_>Ia6m$Aty?pUVIO#vQrJ?TK+?UtYeVX>ZeYp}-TXc~@q zTCL3OUdmFWN2@m2UoSzev5IgQQEnG zj*q{MkAGzW;eirc!ejLEVoQ`j5$yzC=4HA9~l(OhQihKMcE zqH;-vSrc1A8KEacNn10-&D8@Mu_cI+-as+ZbrhECpY$M(&+g7PSo_A@qro5OKK0#= zJU*I-mUx|8J|p6zXLchxnqVqmK`;`qxQ1YXb~gahs;fae`axELPR!fIS^Y`0i?jNW za+Zqzn$8KWDX;%`R{DQ}pRtJ8T8_yZA#;_0-c}-{6j?^IGnk24n)43SH6Gr4?&*UJ zC8RQvrbJF$9pFk)iJ;gO|Fp<`Bfnu5_BfvVFAOV9*}M_}?ApqNsUcfwuB$M1i*f+I zxYJ-YYBd3JU1f$CqDS5Kl4p5&fXXhn)ru8T?g3IbAVW0ce7;Y#;u zi$wnSOG${t95t32OJ%|sY^DV5|9ysnp~GplR)ou{qY+cUU02e*He&(!$7>UCSzYMg z{-nUC8JwwgoOXq*a3zwx2wzX^A9$bs2Uqpa058S(;Z^;=i*_;o)vNjwevAHzRsBhJ z75%SQ`t#ZaeEvA}KtBnE9@3cqy!?0cANw2Glv)-0S2d6ZdU;KebR&8S*@2$G^E zfw~D9+rCj8BAN%DcgPtv zIA`2k_8?9rbpI;g7*(pIYY^8ct|6QpD|#bNkgO3wRVpf}Nsb}zgMyaCzUb+xcejRX zDQn=CQ7w%?%`ABE!P!x^quy>$^o8cOj;Jqv+qTsz325(f<>x`V*dr{^3>q2~R}-tEoTW zdk**->5?AsQ)LU*SWlIBAT3Nq*;lS6kbO%S;?+bi3$&SPFVYHbc^pdqgQWAsd|mlhvx%$BC0g`XGr>j)ve}8L3-ag_47; zNh4a0hO$mYK?bWjhA%Q8E?Mc+f^s5#qlvGA(v#b82T^s+)WL(uS*r@Ft1>%6N+7#j z=#AHvIgDk-QgdY-9H`u6Ewgw{l+kgrY>zr6$s=AH_Is+a+#=3?jDEMRq__ZC9-V8l zKOR-{K2~r{!m!GrXn-r+rvJfs?AukLPD_-Ze?>?4VxYEA##KGgo~W--G_4^&z=@lL^XY=TYepoJ z2;QWF)J+m=A@~hNA&R_jYAHtx#c@&oEL|=M4^VJ>OM-2*4zCq0oW6aw~8WaL%b1M<{s2r&M6M+wFDLSPfP#1V(Bf zRqL_THbbeah%Z$g)ZZGgl-iTv^~g zRfMFR50PVC2TJe=x2FenbWY&=B+(l4G*j033Tt-xG)|c*H(E-KZZ-Ml?tz@$(gJx* z;fN-m%T^|jtJyf9d9m-rYs5a13Xgg5{Ge;$6D{O*a`|p3=bX0UlVu0NPRglLWC8Ky zAC4E$E7%`7&q;E844Cm4JfCubxXp!ap?0R)Ty`xtP;DB_3kZbvn+bu@e?QuhkAwCZ z(axP;N}dkpTaMq@PzZF*e3c#27O;jxDIQ+zA!VJE@gVb6HHCm;gle>Vv}a@$He~bi zbaYIwlIil z>ffN9_h&a_iwFkm(TB+f7bEqqXoEmnmeL7PVa{HpaZ4>ADIs@q)+j7sb zaDQ*OA@_OqI>J>|zagDlpc&APdTt3@Bb{6G9Oj1zBrE-Ck3@g<+!Foi+!Fmi@jm?_ zG4XLk|L?8zKTPf586NyIjk*yvuryAqoJc`TjY_lx0TG!gY8VnOlBXaaS4mnZ0>0LQ zR*bMis-A9$JUj;r$*~4_1w7YW%Oshn3DW+?VZt)Yq3(WX3eO_mz6!vE0;Dh+X! zAd7WSMcxR-z%(h*`Auk}k_nVPthSMDvyWrWi6NX+C>Ds5=k7pq@Jb9D@`Fj0 zP~08*#R_}SZVA{cEA0UbZY!qhQoVuXkjd1S@@9NBO#X90dy73}aw4`fHEM}&4fZDM zu;12K4ZZ?VbbBV8Wx)=R# zMtI!G#!tM@_}44r^SVZSKCNOtILK%mp5Mghvnb}H6YVGV54=zRgDd@`SQqIVV*I4S zpGM*5LH-ol#rU7DJo)&E_Zk0sW&8-nLG2=p)5hlyiGk052<^yeLi-Y*|EHk_(Yml~ zIlnkwf=N?r%5UiNAiW-C{o50Y;51`PG zqPRH>sNMsN(hwdzYZVP8dT({USv;(nRa5TO$!AGM+r;b0jhd}lemn=sm)cY0}Z%`uW&P{W2acqjBcs(K@e00G}{j!|V2iop>D zJxXv#m9VNMJMTx5rO@>KKo*L+p=$%KltdCHm6V@ZYl=pr{xYwNlc(!{8TD^^=X=Mf z_RX5&I9&5b1)QB5Cb#;6gWd*j*J4ZOwmvTkp3B;f}AZ2#cK;@rda8`|48^?3b# zTe8`uZZBi(2HpHjxX;Gw_MdnDX)NmwqhRCo^d(EF)Y3(hh2@3kUFNY9O*byz4qy7M zu)g=JG_7nPW-J`GHJG4?y%a8Vsw*Nkg`AsCfScT*9)MdhRaa4=6+NZQsVUn%h$haa zv$PP4RW7Kkx7d8OD42ikr|OEV4c#$&q^i2oS=}5jt=%^qE~=QBx2Fv9xW3rpPuhBV z{zz5(%kL_U4v#*?fSDRwXnsii3s#&Wusd#raczX%`yo7#_1B(fl$ZJbl zH0K!`~P-*`E>+PPk@z` zRkX%}3ANS$U0WJs;bMI&>JX^~1$a3oIga(kn#w$<45)Pn$Q5lVs&}HU9^oFH@8{`k zz`b!5_tqFQJ+ynCyr4ZTrk%)KHCa;ZIu)S+4vLTr{YsTX$~zXRaySyiw#nPe%4=L9 zi(2(?r4FL6Ayur`*)VaN-(FpqyIQS($ZpQBi&$9a<6DF^;OvL4cQz<~r@DqU-bm$V zt+Xvul9Mz|Pm6&gO|ObqFBesyDS}|l(oU9Bt*or4w4&PXHLT9BuJxsgi{!JhEUV9k zWwoD>Z(ZQ<@-4xc;|Aj8$2hApo$yc7nJ~=Hoa+@C6DP{5xLUP8Bq3p6QtXk}lRXmS zi+E5vbDH^?ruIKEM&){R*JMUb=2H6$nTzHlWUlL1$!MQIdpjQ=78yPc@2_*J{pHlE z{*SEmhXo<8e|DvR)BE&?ZRVu?o8PBDG>?<^Z&CW6=(A9LA}9JduGiB*!~xJk>CXOO=nIC*fv?iss0A?{=gY27B0ofsE}J_=&VtzsS1yg;#bP9 zsT_Pu70Hx-d*9YBr&>UG$F#|1EO8ku#*HWN$;Zeo=IOA=?b|QtQ|k#|evh}r=B%%P z9r)Q3xuxKTO}s`)1M=2Z@<|oa(TGb4?bL`%i5}zvC*}K5mY*63C>;3-zIgJewerPN z^46+#qukjE;zOgK^(sbt>_w>T%t5+@!RUjPO;gP%0v<46?l=Tg1jr7^r$VYSVKu@p$ILJ zZ;K>jvWBX^06{sO2(zbrtSGaJqXc>3BKTfV01GZ`+p_WW>#o~0KfZ2q+t0;sM0{^* z>KOfIL~BRSz;IvZDajAAuGZF;)LUgULrr6iwGSaC9~y3FBsBpkTb8!r+%UivL^U+e zQ&*_?T{I{w%9GZhdBZ3K%Bd9I$PZgNiXc0+U9F}m3_=l(YL2L%r_1w#m?Wc6|@prOn!kqu^DX(L5a zD4E3XNUMORz)j9dnH|;m#S8JM;TG5D)nZ)mchAJ4qh1uw1R$LAi6n|O{$-^eW0aR_ zbhqT}qEaLFo7V}&epf2MZQc8_b z&YLhEkd`6*C%lSd5&Z@VFCw7OD}uH(9AN)X-2Gtp1O9j1Hha@>N+}eI0$%lT)La4|=>m=ya~xl(R=)!Vwrx)+;GBwwhZ^hbiT+S*xIR+9y+5;cIE>1ZeclFt#_m%kQ^;}6q6Y)9t%`H;a@cUD; zF+8%prDKcV=^cqS^rxJ<++{NJb}ytGH}nSPOK1A)vys|&pjZ05))q4oPkTZowu!ux?+FxrP?$`xX>)8xg^-}rVoPNuGyZx=PR}g%a>I=>8pmTPL z*B^Tw*uJ7WC`;6Uu*PkqSj#l1XvLW*1EQ4I3s&pck!OR>Ka}sl5hg@Br4AD$928>u z?-L7G{@}q6He}UWOjNg$!TW`|CO|JP$OLZ9^0P+rT60>hab)D1`nYdfbNnj2JbyJZ z0uQL%82torl~R+Fv>}lp_pd7us&%J$g$hx8io6%JcyX0oY6(I!N)Wd45`+US_JDDn zT7Zyk$$be02-yzh!r=hE!JYve@@l9l;RV{BX=_jxr7fGbs7Nw!R!!xyMCc!Flc=Gl zPFppc&>lSle!IGenpQ%Mkp-z``FzgHY_J$APh3Mxn#)~PnJKoNJhD1mi6Uq!;A3RE z5mhZ#|I`{gB z^7rL@> z9sKPr>_@pK!z*a0fqqSHzk(PVf79Z7C^iIYFW-R^f9HreoWWP<%i;$I5SYf^nk~rv zQwa(A0ef!wTPz^rK`^f`BSHB&`2}#scHoH#c(Q^k%F_W?@k8=eIPe9{3h|04RV^PN zQV1+g*fs^Jn0;UFEvRkvw>9_H`|TlHul&NrLsm~;_xHaY3E662rL+5L>BH<&`6UeE zf(1m`E9I#r^i+@`7D-|TDO4hSjeH?S1Sr`MphRU0l*~d3O-1F{Y@WaWp64nctl8r= zCa*i`zUF?j!(lc#9P)7P>-0Mx6{QJ7w1JsFSZg-f?Iv?A=V^ZdJl>Yq;bAS9QMF1p z3K8&GL8Qbs5-cdyS^T&W1>;b;RGO2}8`Q#&X5U|03T115$mgsu*lOy#YJ273iBPPf zrLeG}=~2RsSv>Pac^I@xIhj`VnHnS%&?syHlTaEI&c+)^kQW78DL9A@eNkMK!u;I8 z?R+xCQLh&7Q3(|!JKGy5EGp0yloa~Yfx_ZKU13q7zjI*9SEw)473hn+e_ z-*St%KAd~v->q?*DdzlltmA6wBH+?6bk-H#tE8!DQ&y}m9FQPG9!^I!{2q_P%6jiJC9RgE z`M%s2)4c^ca1Gc5e$2M9i{xXd|L{Bh{ug+E8GrwKzW494|6(7L{}X6O)t_i*M5YI1 zL~uTyf6KLDU#5j}&qME~W3lwm=;)AakNCV1zueuN>6YU2Mlv&>=e?*Eas)mu?p4D&wD;HZXZ?d+!?w%M z;W%CS?Q@NG5h%tfMd$m+UTdrTT<%+Z%vH5oFy^XyBzV92cP^Opk7b!{hhIe0pd%+a zRc0y#cW2u%ZjSY$3E#U%3!u-26F3IvQxwlmw5f3n z!6ot|*A2d>uXozZtkvZv=oU@uUNnkKg)QXb;VKW+jgqY{#L)AiDo@(8frem}&0TGd zdMzWp{vNB#6t4?0#GM1`_ifWsotg0MM zRhD{dxXo_l^SvEB2*ifkr1h^}NWDxw4N zeJfV7%DscpVnea6xT-ifxbN(tWU;AK202Ct*!{QkS5o{-W&fRb4p%uVE1gv^lrt5l z6dWSUE8!3rlkf3On|kCQ--td69x8o^n0N&+UpCDmJ)1VkT{nvTQD^{EWyAiUM2GTA zc?Fm~MRN1mV`R#`VkN^ndj<*y=n=bji|;FV2HAz`3?kMWJc!VS_z%T|lZYT<_Nc{7 z3{@v@~f+ftJ!z-k~KFTKb|b zG!RPp3JvYo#NYovXYSs+vYkM_U;F!gpX}YaJ9i#u&N*}D%$YMY)m8f%_w@N5?J;Ny z6{W*{$4e_qVdhru*+?kYJx9visskPK1ONW-_M720!gQwpfG%to>@kQXT(nQ~R%_iZ zRE`4^#aa<6%2M4;eNKrT%5G~dt1I7UhwKuk&puJr-dE*>iUJKKRekMrpD=w9t15(n zGRc)ho|ByF#)0{D_;?<=NM*a{i6L(Q{4UZ_R%oG_OUts58MBw-Kp+^+$_QV}5ung-Tkt}A>V1!(ze(`(-?poTBzdfYhG;(h0%*eS(d(_nbl-;CmwZ96brV_ZPD3wKS zE)tcGB25c1E{CXF>uc<+oZ^~5X{ha>{rg2N0aacR*dJ**ftj}TwC!MA`b$U{ zmIqs#ua6dUP#X3eH0huD^l(;IZgEXjX%K~-tm#Er`%%_$l!cp{ep@|?^cCcV8J%zkTKH>Av9hB!R}?7XrT0{C(j|`)h0WLm&M`>ZEx7WPOF!PV3ze z^(gBvu5_sFE02L5>;l@%4`Ic>V!gK8U`QVLGxX^T8hR`|2@G3fs&+1N!x=9ojC_n?>ftB0zq zT1?@%31=wZX=LG9ojHMuib_h+Z_0SCb$Z}~hYxs@7GZ)C5Dv%Af`80eV?nbu;+wtI zM;t5@xqCh@cb+V-8gX}W68Fk_AIg94l@9=R$}m?xLK8{LL>3E?==3#|s8IHSmX-tA zA-lMt?{k6Hp8fTGef9f$T475;Sr1)VQt!F)vqmN}hHHV^J`_^#dFrX(#Ih;rZO#gW zL~g;#B4kFNc&l(Lh-h@|r=lhB;8u>R&>^7_$SR^E69cXvV&HI3&%j*CxMvy5BCa`q z&xK9Z&|W{dzq)3!9j40*X`_0C)hQ%;}2sRI(KBPdTYK?#!4sXnALa2bSn3wW-D8ay z#uYWNAHpUGu~35#mk`BREG!GEr!P^u>JBA+IyAipraNYXc4YPnU>kp!NU$tNw2QPIqA;fgEglH4jvrfN4>k_1g`@=(cy+eCr=IyhQqqv z2dujw+h%mVlx+%F@{cZ>%Q+lKw|!lh0q6;SZGe8oeMu;}Ss zvSP#=^-Efn*gx~0JUN(?6&P*^YvI<{Ya7AV-uunl)h7;=)re$k?M=%yW!(q)@Ok@Q zXw2!oO2!-xXbt#gRZTk>(%dD-4$>SB?f`()s%e#`7RkLz{<|;yliKf|nadyg`JZp@ zsc0-Ntmvh=;x>i_2w7ca7^?3uK=b;?FrPAw$XUgK?9R#RuZj)qZ?T* z*Q~3O)u`#G2e4ysa+J;Cur@wAm}>_Pw~h>+Y-p+JtU9T(Lp5UeYYWu<9eMsO;Q7x2 zhC*1!F?Vn&d6jv~KXG-Pq1mqjKJ(REP957*ly74edi>Z$7^ohq>aW88ho1Qenv1%A z2kreV_@-XlbYQN8w00#l4FxW@dh>J-tG)K`)b$-}ZV8q-#Z49cN00PZca+vvjXEvI zaQ3if*Zn1(g+<}Pp_65Woj8yDAe@Jl^(ScGQ?P3W;6me*DaPKbIhE?MI396Pj?3;M zZMg`+E8WEsUBBy=KAe*CL}_zH*MXP6{KV{RI8xoS-@Z35udAgt^vrivaer3zk<K+%zW*3m=Ke{?`It8kO!8poe%D_HBHXFg|#+7;4;q&IlKdb^@ z{Htd^rP{t7YW{WzHl3v_4R)*E8-bmg@VUPGDO8F0qtK~w&m{cBrX)UB;+L*0Wu(6+ zoqj1J{XHhV_B6@%}xKcb}H{F{an&+Q9Bu z(q^~6MMKq_&Xctbm~O(mcJ;a|-?jdRFq^!u0{y_T0V`U1s?KC)-{ekq0M+(662JYWO8y8THe}7;GZhiX$?>4wv z0Q~;+_n;V|#Ztz8!h1~m6_oGahjh2`$A2~A{riyacK0DMy~ZufD#UG$#%%@b(0Od~ z$63Bpuj|t9-pO|>fXiRcJ*J*Bi1*iXkEuuYBN0!B1Wy?9S&r;qBA(6(o@fe1JZbLt zL%Tceht`nchvvq2A-&%Z?QTx)P)-E#em}Ik>4%2+F2Lzee@{C7QbziFOnN#^`}b+I zpcs~;*9Cq1G+t%mcc+JQ#WmBvIwL*zX&lw~>B>mYvz~rTptk8;dhoVKgaB|>UW=+RL&&RRUqB?b<$PX z{ZBt;(wVg$sC>LLCkNl!j_kK!(dap%?(F0K-$v~JZ4XV4+pn*k9n9@;TDndgzVVVq zqO#07(XO&!5BAJgw29??C37or=GI~0@GDmu)lXY@mgT7@EbHk%)cANY)}X$FHK;cA z&-#4ve@+4&NV|&or*!-iI{pba9%Vd*GTPM>SKjpWAA&+pSV@)z-29@IRDY=64n>!3 zrT}7_TVWY--LE)rSKST6omEwx!wn`(R<;i}H4V2{x*^N@W88=EGwS0|5Lgy0gciq+g#kqT1-u>&%s0Qi(9O>WUOV1tJs2kU$ROYp-`McWR{`U6&dUwmc zbN4cXO|L}zs7)(Wp00s=<(cDz3c#M*K2rBc(|go+@O9?*8$NBf;0xJ+mv`YT{YUg! z`TXQlJRQ{B_O71V298;e8bGgpk?|JjpRCa$fm#0Sg7A5q2L z;xOud0O!U3o<1+WR_fMq52*WfTwOZuA;9>chOs^!_XzU7SEp-8$Gsov?$_y{;IJ(y z@4L+)b!M8AJ6pLDr$qk6=8D_{g&u3-E{++$bHs;KoEIbYwzy$^Bk z(dlshrHOk0dGFJ4HR-$$Al>ijyuh_D-TgWaxHfSQA@74aFK}(*9zovs>U6-hiF-fN z-LKOD*Cy`4bR2MP;-0)xpk8TxO>k}E9!K1Ujsvb42cG*S%qu>Ic|{ebkF@<@u^nqk zoLSHcBx}7q;ZrP%*fl>A@*Dq*0nJ$ce#y4~DJ#@h(^a`2W}nkHS9Oj!V`mQcbhh{9 zsJHDY&Fvd1+Sgf9e(t9B69=mnkN5Wv^r7V2uDlsz|C7-1OJL0TfIGgm(WR%&^6qr; zZ#%7d%$-@%VSu&^*#IC@5Y9Adzu;LFoN<;Qqys^P33=Z!cS&%E7&p7MA#5>WE8cMu z(W%R9#hWg?=|tF#kgE?Ngq%C_Mw3BYRn@vbz)N+yR54Z-Fo6tUqXqmBFhI7$uBh)> z!u>*dyk?1(Xs)ET^Hc}b7-%}ax4Zy83hl?k2U=8H%i{39wtdBQMTKp}<1-gm`J*DR zudS%2r*xnoP&Cmc7r;Qu&oXvof7*D(UFYUS3u?*_(H^-1E}c{bt$f`JB~6 zfm7aBP@exxc1{a;2lSf(v3bYUpm$D_@i+4DYdV)!7f5}%mLc$Y?z=0iyrpcQsG)cuSFX!~ zwCw|K+U=jj(;nD>%JKWtE)TYo2itu-c#shXeG%TdN=8`wUD?~w))K5kh)bZ2))ykC z7$H~EyqjaWw}F1gTnPcz@Ff0_ku{~-J)Sc*8qIS!d(=oAdMD&S3Za)8eiIyUJ)gMXsk|;O7}7CF!4(u6 zJt`@ma&XKa50;nBz}RRT2;mynnfxz(DSsxSx=!Y_9zD|&nZ5DGxAx48w&t8vy+;lw zRbXRu;J)r~SLOHByFxkdE^9y0gT9l6^Ij~-r?=y&47_o(%NyR2O^?zYS%Xf&Ac9H! zmRw(^0|2rTf`vrkaW8$E&^&&$4{v(0h&aN-kSSW>RW3HD^2+qVkWlgD=nnT>$jjId$pf2w(FLMr7ACFYm zsXMxJo>@2;Xo&t;=c&Hxs{ISi17l-aJ{*BB@G#`Vz*VQ)c(gJ`7trcMFrQ=lE$GvM z#&GKiZN>a0(x4e3xx5)~X_lm&O&TuFT$Hcepam&VgeGI-_RvV%AkN{2xyI}$7Izcg zQk07|MHRqdE!vDZVh^|d*zxnPEZc^vzsvz{(G z7daSixT$;Kr!F4M-cz@=_Dqn~o$ zaoV4~kDa~G*V)ZdgyvQnXzv(-&dCp zazws6K_`^8Kc@bU@F|yH2SvCH;P^z49Ln%jJmokK< zI^2C{8~B7){vkRe!O0zRN`_JQ%yzneLx_d!qOo&FgVsgE8zzGr16H@KLZoJcN(@?*={-HpAqO}KI6C^oya?k~PSqV*!tNuI!bq1F0v zx5Y*Q@fv7ky%%9@zi6Oov3EKVH4s;4aqlq@$?aZ!S&g=n8=63Uaszj<8I1yd{?}^1 zT!VSTNF46*pZ^wZEU}xu)3{3XJt8OVDaMA z>D1z2Ui7xCgN=QG#_XrRo6`cF6V%v%oZAPPU2ko>EjHVny#|`$&WkWscim!c^AX!C zSJ^0}In1%yGMsUkqgxici42KU(Dw4SPjqgM@@Qr`mXpE8I1mBH3-l`N)N8W$y|d|H z{?zH57fwC)qEFm1yKr01GygIDyZc@^J*)1u&lC@}3{0OZdgkf>8ar~dJEym89L)hB zhal6c(4GU<3*GiyMKI4qBDCR+ilyc(3J0KaRHf|VGkY;dU7jP=h~ISxd2{Q?aj>N} zj!+$LFXgFc{Ddlb4jVt;Yn=&qs+>qp){zUZon6D<;=}kmrS^9oYtOGNDl4rmJn^FA z^|mVQAL^g%9~}6^FW)?L^W@EgXP=a|m^=9}2JP~@f`G*BeYn1D{W#|;WGUC6py->-El_kq@EoZ!orsRj%pBv#>Fss!*>`SsW^r+5 z_FVAr(W65{M~@yR-XFtPR1H9zX>jrGd9KR>n>cK>w%}G&9x(x21g;{n(>9Y9ddQ4#HoF+BxLHU{Df!f-Z+q&9o>dQKc8_JKh z^o<^J+9yISW7Rj6RqwA3wbcbG0_DYR71iAxBNh2=jXnK!m|udn4**BM2Ry@ctXF8X zt-!x69A4cJV4Tchf&|8)LdD^Q>m(E~dx5dmp^=tiT!{ziit&Rdzs_W5^$dSDc=%V} zdODaoG#{QiI5pMy$qx%35;ymw&U)`gLQmn9Wj6Z7$T6;R6q|eC3y;X&W0u}1>I+FP zZ)p-3XI5MLXG(h->RS&qR@4_amVWs4d#jw_@rmKCqqV?HLv4NizJiK(3{UI} z_4gmqC_ytH0(=i@e&?wMhI*ckF5Bj4HF%U>AsRd0;WUJ>-W5xU_7jtFo=WX7?x}Q35~Vl?*yAE<=y(<4NaN6fmJ=t&J5Y9(^?psaW9Z;j;FUCA50bA3 zg|A`%g`6gj45qm`7cbo_XIqVPu)7Qn=gnLwYtrAKv*y7#pl{yRs;Zu^xt8Nz`-%3t zn$F^?#?rpC6(#kx)eYT=_L@LrSz}iq7;eJFu;nVE`)_pi(rnamxu&=MRuBjlqptY&YsVXX}a>$pq^`L2A0eWqk?*3j24;s*u zbf?=K-CIcQTC<&&)Rr|w_GIoq0B?#KPMw^G#c)W{%Bm3D^xtog=H)rvHMNbkMU53* z!R+#$no#Iuh(xdNDStdrUtHF9py2~JL*{S^Xx@F46ffue`pGLFRIh}8c_E}TotMP6 z%iDuf2O+Cw_qsu+cKpgoWNB)g;e&iNgB__(Q4_$*& z8yN)*I8s1UFiyNF>wf!V>cv?&hfu>nI}fdw^ku&PMdu<}!EL1Z52Sg2I*pBdOalW) zNF9%ydy)OIZ7J(Mr28P!i7zunj>oR_`{dT7@)2=nzVEiV+s5F_jLh5PX1sof{R#Eq ztPn;j`l|DgV(}BCPLyMGqx{EYu|oFhR-i=QCrb*ouv79-810Xz)+%tPR#DOZ?B1O2 z1HNbb6D1WTxM27gg4*g{9=`sN{T1~aS!HPZuCW#3=%F9{Agc_c8gcaj`{U|8XkRJT z-aVf^u{80{n|%fv@o6^xdkx)i;tA$7<1Z(eRnpLHf4sb*qq3^Ky{fXKp`7LZoBb&j z%Nha&p3R@Rs;Q|8ANy18%{YJwKAiTa)o*9@Ag}l{b2#^~=J(+I<7@96A1P+J|Ss|!@a;A&eR1y4Syc~|_IxgsMD3kqCC_0;tz2508c zBl)AJ&Me$_W^t69xed;S|4Rm66T{+>%po)nbmu*Wimu4mWvo7E7#m$j7+YC?hWlD? zN3B1)pKAHA&rh}SYCqL1_*ze^hqCH54r_J4A;jWuP3m|YAVYo)=B2RbLcCp%AKJn7 zU*b-(it6gO;ZuR{H&4HpLSdAhUvCHZ0hd3M%&Rt$RE2}{;c)S zzhHa3Wq17#$M1C8?1sL!^KRfqjeDvH-u{nV;GRmUoQpy`B5koX8u#1~e|;>x@7Rg# z6USaK5!wyN$jOt}Km}^K4}9>!tcNup3M|)?M8b#FfUV(K`EbPasNKBS;Eo)hc2VJm z--^dEl(>Du@hR?gWh#1Pbv9|b!yg#5*pID#%jE|* z)b+DZT%Rw<6F+kOFCO21!JWJ6&pI9dmfLtY#2y2jnybS05727r6&w%rc-wV_A zzzSwPZk`KU9?ott&qdbc;YZ*_dl^=kIPOSD;3SD{czvwHitgZf!%6{v32O__e8PhI z;^po5Y9hM5w!Z8{H&U_0Rx}ku`~nKtLDFR;b8viR98T4InnN7)zlHctVmaoF#aCj^ zTmljEc)N-m8z?$~pRv`QjVK-lK)il@kKmB&FeZMdfTYok(%rJ9I)&l>23 zYCRerKNT4j09Ze&?=jWk)$A!4;eJ%$ZwBxQU}GIk+d?D#K+mBx2bTM5rRYb~MuFcr zu(_=BUQFlat)_gt3548^+)Q%;$k;$F=W*h8FHY0q=P*+BTh`67L~=d8%S_4C2rq28gx{V2lU>Ssr)A>S_SWtQLo&LmnB z#U};qL^T7jH3_uGL3=LXJB-*k+C$b@0N*7wUv27~Q@|y$lF;1963BBaNV%@DoC4;U zZwbHF)9)7Wr#-$IT)T?*@zJPG7t$vb#U*w#@_64-Rvay{upom3*a65EU>Zg=7r zobXEge9T$6oJ_?wlg`xEay+pePk_}|ob@dywH9-hw$}M;Aw~XoqFXC{@q`n{n}o9* z-`Pqf)?-Q3@O&CAglytnN_YPlvZPYmNBa6MUAoj8W%GNN;k^8M+XOx zvo8JR`cL|MM+mjV_nWp^rvDvojdwr}5-+HYvLbx(MyvA;;y^ z=jKq#A)#g`N^*NcN^=nhs&&W`(O5Vzk&DO!8|V|{C((EKO*urq+}5&3B#{h%cE`7Hm>gkm3H4mQ~BTm%8mE{8TB(kD^2*@m?rJ*xm9;DHjsI3bC!z zrqDi7&nOMIkf**l;2l)sW@kbo* z;8~;^V>VGTe_t?hUb{$JzF{89r1Qw>DoHMuH#Byl8ZyF2TCxNWQew~L?k%JsCs9_C zlZjWpmo`x`BQKMqi4Sg)6-;<7BgCZGGSW#q+#0uZN#p~5<9let22-OF_SNjU!@2o!^?yes3r%YSk3=8mS0z~aeBxAh#;g=^iu?D03->}fn~*Yzmi$%}D}N)s4!XYg6X zhvV>qmL|<^~SR8ty1j!hY$U2J%idZ$HL4x#P!=S z$s^PRsm*Ss`Pon1u*Mznk${uuwWXhn9a4jGdR3P%qZ@0G7RB&Z;$-|5Vs**+=3514%0mA8OOs|?i zmTkY59Aa8>k&GPd(;FGNU3-F?hNGZYw)<9ED)XKnt+gU8-1(f_dKXjdhwf~`#VqS0 zyyQ)h&q-J&+}X&09;;{2TCrk~>fWeweawrt#I$ao5^2IxD9Kqn>y+6WXa2+!Vc9K* zh*75IjA-{*B)#alSu7>8oi2vR6Ye}vw7^Urb#+3*NnY#GJVst;S(H?FXqYlJzcq{!C&oEi zd$v5nB9;u%nT7v^J3Sn5cEE9n-|I-vx`e*OBvZ$(Svutpp=FH>Ic`!0kWYzacSh;f z=e9tgIIl~l7CGSC;QlrOz^MEUJuIx!DSKIc_KV(ir>=2in(~&nR3%v1~)Fao)7B*k2O(N7zKi^7Owk%_o_9xqr6g_5tZ1Qif;)wAXq1^p>HIJ2!R5j!Zp4IFkJB zatZr`^h|g4Lb!z~1()uqPAvOph%UALwyQx+Z|Sq_?NX+T@l1X4xmxb!@{c%vEzV29 zuSoRfq*o#$vJO^JIu%AkFP9J->lCa;CA{PlD~;e%`A8tKA5Byx*X6KY&bn__yAn9nswl9I^@q=oPWYvFGX z*X~%uej%18k&Hi#J%cs4c&2?{YRcrq>(%Hl-{mm>{New9JK6Pl!sDXF^ekt_3a9O1 z?yAkTv<#s%`xM7tjs;twjK~O=Ru}P>Hd=BLWsQe_zvS7i{p{ANnU7M{)q}{#9PvHq zIR{(7d~6!9PeFcg#wM^&;+eK1ca?1cPZMb0S)}9&m7{ag2WB2`ZpJU#1;-KJj1&vz zJ+2VN(^u^1u-m}>+3W6*NsTe`62U0aIlW7iE$Rml=Ju| ztaEzhk99H~bFdvt_|50jh&yHKn?Wwt%auaTM@ch6x`=qMR%w|F)fCc5eS}OfGln(@ z%wd$xwPBWZi>{v*(M8nDT+Bzz5z;U|bNHUeTdq?sAs2r!b_wAe(#g6dOD0r=mbTRy zlrgWv(-dLHyrr%A=;m1Wb*NpMfBaZS^Y9ih0#frNS-wGdvm z+oQQ3USj@g8eEG9T%KZCqz>^ht+B8G{6#s)C@R?K75h6S0tj5uL`p6Nf zS0U8tKr=fXk|7m$lBxAg_;sd$qIhCs<szZk>!^Ae zg>P=|z)=srctShCgwih(j;M1X5kr6+ak9mQ1UMRC-cAp{OYm=9)6gWH&FE#2-$|~a zQ7gg$n=AxBka9bkNNvFxb8UTF_(1yrCJiqELle_r7cfs!HzCcKYzv~|EP4l=+6`pw ztbo}pd;_d{nUR~x z*v3V;AUdR(uB;p2E^nX?X56|ALL}BN3fkFhU}!nIMR3le(`*os*yj1z$_k${p#WU; zcGR_L(ZJ%8Zuc_?UI7%*l&&e^N{%g{7`?|p%VrbW-GKOD)+q4a1ID%ZB`{Dz1Is1@ z-b8F87WFzife}YcIxmvP4AQ0CMC_$I>xr1=KQNFXG6;dVC zaRKbaN?1}drhCbS^$mcKZm5tL?$oY)p9JA!iH>CFwZJDEEdxafz)lBOa#qqw?kukn zBWNc%TzCT&il?@&up6wf4vsRCOo(Axt^1(n^5&}t27fDvDxrIFJGN{XTdH@W7vMpz z+X*pihN>hzYKd30M#`VX7`DC@-EifczjWe=A_Ve+G6BTSKqn=@c6!s+R8#Rgw# zSrf+?f@saSB3FH2yOMSn58S|fre?;bm&T`NPCKWNZ)TR0!ZTBgD0FdFXEjAlMUZd80Wf2eC^>v;YI9d)Xc;@YKfeQVBU#>#%AYk znV&j6x!8?Ni-_!Y7U#p`ku%}>8@mbNESfy;=p?;>5@k4%o0)lGGCV!)5FzO@oXOeg zail&K0rX+aGzAu_-s>aicT z5hkuC7{^L?jcLQ`gf{w4SvSC>I}O7gjmC2@Le9gCw+K_@%`i5egL(K?>jgM@{e?J< z`^DC6R#atMzh?b3_6mR4y4(6^oQVD=>-E+o2WW;x>+4m1n(Cb_pwFf7Dzt{S{^*!s~aSP^y)+en`SntDP)w1<-SfKbc78L%}`jqu~>oeA8t$TYUv5uuil4i@g7mFM(#X=+(IO%41 z5et3a#IpFyu$cMd)=yY>;`E+(S$A1KX}#R~DeFn=U#t(Qy{bU%Q-wIrt=M|ndPbF~ zQdOqPtt&Vjp+Z%v{Wzg7psG~0s!_G7PSvXh)uM1}r~|51wW)U1p*mF; zjz#NMJ=m7rr}`C+zO??+`U@3OgK9_(<6zlC>aaSZM%7Vu495qau)b#fgF30g>XaH& z<0_&i)M+)Trqm7UMm23cWPL!LQ8Q{*&8eHzyjoC;YDwL!&Z=|PKU)8!Zc(?Y7pNao zFT`2iFIKnVY_IcbS*@s;x}a9onp#&cQMaoN>ru6-wp3hgTVJ=np(R;nLYcdDOIKdJ6gFIPXMUZGy8ej2B9ze>GYy+*xOy-vMey#aT?zDfP8`Z@LU z>diQb`>pC1)ZOYA)!WqD)i2>(!+X>_)i0}GQTM8Msb5vUhI6{!jdQ}@qkco(Z++SN zdz_#2n>cy;LG?cDCI71R*Vf-zU$OpHyGVC!*m5Z1o}asQP{N zVf7L9QS}Enar|TIkJQK2ALB0gPpCgtpH!bxpH`nypH-hzpI48mFQ`9Lf3Ci$9#>yd zf1$ptzM}q8{gwKv`fK$!>TlKGslQiWQ~#j;QT>zpy84FtXZ3{oruvq8Qhi(fi~5fG zSM^=>ztq2}?VK>MQctUA)D@eZ)V8ziY}`7Li<>a=akIx>+~Tp% zF2uQu#de8ZYW?WLD+F~ET%_X>H!tTKB5nc8{yW8%;Jq&$zzdeBS^F#Ka^&NW%CxDLF zhwQ`l5qlJ;njf=|+b8UkcGx~;kJ;mP#GbHE+mrT`eS>|YJ#C+{XY5&f&c4Z>w-@Y1 zd&$1pK5L)Lo>`inw#Vl4VC3uX5BHmJJU?|Q-kaRnPVP;u!D6N#<=v^Fe5m;n5r)o= zIdEQ7!rbur1WZf0Q61!kk9iRTMohxoh?E%9LBVMc zkb+h3dGG0T0ee@|j~W95!Jr941(RNmf;I0sd-8lVk-dhm+^H1oKe1d)MiJyq8Tg^6 zYs3-j1Hmy<-gw@Wfpy)W>;|vQf|q#Dl0GzS!jXNquYyQh8&I^?mvg71%P@83Zs@=y zIc37J+-Yh4h7Pi)(YEXjeC5tat}S1#!6C^tIGj5pxwZspThZ+}rXum}wOHP)X-eGR zq``>EIZ-&fwzIVwP3&xLM0Zk!asRK}d8squt8>USYG@>PUg}IpupnuZIw)B1kWrBI zo~70yQ~S__{2n$08xG|zN?|DpmV`JkE0H)$ZVM#LT@vQn(Lv5q0)~a09ex)s`CC!A zvW$!unR%z$Ubg=iH(vOXs&|qiGNT3c53Dm(MfjT%O z&<2N0c|)eWVUuoHS`i$U)(1z-`$MMuL(&<8hXh-}LxQc~;YjY97J9iaksu+#B?&I; zKsPOT%7A>z6m`lJamrLVW=wro16dn1RTUX^#ju{5I_wHti7x zABc#sL#PRb(BvOB`G*ZYh9`2*!U%=o`jP}^MetnG!Je~NNrUBRJ-O$S`y}|44lxiB zu`>`kY}$L+)OXml3mxVbDfqGuB=>~D#)QH4gu%vy$u(iHF>!d$%VG(`2doEyM z#XMo9Q$OV=*QImpO+o?K(s6rZTt%0Juv|;RA{b{dK*lb}i(>s#TRnBcT*>Ozc|K`$ z96X33bly{h&L>?+_#}`Zoj`(gE+lw#Awfa|$@ydkB7QI;_De#KH`g z7@$R^VAspuSWiTW#$bPVICmRny;L-N1*@3Zk)1?bUYycg9qd1)se(}B8KLGbgqpj8 z!GR%Z>&jMqQ@2$=u&sPBN*^Dkt@6aS>U39VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/docs/images/arrow_up.png b/docs/images/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebb193243780b8eb1919a51ef27c2a0d36ccec2 GIT binary patch literal 372 zcmV-)0gL{LP)6w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>hNMU> z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~ zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh- z%-mbG|0Na{7Ruai_Y+DEb1s+b!*9k%Q!whMxjtZKA*?o;i1g&jy0@( zaU=-@d-h+o%gal6JRXEXA&L3`d2 z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3 z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{ zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc* zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0 z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF} zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q literal 0 HcmV?d00001 diff --git a/docs/images/bullet_black.png b/docs/images/bullet_black.png new file mode 100644 index 0000000000000000000000000000000000000000..57619706d10d9736b1849a83f2c5694fbe09c53b GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4 zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEhC#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRsC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By literal 0 HcmV?d00001 diff --git a/docs/images/date.png b/docs/images/date.png new file mode 100644 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/docs/images/find.png b/docs/images/find.png new file mode 100644 index 0000000000000000000000000000000000000000..1547479646722bda4647df52cf3e8bc9b77428c6 GIT binary patch literal 659 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 Dl)1NK literal 0 HcmV?d00001 diff --git a/docs/images/macFFBgHack.png b/docs/images/macFFBgHack.png new file mode 100644 index 0000000000000000000000000000000000000000..c6473b324ee1dae1faaacc0826639833f551116c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Qs8<JF;+Fd5q0wCR k?u=~bH}2*0f`J3~k>FVdQ&MBb@0BAfpf&c&j literal 0 HcmV?d00001 diff --git a/docs/images/package.png b/docs/images/package.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/docs/images/page_green.png b/docs/images/page_green.png new file mode 100644 index 0000000000000000000000000000000000000000..de8e003f9fb8752c09e7f3655d5d8664b5c62fc3 GIT binary patch literal 621 zcmV-z0+RiSP)QqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l literal 0 HcmV?d00001 diff --git a/docs/images/page_white_text.png b/docs/images/page_white_text.png new file mode 100644 index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MKC#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c literal 0 HcmV?d00001 diff --git a/docs/images/plugin.png b/docs/images/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..6187b15aec001b7080b51a5f944f07591f26cc15 GIT binary patch literal 591 zcmV-V0eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;mtzb$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GFk7R5;7c zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs-{0?hOn_-8n0AMO@u1Ts zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P z^AL@~(h~Z+wfcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX# zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*g&lgG_cXv$BGoIWyfO5 zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4Ms8aJK-ladKLpnAK z!yd|CC&>l1b7`m$MH$ScEIP@XgT41O>|DzL{-38CH68OyX#u=G?d7;y&_o&o)f@3U z2(tr%Ok88caOL`xiQA8o;Vzr-$A$SOu6o|$&0DQAJ1Z7?OACaeoy+)PWu&~aueW<| z*KW^(^2}#30u*~<_mXScFNd6U&sxh5*GGMNytZGxkIGqL%v6329^u`FD6T?b?K!4B z@Hzh?O2Au=((Gu;rvgLMt^pS|u1rEkBgC8$oH%zgT`TvZiK#VDrVG?-i~6a_+WZb> zc1>>lb)xcuo^Cl8k%q3c_d*It_Vtj>RSovF&w;hS=6uYrT2e@-@l@P~uBN`zu!v>e zTm(is&jcQ6vuP?|;!e+(n8w)-Xjd!hwk@r2D0i00ygdKo2Xvs?&w_lajj5DHS@9I! z;_&ji2e{!uusGnVn};Pu|dl5x-FhQyC8^-4Uo_;BLiOXzcE z&4PS2TBWSC=hsw0og;z#(mly@Ed2E1E$_VDaM?kloE4ob2XK&K;OS~-nhIGlA4~UZrJu6*|}wi#TT?|yWUH+_&n($t0xta zBwTzSfE)uAw*L0>+`pTps}L-$jIP5Q_E$Am+l|{XfsKr0Vi~`Em?SJQ#0y)8vsxb1 zMdxJl^){_CDwI^}>)Pw${G?Ajc@P}x{Fvhoi0jbY^427?KPmoA_G)sqK}u$2(79Xg zC%}xm5JDcrsm5^vQEQpGEdJDc^yfuNAlqV1pZQVkOSceV<|{=|=@?=o4i_1RFUZth zC7cu<6%V3dVCI}P6DL4iUgTc@&(nXY)ox}HZ z(a#EgiNj%{kjRLL2t?{m_aKN`{5-&u+HAtQ-Qq#@!I@<(M+B3i@|g=LY6 z90tpW!JuMn_Lcy1q7g&LUSuLE3XS}K#P^nHVUmL`L)dbP| z0bt(+Cp#M-bH!LM*DzJ0Lfn;eTBV@|JvGSgpdoc1RhhV>(G-2(vE|>MrVgA9+?+0m4OzUqbT>-U-jg|v zLZMntq`r?fy1UCMh>z2Koi1SL-~N2ZrIf+dZW|;SWszsde}Dl!HOMc1Fa>K9)e&RI z)A?aK zcviCdKDUg_%#u7YAE`A`Y3$(P4&m^@fEWAvjAwVmRWeUnmkrxA;E!fKoc{9Vi=lvFL}KmoS;g* zdjL?Y!VHUFq63aLj6VZE+tHts?Z1pFkiO9^k*5pGpFpU&5#5G4ATd{t>a&9zKBVB9=Ns^HFU|DTGH8C+Xr2UqOU`Zxe)!|%j4=-QojGePq)pRGe;!f)Czk!u3vP_Jxu8(e6 zf4Q`F$Qio2Jw@N*E@k?c`+Sw}AYQjkT+x)OAe6eq(AT!iRuksKQn%Ao_Ac1T-p#Js I_CnHs0qX}mlmGw# literal 0 HcmV?d00001 diff --git a/docs/images/tag_green.png b/docs/images/tag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..83ec984bd73364134da0f98d27a800c5d3264180 GIT binary patch literal 613 zcmV-r0-F7aP)^5T)AZ%#@G{_P{NCN^P z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x zhJodBxe>iyk3%w<%wC8holUJ4(iv>tL{`DQt zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2 z9P*}mw}7X$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6 z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo+_uWuFa z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29 literal 0 HcmV?d00001 diff --git a/docs/images/transparent.png b/docs/images/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..d665e179efd797451084235f105425247fea0a14 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>;M1%mmiTn0pv241o;Is pI6S+N2ITN~x;Tb#$R;N!@B(=T42&&nK2`x)44$rjF6*2UngG277DE64 literal 0 HcmV?d00001 diff --git a/docs/images/wrench.png b/docs/images/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8213fef5ab969f03189d4367e32e597e38bd7f GIT binary patch literal 610 zcmV-o0-gPdP)^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)lCUe z<FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~O3xbrKY=&TiwPYkJroM{;WUQTuMY8vpg}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJKV;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~ zvb`d3Mydwjt&Df^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG Wk@)HE*94aU0000m+BBgry{~j2fHLegbHP( zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6 zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24H!V{ zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV zHoFY`D~2x|2 + + + + + +RDoc Documentation + + + + + + + + + + + + + + + + +
+

This is the API documentation for RDoc Documentation. +

+ + + + diff --git a/docs/js/darkfish.js b/docs/js/darkfish.js new file mode 100644 index 0000000..111bbf8 --- /dev/null +++ b/docs/js/darkfish.js @@ -0,0 +1,84 @@ +/** + * + * Darkfish Page Functions + * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ + * + * Author: Michael Granger + * + */ + +/* Provide console simulation for firebug-less environments */ +/* +if (!("console" in window) || !("firebug" in console)) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +}; +*/ + + +function showSource( e ) { + var target = e.target; + while (!target.classList.contains('method-detail')) { + target = target.parentNode; + } + if (typeof target !== "undefined" && target !== null) { + target = target.querySelector('.method-source-code'); + } + if (typeof target !== "undefined" && target !== null) { + target.classList.toggle('active-menu') + } +}; + +function hookSourceViews() { + document.querySelectorAll('.method-heading').forEach(function (codeObject) { + codeObject.addEventListener('click', showSource); + }); +}; + +function hookSearch() { + var input = document.querySelector('#search-field'); + var result = document.querySelector('#search-results'); + result.classList.remove("initially-hidden"); + + var search_section = document.querySelector('#search-section'); + search_section.classList.remove("initially-hidden"); + + var search = new Search(search_data, input, result); + + search.renderItem = function(result) { + var li = document.createElement('li'); + var html = ''; + + // TODO add relative path to + + + + + + + + + + + + +
+

Table of Contents - RDoc Documentation

+ +

Pages

+ + +

Classes and Modules

+ + +

Methods

+
    + +
  • + ::new + — + Mercadopago::RequestOptions + +
  • + ::new + — + Mercadopago::MPBase + +
  • + ::new + — + Mercadopago::SDK + +
  • + #_check_headers + — + Mercadopago::MPBase + +
  • + #_check_request_options + — + Mercadopago::MPBase + +
  • + #_delete + — + Mercadopago::MPBase + +
  • + #_get + — + Mercadopago::MPBase + +
  • + #_post + — + Mercadopago::MPBase + +
  • + #_put + — + Mercadopago::MPBase + +
  • + #access_token= + — + Mercadopago::RequestOptions + +
  • + #access_token= + — + Mercadopago::SDK + +
  • + #advanced_payment + — + Mercadopago::SDK + +
  • + #api_base_url + — + Mercadopago::Config + +
  • + #cancel + — + Mercadopago::AdvancedPayment + +
  • + #capture + — + Mercadopago::AdvancedPayment + +
  • + #card + — + Mercadopago::SDK + +
  • + #card_token + — + Mercadopago::SDK + +
  • + #connection_timeout= + — + Mercadopago::RequestOptions + +
  • + #corporation_id= + — + Mercadopago::RequestOptions + +
  • + #create + — + Mercadopago::Card + +
  • + #create + — + Mercadopago::Customer + +
  • + #create + — + Mercadopago::CardToken + +
  • + #create + — + Mercadopago::Refund + +
  • + #create + — + Mercadopago::Preference + +
  • + #create + — + Mercadopago::Payment + +
  • + #create + — + Mercadopago::MerchantOrder + +
  • + #create + — + Mercadopago::DisbursementRefund + +
  • + #create + — + Mercadopago::AdvancedPayment + +
  • + #create_all + — + Mercadopago::DisbursementRefund + +
  • + #custom_headers= + — + Mercadopago::RequestOptions + +
  • + #customer + — + Mercadopago::SDK + +
  • + #delete + — + Mercadopago::Card + +
  • + #delete + — + Mercadopago::HttpClient + +
  • + #delete + — + Mercadopago::Customer + +
  • + #disbursement_refund + — + Mercadopago::SDK + +
  • + #get + — + Mercadopago::MerchantOrder + +
  • + #get + — + Mercadopago::HttpClient + +
  • + #get + — + Mercadopago::AdvancedPayment + +
  • + #get + — + Mercadopago::Card + +
  • + #get + — + Mercadopago::CardToken + +
  • + #get + — + Mercadopago::Customer + +
  • + #get + — + Mercadopago::IdentificationType + +
  • + #get + — + Mercadopago::Payment + +
  • + #get + — + Mercadopago::PaymentMethods + +
  • + #get + — + Mercadopago::Preference + +
  • + #get + — + Mercadopago::User + +
  • + #get_headers + — + Mercadopago::RequestOptions + +
  • + #http_client= + — + Mercadopago::SDK + +
  • + #identification_type + — + Mercadopago::SDK + +
  • + #integrator_id= + — + Mercadopago::RequestOptions + +
  • + #list + — + Mercadopago::Card + +
  • + #list + — + Mercadopago::DisbursementRefund + +
  • + #list + — + Mercadopago::Refund + +
  • + #max_retries= + — + Mercadopago::RequestOptions + +
  • + #merchant_order + — + Mercadopago::SDK + +
  • + #mime_form + — + Mercadopago::Config + +
  • + #mime_json + — + Mercadopago::Config + +
  • + #payment + — + Mercadopago::SDK + +
  • + #payment_methods + — + Mercadopago::SDK + +
  • + #platform_id= + — + Mercadopago::RequestOptions + +
  • + #post + — + Mercadopago::HttpClient + +
  • + #preference + — + Mercadopago::SDK + +
  • + #product_id + — + Mercadopago::Config + +
  • + #put + — + Mercadopago::HttpClient + +
  • + #refund + — + Mercadopago::SDK + +
  • + #request_options + — + Mercadopago::SDK + +
  • + #request_options= + — + Mercadopago::SDK + +
  • + #search + — + Mercadopago::AdvancedPayment + +
  • + #search + — + Mercadopago::Payment + +
  • + #search + — + Mercadopago::Customer + +
  • + #search + — + Mercadopago::MerchantOrder + +
  • + #tracking_id + — + Mercadopago::Config + +
  • + #update + — + Mercadopago::Payment + +
  • + #update + — + Mercadopago::Customer + +
  • + #update + — + Mercadopago::MerchantOrder + +
  • + #update + — + Mercadopago::Preference + +
  • + #update + — + Mercadopago::AdvancedPayment + +
  • + #update_release_date + — + Mercadopago::AdvancedPayment + +
  • + #user + — + Mercadopago::SDK + +
  • + #user_agent + — + Mercadopago::Config + +
  • + #version + — + Mercadopago::Config +
+
+ + + + diff --git a/examples/checkout-buttons/basic_preference/button.rb b/examples/checkout-buttons/basic_preference/button.rb deleted file mode 100755 index 86a6cb3..0000000 --- a/examples/checkout-buttons/basic_preference/button.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../../lib' -require 'mercadopago.rb' - -class Button - - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - preferenceData = {"items" => ["title"=>"testCreate", "quantity"=>1, "unit_price"=>10.2, "currency_id"=>"ARS"]} - preference = mp.create_preference(preferenceData) - - html = ' - - - MercadoPago SDK - Create Preference and Show Checkout Example - - - Pay - - - ' - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(Button.new, :Port => 9000) diff --git a/examples/instant-payment-notifications/receive-ipn.rb b/examples/instant-payment-notifications/receive-ipn.rb deleted file mode 100644 index 3abff1d..0000000 --- a/examples/instant-payment-notifications/receive-ipn.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../lib' -require 'mercadopago.rb' - -class IPN - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - - # Get the payment reported by the IPN. Glossary of attributes response in https://developers.mercadopago.com - payment_info = mp.get_payment_info('ID'); - - html = "" - # Show payment information - if (payment_info['status'] == 200) - html = payment_info['response'].inspect - else - html = payment_info['response'].inspect - end - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(IPN.new, :Port => 9000) diff --git a/examples/payment-search/search-approved-payments.rb b/examples/payment-search/search-approved-payments.rb deleted file mode 100644 index 797b84f..0000000 --- a/examples/payment-search/search-approved-payments.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../lib' -require 'mercadopago.rb' - -class IPN - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - - # Sets the filters you want - filters = Hash["range"=>"date_created", "begin_date"=>"NOW-1MONTH", "end_date"=>"NOW", "status"=>"approved", "operation_type"=>"regular_payment"] - - # Search payment data according to filters - searchResult = mp.search_payment(filters) - - # Show payment information - html = searchResult.inspect - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(IPN.new, :Port => 9000) diff --git a/examples/payment-search/search-creditcard-payments.rb b/examples/payment-search/search-creditcard-payments.rb deleted file mode 100644 index ff19a40..0000000 --- a/examples/payment-search/search-creditcard-payments.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../lib' -require 'mercadopago.rb' - -class IPN - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - - # Sets the filters you want - filters = Hash["range"=>"date_created", "begin_date"=>"2011-10-21T00:00:00Z", "end_date"=>"2011-10-25T24:00:00Z", "payment_type_id"=>"credit_card", "operation_type"=>"regular_payment"] - - # Search payment data according to filters - searchResult = mp.search_payment(filters) - - # Show payment information - html = searchResult.inspect - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(IPN.new, :Port => 9000) diff --git a/examples/payment-search/search-funded-payments-by-name.rb b/examples/payment-search/search-funded-payments-by-name.rb deleted file mode 100644 index 4bccedc..0000000 --- a/examples/payment-search/search-funded-payments-by-name.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../lib' -require 'mercadopago.rb' - -class IPN - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - - # Sets the filters you want - filters = Hash["installments" => 12, "description"=>"product_name", "operation_type"=>"regular_payment"] - - # Search payment data according to filters - searchResult = mp.search_payment(filters) - - # Show payment information - html = searchResult.inspect - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(IPN.new, :Port => 9000) diff --git a/examples/payment-search/search-payments-from-email-and-date.rb b/examples/payment-search/search-payments-from-email-and-date.rb deleted file mode 100644 index 1341fe3..0000000 --- a/examples/payment-search/search-payments-from-email-and-date.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../lib' -require 'mercadopago.rb' - -class IPN - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - - # Sets the filters you want - filters = Hash["payer.email" => "mail02@mail02.com", "begin_date"=>"2011-01-01T00:00:00Z", "end_date"=>"2011-02-01T00:00:00Z"] - - # Search payment data according to filters - searchResult = mp.search_payment(filters) - - # Show payment information - html = searchResult.inspect - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(IPN.new, :Port => 9000) diff --git a/examples/payment-search/search-payments.rb b/examples/payment-search/search-payments.rb deleted file mode 100644 index 2db2b0a..0000000 --- a/examples/payment-search/search-payments.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../lib' -require 'mercadopago.rb' - -class IPN - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - - # Sets the filters you want - filters = Hash["external_reference"=>"Bill001"] - - # Search payment data according to filters - searchResult = mp.search_payment(filters) - - # Show payment information - html = searchResult.inspect - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(IPN.new, :Port => 9000) diff --git a/examples/preapproval-payments/button.rb b/examples/preapproval-payments/button.rb deleted file mode 100755 index 3c03178..0000000 --- a/examples/preapproval-payments/button.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'rubygems' -require 'rack' -$LOAD_PATH << '../../lib' -require 'mercadopago.rb' - -class Button - - def call(env) - mp = MercadoPago.new('CLIENT_ID', 'CLIENT_SECRET') - preapprovalPayment_data = Hash[ - "payer_email" => "my_customer@my_site.com", - "back_url" => "http://www.my_site.com", - "reason" => "Monthly subscription to premium package", - "external_reference" => "OP-1234", - "auto_recurring" => Hash[ - "frequency" => 1, - "frequency_type" => "months", - "transaction_amount" => 60, - "currency_id" => "BRL", - "start_date" => "2012-12-10T14:58:11.778-03:00", - "end_date" => "2013-06-10T14:58:11.778-03:00" - ] - ] - - preapprovalPayment = mp.create_preapproval_payment(preapprovalPayment_data) - - html = ' - - - MercadoPago SDK - Create Preapproval Payment and Show Subscription Example - - - Pay - - - ' - - return [200, {'Content-Type' => 'text/html'}, [html]] - end -end - -Rack::Handler::WEBrick.run(Button.new, :Port => 9000) diff --git a/lib/mercadopago.rb b/lib/mercadopago.rb index c65513a..4b8cb9c 100644 --- a/lib/mercadopago.rb +++ b/lib/mercadopago.rb @@ -1,295 +1,24 @@ -#MercadoPago Integration Library -#Access MercadoPago for payments integration -# -#@author @maticompiano -#@contributors @chrismo - -require 'rubygems' -require 'json' -require 'uri' -require 'net/https' -require 'yaml' -require File.dirname(__FILE__) + '/version' -require 'ssl_options_patch' - -class MercadoPago - def initialize(*args) - if args.size < 1 or args.size > 2 - raise "Invalid arguments. Use CLIENT_ID and CLIENT SECRET, or ACCESS_TOKEN" - end - - @client_id = args.at(0) if args.size == 2 - @client_secret = args.at(1) if args.size == 2 - @ll_access_token = args.at(0) if args.size == 1 - - @rest_client = RestClient.new() - @rest_client.set_access_token(get_access_token) - @sandbox = false - end - - def set_debug_logger(debug_logger) - @rest_client.set_debug_logger(debug_logger) - end - - def set_platform_id(platform_id) - @rest_client.set_platform_id(platform_id) - end - - def set_integrator_id(integrator_id) - @rest_client.set_integrator_id(integrator_id) - end - - def set_corporation_id(corporation_id) - @rest_client.set_corporation_id(corporation_id) - end - - def sandbox_mode(enable=nil) - if not enable.nil? - @sandbox = enable - end - - return @sandbox - end - - # Get Access Token for API use - def get_access_token - if @ll_access_token - @ll_access_token - else - app_client_values = { - 'grant_type' => 'client_credentials', - 'client_id' => @client_id, - 'client_secret' => @client_secret - } - - @access_data = @rest_client.post("/oauth/token", build_query(app_client_values), RestClient::MIME_FORM) - - if @access_data['status'] == "200" - @access_data = @access_data["response"] - @access_data['access_token'] - else - raise @access_data.inspect - end - end - end - - # Get information for specific payment - def get_payment(id) - uri_prefix = @sandbox ? "/sandbox" : "" - - @rest_client.get(uri_prefix + "/v1/payments/" + id) - - end - - def get_payment_info(id) - get_payment(id) - end - - # Get information for specific authorized payment - def get_authorized_payment(id) - @rest_client.get("/authorized_payments/" + id) - end - - # Refund accredited payment - def refund_payment(id) - refund_status = {} - @rest_client.post("/v1/payments/" + id, refund_status) - - end - - # Cancel pending payment - def cancel_payment(id) - cancel_status = {"status" => "cancelled"} - @rest_client.put("/v1/payments/" + id, cancel_status) - end - - # Cancel preapproval payment - def cancel_preapproval_payment(id) - cancel_status = {"status" => "cancelled"} - @rest_client.put("/preapproval/" + id, cancel_status) - end - - # Search payments according to filters, with pagination - def search_payment(filters, offset=0, limit=0) - filters["offset"] = offset - filters["limit"] = limit - - filters = build_query(filters) - - uri_prefix = @sandbox ? "/sandbox" : "" - - @rest_client.get(uri_prefix + "/v1/payments/search?" + filters) - - end - - # Create a checkout preference - def create_preference(preference) - @rest_client.post("/checkout/preferences", preference) - end - - # Update a checkout preference - def update_preference(id, preference) - @rest_client.put("/checkout/preferences/" + id, preference) - end - - # Get a checkout preference - def get_preference(id) - @rest_client.get("/checkout/preferences/" + id) - end - - # Create a preapproval payment - def create_preapproval_payment(preapproval_payment) - @rest_client.post("/preapproval", preapproval_payment) - end - - # Get a preapproval payment - def get_preapproval_payment(id) - @rest_client.get("/preapproval/" + id) - end - - # Generic resource get - def get(uri, params = nil, authenticate = true) - if not params.class == Hash - params = Hash.new - end - - if not params.empty? - uri << (if uri.include? "?" then "&" else "?" end) << build_query(params) - end - - @rest_client.get(uri) - end - - # Generic resource post - def post(uri, data, params = nil) - if not params.class == Hash - params = Hash.new - end - - if not params.empty? - uri << (if uri.include? "?" then "&" else "?" end) << build_query(params) - end - - @rest_client.post(uri, data) - end - - # Generic resource put - def put(uri, data, params = nil) - if not params.class == Hash - params = Hash.new - end - - if not params.empty? - uri << (if uri.include? "?" then "&" else "?" end) << build_query(params) - end - - @rest_client.put(uri, data) - end - - # Generic resource delete - def delete(uri, params = nil) - if not params.class == Hash - params = Hash.new - end - - if not params.empty? - uri << (if uri.include? "?" then "&" else "?" end) << build_query(params) - end - - @rest_client.delete(uri) - end - - def build_query(params) - URI.escape(params.collect { |k, v| "#{k}=#{v}" }.join('&')) - end - - private - - class RestClient - - MIME_JSON = 'application/json' - MIME_FORM = 'application/x-www-form-urlencoded' - API_BASE_URL = URI.parse('https://api.mercadopago.com') - - def initialize(debug_logger=nil) - @http = Net::HTTP.new(API_BASE_URL.host, API_BASE_URL.port) - - if API_BASE_URL.scheme == "https" # enable SSL/TLS - @http.use_ssl = true - @http.verify_mode = OpenSSL::SSL::VERIFY_PEER - - # explicitly tell OpenSSL not to use SSL3 nor TLS 1.0 - @http.ssl_options = OpenSSL::SSL::OP_NO_SSLv3 + OpenSSL::SSL::OP_NO_TLSv1 - end - - @http.set_debug_output debug_logger if debug_logger - - @platform_id = nil - @integrator_id = nil - @corporation_id = nil - @access_token = nil - end - - def set_debug_logger(debug_logger) - @http.set_debug_output debug_logger - end - - def set_platform_id(platform_id) - @platform_id = platform_id - end - - def set_integrator_id(integrator_id) - @integrator_id = integrator_id - end - - def set_corporation_id(corporation_id) - @corporation_id = corporation_id - end - - def set_access_token(access_token) - @access_token = access_token - end - - def exec(method, uri, data, content_type) - if not data.nil? and content_type == MIME_JSON - data = data.to_json - end - - headers = { - 'x-product-id' => PRODUCT_ID, - 'x-tracking-id' => "platform:"+RUBY_VERSION.split('.')[0]+"|"+RUBY_VERSION+",type:SDK"+MERCADO_PAGO_VERSION+",so;", - 'User-Agent' => "MercadoPago Ruby SDK v" + MERCADO_PAGO_VERSION, - 'Content-type' => content_type, - 'Accept' => MIME_JSON - } - - headers['Authorization'] = "Bearer " + @access_token if @access_token != nil - headers['x-platform-id'] = @platform_id if @platform_id != nil - headers['x-integrator-id'] = @integrator_id if @integrator_id != nil - headers['x-corporation-id'] = @corporation_id if @corporation_id != nil - - api_result = @http.send_request(method, uri, data, headers) - - { - "status" => api_result.code, - "response" => JSON.parse(api_result.body) - } - end - - def get(uri, content_type=MIME_JSON) - exec("GET", uri, nil, content_type) - end - - def post(uri, data = nil, content_type=MIME_JSON) - exec("POST", uri, data, content_type) - end - - def put(uri, data = nil, content_type=MIME_JSON) - exec("PUT", uri, data, content_type) - end - - def delete(uri, content_type=MIME_JSON) - exec("DELETE", uri, nil, content_type) - end - end -end +# typed: strict +# frozen_string_literal: true + +require_relative './mercadopago/http/http_client' + +require_relative './mercadopago/core/mp_base' + +require_relative './mercadopago/config/config' +require_relative './mercadopago/config/request_options' + +require_relative './mercadopago/resources/customer' +require_relative './mercadopago/resources/card' +require_relative './mercadopago/resources/user' +require_relative './mercadopago/resources/identification_type' +require_relative './mercadopago/resources/preference' +require_relative './mercadopago/resources/payment' +require_relative './mercadopago/resources/card_token' +require_relative './mercadopago/resources/refund' +require_relative './mercadopago/resources/merchant_order' +require_relative './mercadopago/resources/payment_methods' +require_relative './mercadopago/resources/advanced_payment' +require_relative './mercadopago/resources/disbursement_refund' + +require_relative './mercadopago/sdk' diff --git a/lib/mercadopago/config/config.rb b/lib/mercadopago/config/config.rb new file mode 100644 index 0000000..a6fabb5 --- /dev/null +++ b/lib/mercadopago/config/config.rb @@ -0,0 +1,42 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + class Config + @@VERSION = '2.0.0' + @@USER_AGENT = "MercadoPago Ruby SDK v#{@@VERSION}" + @@PRODUCT_ID = 'bc32a7vtrpp001u8nhjg' + @@TRACKING_ID = "plataform: ?,type:SDK#{@@VERSION},so;" + @@API_BASE_URL = 'https://api.mercadopago.com' + @@MIME_JSON = 'application/json' + @@MIME_FORM = 'application/x-www-form-urlencoded' + + def version + @@VERSION + end + + def user_agent + @@USER_AGENT + end + + def product_id + @@PRODUCT_ID + end + + def tracking_id + @@TRACKING_ID + end + + def api_base_url + @@API_BASE_URL + end + + def mime_json + @@MIME_JSON + end + + def mime_form + @@MIME_FORM + end + end +end diff --git a/lib/mercadopago/config/request_options.rb b/lib/mercadopago/config/request_options.rb new file mode 100644 index 0000000..35b4f96 --- /dev/null +++ b/lib/mercadopago/config/request_options.rb @@ -0,0 +1,85 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + class RequestOptions + attr_reader :access_token, :connection_timeout, :custom_headers, :corporation_id, :integrator_id, + :platform_id, :max_retries + + def initialize(access_token: nil, + connection_timeout: 60.0, + custom_headers: nil, + corporation_id: nil, + integrator_id: nil, + platform_id: nil, + max_retries: 3) + self.access_token = access_token + self.connection_timeout = connection_timeout + self.custom_headers = custom_headers + self.corporation_id = corporation_id + self.integrator_id = integrator_id + self.platform_id = platform_id + self.max_retries = max_retries + + @config = Config.new + end + + def get_headers + headers = { 'Authorization': "Bearer #{@access_token}", + 'x-product-id' => @config.product_id, + 'x-tracking-id' => @config.tracking_id, + 'User-Agent' => @config.user_agent, + 'Accept': @config.mime_json } + + headers['x-corporation-id'] = @corporation_id unless @corporation_id.nil? + headers['x-integrator-id'] = @integrator_id unless @integrator_id.nil? + headers['x-platform-id'] = @platform_id unless @platform_id.nil? + + headers.merge(@custom_headers) unless @custom_headers.nil? + + headers + end + + def access_token=(value) + raise TypeError, 'Param access_token must be a String' unless access_token.nil? || value.is_a?(String) + + @access_token = value + end + + def custom_headers=(value) + raise TypeError, 'Param custom_headers must be a Hash' unless value.nil? || value.is_a?(Hash) + + @custom_headers = value + end + + def connection_timeout=(value) + raise TypeError, 'Param connection_timeout must be a Float' unless value.is_a?(Float) + + @connection_timeout = value + end + + def corporation_id=(value) + raise TypeError, 'Param corporation_id must be a String' unless value.nil? || value.is_a?(String) + + @corporation_id = value + end + + def integrator_id=(value) + raise TypeError, 'Param integrator_id must be a String' unless value.nil? || value.is_a?(String) + + @integrator_id = value + end + + def platform_id=(value) + raise TypeError, 'Param platform_id must be a String' unless value.nil? || value.is_a?(String) + + @platform_id = value + end + + def max_retries=(value) + raise TypeError, 'Param max_retries must be a Integer' unless value.is_a?(Integer) + + @max_retries = value + end + end +end diff --git a/lib/mercadopago/core/mp_base.rb b/lib/mercadopago/core/mp_base.rb new file mode 100644 index 0000000..6dc8a71 --- /dev/null +++ b/lib/mercadopago/core/mp_base.rb @@ -0,0 +1,77 @@ +# typed: false +# frozen_string_literal: true + +module Mercadopago + ## + # Module Base + class MPBase + def initialize(request_options, http_client) + unless request_options.is_a?(RequestOptions) + raise TypeError, + 'Param request_options must be a RequestOptions object' + end + + @request_options = request_options + @http_client = http_client + @config = Config.new + end + + def _check_request_options(request_options = nil) + request_options = @request_options if request_options.nil? + unless request_options.is_a?(RequestOptions) + raise TypeError, + 'Param request_options must be a RequestOptions object' + end + + request_options.access_token = @request_options.access_token if request_options.access_token.nil? + + request_options + end + + def _check_headers(request_options = nil, extra_headers = nil) + headers = request_options.nil? ? request_options.get_headers : @request_options.get_headers + + headers.merge!(extra_headers) unless extra_headers.nil? + + headers + end + + def _get(uri:, filters: nil, request_options: nil) + raise TypeError, 'Filters must be a Hash' unless filters.nil? || filters.is_a?(Hash) + + request_options = _check_request_options(request_options) + headers = _check_headers(request_options) + + @http_client.get(url: @config.api_base_url + uri, headers: headers, params: filters, + timeout: request_options.connection_timeout, maxretries: request_options.max_retries) + end + + def _post(uri:, data:, request_options: nil) + raise TypeError, 'Data must be a Hash' unless data.nil? || data.is_a?(Hash) + + request_options = _check_request_options(request_options) + headers = _check_headers(request_options, { 'Content-Type': @config.mime_json }) + + @http_client.post(url: @config.api_base_url + uri, data: data.to_json, headers: headers, + timeout: request_options.connection_timeout) + end + + def _put(uri:, data:, request_options: nil) + raise TypeError, 'Data must be a Hash' unless data.nil? || data.is_a?(Hash) + + request_options = _check_request_options(request_options) + headers = _check_headers(request_options, { 'Content-Type': @config.mime_json }) + + @http_client.put(url: @config.api_base_url + uri, data: data.to_json, headers: headers, + timeout: request_options.connection_timeout) + end + + def _delete(uri:, request_options: nil) + request_options = _check_request_options(request_options) + headers = _check_headers(request_options) + + @http_client.delete(url: @config.api_base_url + uri, headers: headers, + timeout: request_options.connection_timeout) + end + end +end diff --git a/lib/mercadopago/http/http_client.rb b/lib/mercadopago/http/http_client.rb new file mode 100644 index 0000000..3389eb8 --- /dev/null +++ b/lib/mercadopago/http/http_client.rb @@ -0,0 +1,74 @@ +# typed: false +# frozen_string_literal: true + +require 'rest-client' +require 'json' + +module Mercadopago + class HttpClient + def get(url:, headers:, params: nil, timeout: nil, maxretries: nil) + try = 0 + headers = {} if headers.nil? + headers[:params] = params unless params.nil? + + begin + result = RestClient::Request.execute(method: :get, url: url, headers: headers, timeout: timeout) + { + status: result.code, + response: JSON.parse(result.body) + } + rescue RestClient::Exception => e + try += 1 + if [429, 500, 502, 503, 504].include?(e.http_code) && (try < maxretries) + sleep(1) + retry + end + { + status: e.http_code, + response: JSON.parse(e.response.body) + } + end + end + + def post(url:, data:, headers:, timeout: nil) + result = RestClient::Request.execute(method: :post, url: url, payload: data, headers: headers, + timeout: timeout) + { + status: result.code, + response: JSON.parse(result.body) + } + rescue RestClient::Exception => e + { + status: e.http_code, + response: JSON.parse(e.response.body) + } + end + + def put(url:, data:, headers:, timeout: nil) + result = RestClient::Request.execute(method: :put, url: url, payload: data, headers: headers, + timeout: timeout) + { + status: result.code, + response: JSON.parse(result.body) + } + rescue RestClient::Exception => e + { + status: e.http_code, + response: JSON.parse(e.response.body) + } + end + + def delete(url:, headers:, timeout: nil) + result = RestClient::Request.execute(method: 'delete', url: url, headers: headers, timeout: timeout) + { + status: result.code, + response: JSON.parse(result.body) + } + rescue RestClient::Exception => e + { + status: e.http_code, + response: JSON.parse(e.response.body) + } + end + end +end diff --git a/lib/mercadopago/resources/advanced_payment.rb b/lib/mercadopago/resources/advanced_payment.rb new file mode 100644 index 0000000..1a0a719 --- /dev/null +++ b/lib/mercadopago/resources/advanced_payment.rb @@ -0,0 +1,48 @@ +# typed: false +# frozen_string_literal: true + +module Mercadopago + ### + # Access to Advanced Payments + + class AdvancedPayment < MPBase + def search(filters: nil, request_options: nil) + raise TypeError, 'Param filters must be a Hash' unless filters.nil? || filters.is_a?(Hash) + + _get(uri: '/v1/advanced_payments/search', filters: filters, request_options: request_options) + end + + def get(advanced_payment_id, request_options: nil) + _get(uri: "/v1/advanced_payments/#{advanced_payment_id}", request_options: request_options) + end + + def create(advanced_payment_data, request_options: nil) + raise TypeError, 'Param advanced_payment_data must be a Hash' unless advanced_payment_data.is_a?(Hash) + + _post(uri: '/v1/advanced_payments', data: advanced_payment_data, request_options: request_options) + end + + def capture(advanced_payment_id, request_options: nil) + capture_data = { capture: true } + _put(uri: "/v1/advanced_payments/#{advanced_payment_id}", data: capture_data, request_options: request_options) + end + + def update(advanced_payment_id, advanced_payment_data, request_options: nil) + raise TypeError, 'Param advanced_payment_data must be a Hash' unless advanced_payment_data.is_a?(Hash) + + _put(uri: "/v1/advanced_payments/#{advanced_payment_id}", data: advanced_payment_data, + request_options: request_options) + end + + def cancel(advanced_payment_id, request_options: nil) + cancel_data = { status: 'cancelled' } + _put(uri: "/v1/advanced_payments/#{advanced_payment_id}", data: cancel_data, request_options: request_options) + end + + def update_release_date(advanced_payment_id, release_date, request_options: nil) + disbursement_data = { money_release_date: release_date.strftime('%Y-%m-%d %H:%M:%S.%f') } + _post(uri: "/v1/advanced_payments/#{advanced_payment_id}/disburses", data: disbursement_data, + request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/card.rb b/lib/mercadopago/resources/card.rb new file mode 100644 index 0000000..e2e9979 --- /dev/null +++ b/lib/mercadopago/resources/card.rb @@ -0,0 +1,31 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # The cards class is the way to store card data of your customers safely to improve the shopping experience. + # This will allow your customers to complete their purchases much faster and easily, since they will not have to complete their card data again. + + # This class must be used in conjunction with the Customer class. + # [Click here for more infos](https://www.mercadopago.com/developers/en/guides/online-payments/web-tokenize-checkout/customers-and-cards) + + class Card < MPBase + def get(customer_id, card_id, request_options: nil) + _get(uri: "/v1/customers/#{customer_id}/cards/#{card_id}", request_options: request_options) + end + + def create(customer_id, card_data, request_options: nil) + raise TypeError, 'Param card_data must be a Hash' if card_data.nil? || !card_data.is_a?(Hash) + + _post(uri: "/v1/customers/#{customer_id}/cards/", data: card_data, request_options: request_options) + end + + def delete(customer_id, card_id, request_options: nil) + _delete(uri: "/v1/customers/#{customer_id}/cards/#{card_id}", request_options: request_options) + end + + def list(customer_id, request_options: nil) + _get(uri: "/v1/customers/#{customer_id}/cards", request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/card_token.rb b/lib/mercadopago/resources/card_token.rb new file mode 100644 index 0000000..3a4ab6f --- /dev/null +++ b/lib/mercadopago/resources/card_token.rb @@ -0,0 +1,19 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ## + # This class will allow you to send your customers card data for Mercado Pago server and receive a token to complete the payments transactions. + + class CardToken < MPBase + def get(card_token_id, request_options: nil) + _get(uri: "/v1/card_tokens/#{card_token_id}", request_options: request_options) + end + + def create(card_token_data, request_options: nil) + raise TypeError, 'Param card_token_data must be a Hash' unless card_token_data.is_a?(Hash) + + _post(uri: '/v1/card_tokens', data: card_token_data, request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/customer.rb b/lib/mercadopago/resources/customer.rb new file mode 100644 index 0000000..043f760 --- /dev/null +++ b/lib/mercadopago/resources/customer.rb @@ -0,0 +1,36 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # This class allows you to store customers data safely to improve the shopping experience. + + # This will allow your customer to complete their purchases much faster and easily when used in conjunction with the Cards class. + # [Click here for more infos](https://mercadopago.com.br/developers/en/guides/online-payments/web-tokenize-checkout/customers-and-cards) + + class Customer < MPBase + def search(filters: nil, request_options: nil) + _get(uri: '/v1/customers/search', filters: filters, request_options: request_options) + end + + def get(customer_id, request_options: nil) + _get(uri: "/v1/customers/#{customer_id}", request_options: request_options) + end + + def create(customer_data, request_options: nil) + raise TypeError, 'Param customer_data must be a Hash' unless customer_data.is_a?(Hash) + + _post(uri: '/v1/customers', data: customer_data, request_options: request_options) + end + + def update(customer_id, customer_data, request_options: nil) + raise TypeError, 'Param customer_data must be a Hash' unless customer_data.is_a?(Hash) + + _put(uri: "/v1/customers/#{customer_id}", data: customer_data, request_options: request_options) + end + + def delete(customer_id, request_options: nil) + _delete(uri: "/v1/customers/#{customer_id}", request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/disbursement_refund.rb b/lib/mercadopago/resources/disbursement_refund.rb new file mode 100644 index 0000000..58acfc8 --- /dev/null +++ b/lib/mercadopago/resources/disbursement_refund.rb @@ -0,0 +1,24 @@ +# typed: false +# frozen_string_literal: true + +module Mercadopago + # ### + # #Access to Advanced Payments Refunds + + class DisbursementRefund < MPBase + def list(advanced_payment_id, request_options: nil) + _get(uri: "/v1/advanced_payments/#{advanced_payment_id}/refunds", request_options: nil) + end + + def create_all(advanced_payment_id, request_options: nil) + _post(uri: "/v1/advanced_payments/#{advanced_payment_id}/refunds", request_options: request_options) + end + + def create(advanced_payment_id, disbursement_id, amount: nil, request_options: nil) + disbursement_refund_data = amount.nil? ? nil : { amount: amount } + + _post(uri: "/v1/advanced_payments/#{advanced_payment_id}/disbursements/#{disbursement_id}/refunds", + data: disbursement_refund_data, request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/identification_type.rb b/lib/mercadopago/resources/identification_type.rb new file mode 100644 index 0000000..c8eaee1 --- /dev/null +++ b/lib/mercadopago/resources/identification_type.rb @@ -0,0 +1,13 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # Access to Identification Types + + class IdentificationType < MPBase + def get(request_options: nil) + _get(uri: '/v1/identification_types', request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/merchant_order.rb b/lib/mercadopago/resources/merchant_order.rb new file mode 100644 index 0000000..8bbd121 --- /dev/null +++ b/lib/mercadopago/resources/merchant_order.rb @@ -0,0 +1,32 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # This class will allow you to create and manage your orders. You can attach one or more payments in your merchant order. + + class MerchantOrder < MPBase + def search(filters: nil, request_options: nil) + raise TypeError, 'Param filters must be a Hash' unless filters.nil? || filters.is_a?(Hash) + + _get(uri: '/merchant_orders/search', filters: filters, request_options: request_options) + end + + def get(merchant_order_id, request_options: nil) + _get(uri: "/merchant_orders/#{merchant_order_id}", request_options: request_options) + end + + def create(merchant_order_data, request_options: nil) + raise TypeError, 'Param merchant_orders_object must be a Hash' unless merchant_order_data.is_a?(Hash) + + _post(uri: '/merchant_orders', data: merchant_order_data, request_options: request_options) + end + + def update(merchant_order_id, merchant_order_data, request_options: nil) + raise TypeError, 'Param merchant_orders_object must be a Hash' unless merchant_order_data.is_a?(Hash) + + _put(uri: "/merchant_orders/#{merchant_order_id}", data: merchant_order_data, + request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/payment.rb b/lib/mercadopago/resources/payment.rb new file mode 100644 index 0000000..557baef --- /dev/null +++ b/lib/mercadopago/resources/payment.rb @@ -0,0 +1,35 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # This class provides the methods to access the API that will allow you to create your own payment experience on your website. + + # From basic to advanced configurations, you control the whole experience. + + # [Click here for more infos](https://www.mercadopago.com.br/developers/en/guides/online-payments/checkout-api/introduction/) + + class Payment < MPBase + def search(filters: nil, request_options: nil) + raise TypeError, 'Param filters must be a Hash' unless filters.nil? || filters.is_a?(Hash) + + _get(uri: '/v1/payments/search', filters: filters, request_options: request_options) + end + + def get(payment_id, request_options: nil) + _get(uri: "/v1/payments/#{payment_id}", request_options: request_options) + end + + def create(payment_data, request_options: nil) + raise TypeError, 'Param payment_data must be a Hash' unless payment_data.is_a?(Hash) + + _post(uri: '/v1/payments/', data: payment_data, request_options: request_options) + end + + def update(payment_id, payment_data, request_options: nil) + raise TypeError, 'Param payment_data must be a Hash' unless payment_data.is_a?(Hash) + + _put(uri: "/v1/payments/#{payment_id}", data: payment_data, request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/payment_methods.rb b/lib/mercadopago/resources/payment_methods.rb new file mode 100644 index 0000000..72add28 --- /dev/null +++ b/lib/mercadopago/resources/payment_methods.rb @@ -0,0 +1,13 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # Access to Payment Methods + + class PaymentMethods < MPBase + def get(request_options: nil) + _get(uri: '/v1/payment_methods', request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/preference.rb b/lib/mercadopago/resources/preference.rb new file mode 100644 index 0000000..c1d3f8d --- /dev/null +++ b/lib/mercadopago/resources/preference.rb @@ -0,0 +1,26 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ## + # This class will allow you to charge your customers through our web form from any device in a simple, fast and secure way. + # [Click here for more infos](https://www.mercadopago.com.br/developers/en/guides/online-payments/checkout-pro/introduction) + + class Preference < MPBase + def get(preference_id, request_options: nil) + _get(uri: "/checkout/preferences/#{preference_id}", request_options: request_options) + end + + def create(preference_data, request_options: nil) + raise TypeError, 'Param preference_data must be a Hash' unless preference_data.is_a?(Hash) + + _post(uri: '/checkout/preferences', data: preference_data, request_options: request_options) + end + + def update(preference_id, preference_data, request_options: nil) + raise TypeError, 'Param preference_data must be a Hash' unless preference_data.is_a?(Hash) + + _put(uri: "/checkout/preferences/#{preference_id}", data: preference_data, request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/refund.rb b/lib/mercadopago/resources/refund.rb new file mode 100644 index 0000000..fb6c1ee --- /dev/null +++ b/lib/mercadopago/resources/refund.rb @@ -0,0 +1,24 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # This class will allow you to refund payments created through the Payments class. + # You can refund a payment within 180 days after it was approved. + + # You must have sufficient funds in your account in order to successfully refund the payment amount. Otherwise, you will get a 400 Bad Request error. + + # [Click here for more infos](https://www.mercadopago.com.br/developers/en/guides/manage-account/account/cancellations-and-refunds#bookmark_refunds) + + class Refund < MPBase + def list(payment_id, request_options: nil) + _get(uri: "/v1/payments/#{payment_id}/refunds", request_options: request_options) + end + + def create(payment_id, refund_data: nil, request_options: nil) + raise TypeError, 'Param refund_data must be a Hash' unless refund_data.nil? || refund_data.is_a?(Hash) + + _post(uri: "/v1/payments/#{payment_id}/refunds", data: refund_data, request_options: request_options) + end + end +end diff --git a/lib/mercadopago/resources/user.rb b/lib/mercadopago/resources/user.rb new file mode 100644 index 0000000..a7150c8 --- /dev/null +++ b/lib/mercadopago/resources/user.rb @@ -0,0 +1,13 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + ### + # Access to Users + + class User < MPBase + def get(request_options: nil) + _get(uri: '/users/me', request_options: request_options) + end + end +end diff --git a/lib/mercadopago/sdk.rb b/lib/mercadopago/sdk.rb new file mode 100644 index 0000000..08a0b8d --- /dev/null +++ b/lib/mercadopago/sdk.rb @@ -0,0 +1,85 @@ +# typed: true +# frozen_string_literal: true + +module Mercadopago + class SDK + attr_reader :access_token, :http_client + + def initialize(access_token, http_client: nil, request_options: nil) + self.access_token = access_token + self.http_client = http_client.nil? ? HttpClient.new : http_client + self.request_options = request_options.nil? ? RequestOptions.new(access_token: access_token) : request_options + end + + def advanced_payment + AdvancedPayment.new(request_options, http_client) + end + + def card + Card.new(request_options, http_client) + end + + def card_token + CardToken.new(request_options, http_client) + end + + def customer + Customer.new(request_options, http_client) + end + + def disbursement_refund + DisbursementRefund.new(request_options, http_client) + end + + def user + User.new(request_options, http_client) + end + + def identification_type + IdentificationType.new(request_options, http_client) + end + + def merchant_order + MerchantOrder.new(request_options, http_client) + end + + def payment + Payment.new(request_options, http_client) + end + + def payment_methods + PaymentMethods.new(request_options, http_client) + end + + def preference + Preference.new(request_options, http_client) + end + + def refund + Refund.new(request_options, http_client) + end + + def access_token=(value) + raise TypeError, 'Param access_token must be a String' unless value.is_a?(String) + + @access_token = value + end + + def http_client=(value) + raise TypeError, 'Param http_client must be a implementation of HttpClient' unless value.is_a?(HttpClient) + + @http_client = value + end + + def request_options=(value) + raise TypeError, 'Param request_options must be a RequestOptions object' unless value.is_a?(RequestOptions) + + @request_options = value + end + + def request_options + @request_options.access_token = @access_token if @request_options.access_token.nil? + @request_options + end + end +end diff --git a/lib/ssl_options_patch.rb b/lib/ssl_options_patch.rb deleted file mode 100644 index 78a8ef4..0000000 --- a/lib/ssl_options_patch.rb +++ /dev/null @@ -1,15 +0,0 @@ -# This is a workaround for issue #9450 in Ruby core -# https://bugs.ruby-lang.org/issues/9450 -# -# Add an :ssl_options accessor to Net::HTTP, which controls the options -# attribute on the resulting SSLContext. This allows the user to customize -# behavior of SSL connections, like disabling specific protocol versions. - -require 'net/http' - -(Net::HTTP::SSL_IVNAMES << :@ssl_options).uniq! -(Net::HTTP::SSL_ATTRIBUTES << :options).uniq! - -Net::HTTP.class_eval do - attr_accessor :ssl_options -end diff --git a/lib/version.rb b/lib/version.rb deleted file mode 100644 index 02a7edf..0000000 --- a/lib/version.rb +++ /dev/null @@ -1,2 +0,0 @@ -MERCADO_PAGO_VERSION = '1.3.0' unless defined?(MERCADO_PAGO_VERSION) -PRODUCT_ID = 'bc32a7vtrpp001u8nhjg' diff --git a/mercadopago.gemspec b/mercadopago.gemspec index 93afb45..88a005c 100644 --- a/mercadopago.gemspec +++ b/mercadopago.gemspec @@ -1,18 +1,18 @@ -# -*- encoding: utf-8 -*- -require File.dirname(__FILE__) + '/lib/version' +# frozen_string_literal: true Gem::Specification.new do |gem| - gem.name = 'mercadopago-sdk' - gem.version = MERCADO_PAGO_VERSION - gem.authors = %w(maticompiano) - gem.email = %w(matias.compiano@mercadolibre.com) - gem.description = %q{MercadoPago Ruby SDK} - gem.summary = %q{MercadoPago Ruby SDK} - gem.homepage = 'http://github.com/mercadopago/sdk-ruby' + gem.name = 'mercadopago-sdk' + gem.version = '2.0.0' + gem.required_ruby_version = '>= 2.3.0' + gem.author = 'Mercado Pago' + gem.description = 'Mercado Pago Ruby SDK' + gem.summary = 'Mercado Pago Ruby SDK' + gem.homepage = 'http://github.com/mercadopago/sdk-ruby' + gem.license = 'MIT' - gem.files = `git ls-files`.split($/) + gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR) gem.test_files = gem.files.grep(%r{^(tests)/}) - gem.require_paths = %w(lib) + gem.require_paths = ['lib'] gem.add_dependency 'json' diff --git a/tests/test_card.rb b/tests/test_card.rb new file mode 100644 index 0000000..ded4dc6 --- /dev/null +++ b/tests/test_card.rb @@ -0,0 +1,79 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class TestCard < Minitest::Test + def test_all + sdk = Mercadopago::SDK.new('TEST-783169576377080-082620-395ee7f82e0d55b1db606c118686c1db-464842924') + + customer_object = { + email: 'test_payer_999944@testuser.com', + first_name: 'Rafa', + last_name: 'Williner', + phone: { + area_code: '03492', + number: '432334' + }, + identification: { + type: 'DNI', + number: '29804555' + }, + address: { + zip_code: '2300', + street_name: 'some street' + }, + description: 'customer description' + } + + customer_saved = sdk.customer.create(customer_object) + assert_equal 201, customer_saved[:status] + customer_id = customer_saved[:response]['id'] + sleep(1) + + card_token_object = { + card_number: '4235647728025682', + expiration_year: 2025, + expiration_month: 11, + security_code: '123', + cardholder: { + name: 'APRO' + } + } + + begin + card_token = sdk.card_token.create(card_token_object) + + card_object = { + token: card_token[:response]['id'] + } + + card_saved = sdk.card.create(customer_id, card_object) + assert !card_saved.nil? + assert !card_saved[:response].nil? + assert !card_saved[:response]['id'].nil? + sleep(1) + + cards = sdk.card.list(customer_id) + assert !cards.nil? + assert !cards[:response].nil? + assert !cards[:response].empty? + sleep(1) + + card_get = sdk.card.get(customer_id, card_saved[:response]['id']) + assert_equal 200, card_get[:status] + sleep(1) + + card_deleted = sdk.card.delete(customer_id, card_saved[:response]['id']) + assert_equal 200, card_deleted[:status] + sleep(1) + ensure + if customer_saved.key?(:response) && customer_saved[:response].key?('id') + customer_deleted = sdk.customer.delete(customer_saved[:response]['id']) + assert_equal 200, customer_deleted[:status] + end + end + end +end diff --git a/tests/test_card_token.rb b/tests/test_card_token.rb new file mode 100644 index 0000000..940c3da --- /dev/null +++ b/tests/test_card_token.rb @@ -0,0 +1,39 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class CardToken < Minitest::Test + def test_method_get_id + sdk = Mercadopago::SDK.new(access_token = 'APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + card_token_object = { + card_number: '4235647728025682', + expiration_year: 2025, + expiration_month: 11, + security_code: '123', + cardholder: { + name: 'APRO' + } + } + result_card_token = sdk.card_token.create(card_token_object) + result = sdk.card_token.get(result_card_token[:response]['id']) + assert_equal 200, result[:status] + end + + def test_method_post + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + card_token_object = { + card_number: '4235647728025682', + expiration_year: 2025, + expiration_month: 11, + security_code: '123', + cardholder: { + name: 'APRO' + } + } + result = sdk.card_token.create(card_token_object) + assert_equal 201, result[:status] + end +end diff --git a/tests/test_customer.rb b/tests/test_customer.rb new file mode 100644 index 0000000..6560a3a --- /dev/null +++ b/tests/test_customer.rb @@ -0,0 +1,54 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class TestCustomer < Minitest::Test + def test_all + sdk = Mercadopago::SDK.new('TEST-783169576377080-082620-395ee7f82e0d55b1db606c118686c1db-464842924') + + customer_object = { + email: 'test_payer_999922@testuser.com', + first_name: 'Rafa', + last_name: 'Williner', + phone: { + area_code: '03492', + number: '432334' + }, + identification: { + type: 'DNI', + number: '29804555' + }, + address: { + zip_code: '2300', + street_name: 'some street' + }, + description: 'customer description' + } + + begin + customer_saved = sdk.customer.create(customer_object) + assert_equal 201, customer_saved[:status] + sleep(1) + + customers = sdk.customer.search(filters: { email: 'test_payer_999922@testuser.com' }) + assert_equal 200, customers[:status] + sleep(1) + + customer_update = sdk.customer.update(customer_saved[:response]['id'], { last_name: 'Payer' }) + assert_equal 200, customer_update[:status] + sleep(1) + + customer_updated = sdk.customer.get(customer_saved[:response]['id']) + assert_equal 'Payer', customer_updated[:response]['last_name'] + sleep(1) + ensure + if customer_saved.key?(:response) && customer_saved[:response].key?('id') + customer_deleted = sdk.customer.delete(customer_saved[:response]['id']) + assert_equal 200, customer_deleted[:status] + end + end + end +end diff --git a/tests/test_identification_type.rb b/tests/test_identification_type.rb new file mode 100644 index 0000000..f1f5b3a --- /dev/null +++ b/tests/test_identification_type.rb @@ -0,0 +1,16 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class TestIdentificationType < Minitest::Test + def test_method_get + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + sdk.request_options = Mercadopago::RequestOptions.new(corporation_id: 'abc') + result = sdk.identification_type.get + + assert_equal 200, result[:status] + end +end diff --git a/tests/test_merchant_order.rb b/tests/test_merchant_order.rb new file mode 100644 index 0000000..e9f203f --- /dev/null +++ b/tests/test_merchant_order.rb @@ -0,0 +1,94 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class TestMerchantOrden < Minitest::Test + def test_method_search + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + result = sdk.merchant_order.search(filters: { id: 123_187_219_6 }) + assert_equal 200, result[:status] + end + + def test_method_post + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + data = { + items: [ + { + title: 'Dummy Item', + description: 'Multicolor Item', + quantity: 1, + currency_id: '', + unit_price: 10.0 + } + ] + } + result_prefence = sdk.preference.create(data) + merchant_orden_object = { + preference_id: result_prefence[:response]['id'], + site_id: 'MLB', + notification_url: 'https://seller/notification', + additional_info: 'Aditional info', + external_reference: 1, + marketplace: 'NONE', + items: [{ + description: 'Test Update Success', + id: '5678', + picture_url: 'http://product1.image.png', + quantity: 1, + title: 'Item 1', + currency_id: 'BRL', + unit_price: 20.5 + }] + } + result_merchant_order = sdk.merchant_order.create(merchant_orden_object) + assert_equal 201, result_merchant_order[:status] + end + + def test_method_get_id + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + result = sdk.merchant_order.get('2112122225') + assert_equal 200, result[:status] + end + + def test_method_put + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + data = { + items: [ + { + title: 'Dummy Item', + description: 'Multicolor Item', + quantity: 1, + currency_id: '', + unit_price: 10.0 + } + ] + } + result_prefence = sdk.preference.create(data) + merchant_orden_object = { + preference_id: result_prefence[:response]['id'], + site_id: 'MLB', + notification_url: 'https://seller/notification', + additional_info: 'Aditional info', + external_reference: 1, + marketplace: 'NONE', + items: [ + { + description: 'Test Update Success', + id: '5678', + picture_url: 'http://product1.image.png', + quantity: 1, + title: 'Item 1', + currency_id: 'BRL', + unit_price: 20.5 + } + ] + } + result_merchant_order = sdk.merchant_order.create(merchant_orden_object) + merchant_order_update = { additional_info: 'Info 3' } + result = sdk.merchant_order.update(result_merchant_order[:response]['id'], merchant_order_update) + assert_equal 200, result[:status] + end +end diff --git a/tests/test_payment.rb b/tests/test_payment.rb new file mode 100644 index 0000000..730bd92 --- /dev/null +++ b/tests/test_payment.rb @@ -0,0 +1,102 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class TestPayment < Minitest::Test + def test_method_search + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + result = sdk.payment.search(filters: { id: 1_231_872_196 }) + + assert_equal 200, result[:status] + end + + def test_method_get_id + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + result = sdk.payment.get(1_231_872_196) + + assert_equal 200, result[:status] + end + + def test_method_post + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + card_token_object = { + card_number: '4235647728025682', + expiration_year: 2025, + expiration_month: 11, + security_code: '123', + cardholder: { + name: 'APRO' + } + } + result_card_token = sdk.card_token.create(card_token_object) + + payment_object = { + token: result_card_token[:response]['id'], + installments: 1, + transaction_amount: 58.80, + description: 'Point Mini a maquininha que dá o dinheiro de suas vendas na hora', + payment_method_id: 'visa', + payer: { + email: 'test_user_123456@testuser.com', + identification: { + number: '19119119100', + type: 'CPF' + } + }, + notification_url: 'https://www.suaurl.com/notificacoes/', + binary_mode: false, + external_reference: 'MP0001', + statement_descriptor: 'MercadoPago', + additional_info: { + items: [ + { + id: 'PR0001', + title: 'Point Mini', + description: 'Producto Point para cobros con tarjetas mediante bluetooth', + picture_url: 'https://http2.mlstatic.com/resources/frontend/statics/growth-sellers-landings/device-mlb-point-i_medium@2x.png', + category_id: 'electronics', + quantity: 1, + unit_price: 58.80 + } + ], + payer: { + first_name: 'Nome', + last_name: 'Sobrenome', + address: { + zip_code: '06233-200', + street_name: 'Av das Nacoes Unidas', + street_number: 3003 + }, + registration_date: '2019-01-01T12:01:01.000-03:00', + phone: { + area_code: '011', + number: '987654321' + } + }, + shipments: { + receiver_address: { + street_name: 'Av das Nacoes Unidas', + street_number: 3003, + zip_code: '06233200', + city_name: 'Buzios', + state_name: 'Rio de Janeiro' + } + } + } + } + result = sdk.payment.create(payment_object) + assert_equal 201, result[:status] + end + + def test_method_put + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + data = { + status: 'approved' + } + result = sdk.payment.update(1_231_910_402, data) + assert_equal 403, result[:status] + end +end diff --git a/tests/test_payment_methods.rb b/tests/test_payment_methods.rb new file mode 100644 index 0000000..b73a936 --- /dev/null +++ b/tests/test_payment_methods.rb @@ -0,0 +1,14 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class TestPaymentMethods < Minitest::Test + def test_method_get + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + result = sdk.payment_methods.get + assert_equal 200, result[:status] + end +end diff --git a/tests/test_preference.rb b/tests/test_preference.rb new file mode 100644 index 0000000..6c945da --- /dev/null +++ b/tests/test_preference.rb @@ -0,0 +1,49 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' + +require 'minitest/autorun' + +class TestPreference < Minitest::Test + def test_method_get_id + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + result = sdk.preference.get('537031659-d710347b-7746-4025-b72b-e5be918b91ca') + + assert_equal 200, result[:status] + end + + def test_method_post + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + data = { + items: [ + { + title: 'Dummy Item', + description: 'Multicolor Item', + quantity: 1, + currency_id: '', + unit_price: 10.0 + } + ] + } + result = sdk.preference.create(data) + assert_equal 201, result[:status] + end + + def test_method_put + sdk = Mercadopago::SDK.new('TEST-6130770563612470-121314-d27bbd7363e64c3853f058251cf8fc6e-537031659') + data = { + items: [ + { + title: 'Camiseta Barcelona', + description: 'Camiseta Oficial Barcelona', + quantity: 1, + currency_id: '', + unit_price: 10.0 + } + ] + } + result = sdk.preference.update('537031659-e4a79653-8638-490c-a4e5-c39f6f8d9874', data) + assert_equal 200, result[:status] + end +end diff --git a/tests/test_refund.rb b/tests/test_refund.rb new file mode 100644 index 0000000..d9f8283 --- /dev/null +++ b/tests/test_refund.rb @@ -0,0 +1,88 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' +require 'minitest/autorun' + +## +# TestRefund +class TestRefund < Minitest::Test + def test_method_list + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + result = sdk.refund.list(12_678_120_979) + assert_equal 200, result[:status] + end + + def test_method_post + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + card_token_object = { + card_number: '4235647728025682', + expiration_year: 2025, + expiration_month: 11, + security_code: '123', + cardholder: { + name: 'APRO' + } + } + result_card_token = sdk.card_token.create(card_token_object) + + payment_object = { + token: result_card_token[:response]['id'], + installments: 1, + transaction_amount: 58.80, + description: 'Point Mini a maquininha que dá o dinheiro de suas vendas na hora', + payment_method_id: 'visa', + payer: { + email: 'test_user_123456@testuser.com', + identification: { + number: '19119119100', + type: 'CPF' + } + }, + notification_url: 'https://www.suaurl.com/notificacoes/', + binary_mode: false, + external_reference: 'MP0001', + statement_descriptor: 'MercadoPago', + additional_info: { + items: [ + { + id: 'PR0001', + title: 'Point Mini', + description: 'Producto Point para cobros con tarjetas mediante bluetooth', + picture_url: 'https://http2.mlstatic.com/resources/frontend/statics/growth-sellers-landings/device-mlb-point-i_medium@2x.png', + category_id: 'electronics', + quantity: 1, + unit_price: 58.80 + } + ], + payer: { + first_name: 'Nome', + last_name: 'Sobrenome', + address: { + zip_code: '06233-200', + street_name: 'Av das Nacoes Unidas', + street_number: 3003 + }, + registration_date: '2019-01-01T12:01:01.000-03:00', + phone: { + area_code: '011', + number: '987654321' + } + }, + shipments: { + receiver_address: { + street_name: 'Av das Nacoes Unidas', + street_number: 3003, + zip_code: '06233200', + city_name: 'Buzios', + state_name: 'Rio de Janeiro' + } + } + } + } + result_payment = sdk.payment.create(payment_object) + result = sdk.refund.create(result_payment[:response]['id']) + assert_equal 201, result[:status] + assert_equal 'approved', result[:response]['status'] + end +end diff --git a/tests/test_user.rb b/tests/test_user.rb new file mode 100644 index 0000000..d1e188c --- /dev/null +++ b/tests/test_user.rb @@ -0,0 +1,17 @@ +# typed: true +# frozen_string_literal: true + +require_relative '../lib/mercadopago' +require 'minitest/autorun' + +## +# Test User +class TestUser < Minitest::Test + def test_method_get + sdk = Mercadopago::SDK.new('APP_USR-558881221729581-091712-44fdc612e60e3e638775d8b4003edd51-471763966') + sdk.request_options = Mercadopago::RequestOptions.new(corporation_id: 'abc') + result = sdk.user.get(request_options: Mercadopago::RequestOptions.new(connection_timeout: 100.0)) + + assert_equal 200, result[:status] + end +end diff --git a/tests/tests.rb b/tests/tests.rb index c757c81..72dc9cc 100644 --- a/tests/tests.rb +++ b/tests/tests.rb @@ -1,56 +1,12 @@ -$LOAD_PATH << '../lib' - -require 'test/unit' -require 'mercadopago' -require 'logger' - -class MercadoPagoTest < Test::Unit::TestCase - def setup - @mp = MercadoPago.new("CLIENT_ID", "CLIENT_SECRET") - end - - # Call preference added through button flow - def test_long_live_access_token - @mp = MercadoPago.new("LONG_LIVE_ACCESS_TOKEN") - - assert_equal(@mp.get_access_token(), "LONG_LIVE_ACCESS_TOKEN") - end - - # Call preference added through button flow - def test_get_preference - preferenceData = {"items" => ["title"=>"testCreate", "quantity"=>1, "unit_price"=>10.2, "currency_id"=>"ARS"]} - - preference = @mp.create_preference(preferenceData) - - preference = @mp.get_preference(preference['response']['id']); - - assert_equal("#{preference['status']}","200") - end - - # Create a new preference and verify that data result are ok - def test_create_preference - preference_data = {"items" => ["title"=>"testCreate", "quantity"=>1, "unit_price"=>10.2, "currency_id"=>"ARS"]} - - preference = @mp.create_preference(preference_data) - assert_equal "201", "#{preference['status']}" - assert_equal "testCreate", "#{preference['response']["items"][0]["title"]}" - end - - # We create a new preference, we modify this one and then we verify that data are ok. - def test_update_preference - preference_data = {"items" => ["title"=>"testUpdate", "quantity"=>1, "unit_price"=>10.2, "currency_id"=>"ARS"]} - preference_created = @mp.create_preference(preference_data) - preference_to_update = @mp.get_preference("#{preference_created['response']['id']}") - - preference_data_to_update = {"items" => ["title"=>"testUpdated", "quantity"=>1, "unit_price"=>2]} - preference_update = @mp.update_preference("#{preference_created['response']['id']}", preference_data_to_update) - assert_equal "200", "#{preference_update['status']}" - - preference_to_update = @mp.get_preference("#{preference_created['response']['id']}") - - assert_equal "testUpdated", "#{preference_to_update['response']["items"][0]["title"]}" - assert_equal "2", "#{preference_to_update['response']["items"][0]["unit_price"]}" - assert_equal "1", "#{preference_to_update['response']["items"][0]["quantity"]}" - assert_equal "ARS", "#{preference_to_update['response']["items"][0]["currency_id"]}" - end -end +# typed: true +# frozen_string_literal: true + +require_relative './test_card_token' +require_relative './test_card' +require_relative './test_identification_type' +require_relative './test_merchant_order' +require_relative './test_payment_methods' +require_relative './test_payment' +require_relative './test_preference' +require_relative './test_refund' +require_relative './test_user' diff --git a/travis_Gemfile b/travis_Gemfile deleted file mode 100644 index 5201c14..0000000 --- a/travis_Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source 'https://rubygems.org' - -gem 'rake' -gem 'test-unit' \ No newline at end of file