From b015cf33348e0af90596ccb81fe808fc4c113c02 Mon Sep 17 00:00:00 2001 From: Alberto Fanjul Date: Wed, 24 Mar 2021 10:33:04 +0100 Subject: [PATCH] Ryujinx game provider addon --- plugin.program.ryujinx/LICENSE | 692 ++++++++++++++++++ plugin.program.ryujinx/README.md | 7 + plugin.program.ryujinx/Ryujinx.png | Bin 0 -> 53785 bytes plugin.program.ryujinx/addon.xml | 38 + plugin.program.ryujinx/main.py | 160 ++++ .../resource.language.en_gb/strings.po | 19 + .../resource.language.es_es/strings.po | 19 + plugin.program.ryujinx/resources/settings.xml | 32 + 8 files changed, 967 insertions(+) create mode 100644 plugin.program.ryujinx/LICENSE create mode 100644 plugin.program.ryujinx/README.md create mode 100644 plugin.program.ryujinx/Ryujinx.png create mode 100644 plugin.program.ryujinx/addon.xml create mode 100644 plugin.program.ryujinx/main.py create mode 100644 plugin.program.ryujinx/resources/language/resource.language.en_gb/strings.po create mode 100644 plugin.program.ryujinx/resources/language/resource.language.es_es/strings.po create mode 100644 plugin.program.ryujinx/resources/settings.xml diff --git a/plugin.program.ryujinx/LICENSE b/plugin.program.ryujinx/LICENSE new file mode 100644 index 0000000000..7748140c4a --- /dev/null +++ b/plugin.program.ryujinx/LICENSE @@ -0,0 +1,692 @@ +Copyright (c) 2021 Alberto Fanjul + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see + + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/plugin.program.ryujinx/README.md b/plugin.program.ryujinx/README.md new file mode 100644 index 0000000000..1a56e1e893 --- /dev/null +++ b/plugin.program.ryujinx/README.md @@ -0,0 +1,7 @@ +# Kodi game add-on for Ryujinx + +It allows you to launch your Ryujinx games from kodi. + +An installable .zip can be downloaded from "[Releases](https://github.com/albfan/com.ryujinx.source/releases)" tab. + +License: [GPL v.3](http://www.gnu.org/copyleft/gpl.html) diff --git a/plugin.program.ryujinx/Ryujinx.png b/plugin.program.ryujinx/Ryujinx.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc7b0174c4c6b7a56c985b62d7c2a4f3924e938 GIT binary patch literal 53785 zcmY(qby!s4_6E9V7`huIr8`x+J0zqVNrP6TnE^pkP`W`-KtNJSfdNTrk(3xfN@|dX zVdf5=bMEh6{u!Q!J!`Lc*Sq5Th%++KA|<*-1ONc3j<)&(003iu1#=PLVLu*eq|ReM z@SOCt)Ult~p9{4%C;-3!9d#Ac!1>+lpwB{cLF2^e4i?I6_vWKdEv9A_0y-al*fw${ z2c~s7+Vok%#N7h*llQ}qgBQs?a@+#thaD3m`b*l_4us9mo*?OWw5qymUBm)&Wy@mNd(l9V9VEvzaG<6=1QHs^&r>$FX*GDiwc$XvkCH z3eMVkr@W5YPzF^2n=n0ikmE>a)1Sf`9QueM^Z_o${=98J(+>AidCXgI30;4L0f#d) zfVsUA@!(>u@WbBD75HG0jk z!Ir{i#Lhi@0e?#TVc%XEv$G`9XN zzI3?Dt!$|*3(~*Vmflg{uLT0L`8dkZnrDC6P+<$kd$4WE_ub>}mZWoxd$p0UyY5Gs zZ)0bF;Zl&exr1m`2$Svb)bgX@)*9bay4WxeUEG;Ws#3BCzVqM>&piMjylU;HU2@kS5_ZThi1qv2q4y zYBG9FXFbvh%OYdlX7vFp%P%N?8msRsO0-0OFb9IslpILnTgyk>2z;MNjD4rAho^$j zyZoq5CX<&5Z!Np>V-(#b0e|rfK0L&c(zzn*j%Udn0l%PF(B8cAg7L?*?z>7I4L%`; z`YB$S5$!}!W8RL)ff`;4jtM`N5igogt|mYa+oVk18!P09&<<^r#r-jkxy}@Ya`Luw( zlJcT58(#d`=1NmCD8<-W_Avk^ua)!2sy(mP@~*<1admW+iyzLRzVvgWR*nS#yg*K5 zn-Ar+=$bwT3Ix7cZ&l0yy&L=tE4}61S{agY7f)II%d$hLbjl^pQi7-yKPWECwT0@G zdGEk3GUhf`20sv~w|(^jaW-y>yvlFRhH9F)dd<=FP8#_1MseuZ2_l9Ys>Ff&;YuRs z$?X@=RW{#C6;V0&9THIiR4%2A?FxCB9!RYD?^h^9YLdK$txw}B##pBt<3c&A5&DU{ ztCMMn28W^;b2u^J>FO2{HNMf$%qz~Fk=*M&S9Xn8&$a@!bi-s#76HGdK~TnXN%+Cp zLE+g!^q{(2vJyYQORP3&xqS!oB014D5%lJJq)Swak_mY*s81L)$l^0CGvW>%3qosg zp;lZ3frrz9tQMN5{XVWC0gq%4qSxn__41gzFJfN;snMl3h>2xiZM$amS;|O*^*na3 zk;HsEy=ap8NTf_~D}>_Q8J>&?#V}UaJ51bq?Q*JgL0|xiO@~FfTR8)LNe6GHQ`2Cs zt}Wgxyj`2i8(abaqro{;7@6tYfQc`CYsjoj*YMS1)Q=*nQ?q7rG31sW4Nj4!vMLJt zJa!lJo0r?s%4&%Lmb!Z6?Y;S)AGrM;BNx#L`dU!x^pFA-H>sC(UDiQtauauFVTRYO zXc@9#eJpBz<&`#srG%nS+Iw@E4Xw2rX%S&?C5Zjz@{sl?=S7;yoJ>2Ru`#YK4RhN#Ht17j07p)n{CM06CZqVlU}$OEnbv@Lj#AdnPu313#yw z3eHQzX!c?6A$cqYf9Dih6frtUHlSwmbD`=mZ>NhmTI`?Hg`Tni2|q#dT4BsOgxbtf zy!>O(oUzUkUpyx}NO(FIYK%x_%L3nSLPA0i59S&V+JezA1m?)J&&cFC7Ggw{I;v@5 zwe7@kUSAdzmHSHy910?E{!L=8aBi+Kz$WAGikvnKscGxNAG>;s1H5sm+ed|+`y#Y3 z@J#F37wHwuJXuq|boi?2=x=aVq&hU(np}Fy`a$XIf|+$fLtVJvvy^aZ-jPkwlP8-s zZ9@z&%F#_sEAC!k zS2Z3aeJh0Uz;zI_JF1x6j8|pKAyGCCz-!=l)&CyCwNaOu-5K(HeAa!%e{42^541=98;YvRE6 zWvsS1(69CYY(OP@HYp-n;(C11BzpJ_+cKQ*!7-%GS4PS5bwW|g-V1cn;;(6N#`&?n zkK1<9x2NB}6?Y?53o8}h4n>#oV^e7@MUe#8 zk@TDr!P5Nd##N=aKjG(j&Alkc+P22a58^E>Q54kMIV$XW$Om*1pWE9eEOVi#8wjxA zvLj))Uab27oRn}O z4ruj0KD#iq^OIURkcowN;G7#HKzU5;gxF^xXGRM|(u;PS4@lsHxA{TtF|No9(aRSh z?N_w(f^aC#S5o)OF&(Lsp8cq&J>w7vk33d`-*3}k)!S$y852bef8|0A7}*vP0JdN} zyDoFkaiZ(epjiO6t#6FyO~ocCGuaiD>@)16yILS@!SjU68i2GPL*q0E6o3bKaCz*z z<2d+1b`y3aaI2Gx{sg>dyY>{eUplD*2{wteyOrt)6#CM8pO1XLk(l`&!pt^*8G<;; ze^>~;>T9#WMYQ>LEGYUMyh~Ddnj`dFNd=2V)8P30)zO6;OI{PnRA*x(E>XXBH9&#F zNPEQNJYsgTKe}8Sln#RYj-NHK=wspHMjZQPgrOVUY!iqMXc1>%(Up0W;^&wH9;$KM zl+qK~i4Bq-Aa99NR~J6v``kHb8vC%NdaQf%^Uh~*VMK^_1T?N)QusvFPKnYT>!dqu zCLx$qDj&-&)}_U7)~RDqo&-K1(-(~%TaiUCb_I%Osyk6WAVP>>LqCZHN$c(RZ7A8?6JGn?9!RM35C`gQ|FNr&<$$7Mwt?_@>R9I&#CdlE z4e*ls)B@&-X!D_iaZjyLvry1zdA4UFg*-`MA`T?Vxma)GH8=yOe(iS}(7%tC{pC2Y zdhLXtJcYBB5U%Q41UPjjwlpP&xEoMm)jG!3wl#O5SwpvFm(kKOrK&N~M2ST(yYxeB z%X9@5^})PLHdw8qjOu7)CBz24{szp>w&!D~SB0*H&^`NO(K3F3aTLW?1wfySR&!A$ z7_IU|eWZuWXWYSKSB#$wQ9r`QHGB?A0>87;c@;cbH0HpQ-1rHIdg3Vv2hLw0MoSp; zdl)$zJ$P4?qSq5awI=S$Wfxg=SbSfpoE;7hQlWXLH$^9t?}=ZlQ17ls^j`2_E;Flm&+q@R9kaQMqTw`>uGCH@0%S z={N(cHq%zRyjV093n|`vjm*UD%m_tKPSd-g>Tm(uKg;ASBYfPWd@+mDA={Q{2H1x7 zXbvGCKPaL0(R8>^=7>})K4lj68#6O>Xc;fJ(_qBD8q3EXD_$2+l%CikF6XEw3H!jAsWljW(L z{V2@aU{-qbVfVZhwZn`4om}tJfJmh@9WNn(ju$0}(27`ENj6_iq>eQBqp${HwyX~H@y*w|I(?4AE5V90Dyg&&u{g(`r=&Ytn_h~(`E6L`@NmZf=mz0P-lqQ#k#0=BaeADn@Dp0=U2ok^wBe{@DzhqJVRRS7a@lrxKlMu^ z@7w+N$0NbQ`cfp(A%T4R<|F6we9MPVzrByFo~Uoz)(%m~-n%ZOJ=jhv`Iu8VDt^yg zfB4DsyvYD{-g{rS4DLB7?Pp^YL(#G_NA&FU+($Yvgh+MUwPUjO6oyJm%NBz<*8MDE zxyk^u{+RtIU5RBl*OgVQl)d7+fWkO!PJz&EyS7h&{x91Q#$VPQ?QMHA4G<_QTrStW zAiAc#u&$WW{rwaXO!~G%jbYAOld>6y9GLT^IrzhFvGBn~=*cr zf+W6^wM4b{gh;iDNTNuAVzXC?G>nYT`MexrR$J%H%lp2(JiV8>>|B7+IlXAh#=J-3 z2T)dl!jxt+=@$#tos!=pH|#8@8DLK$7+|i>6IqdTw~3#!97`Z6kOV%o^m%q-_PTOa zr5>K&fAEpieN^(0r9&Ls44*VT?3~52RmA6_L>1>D|?QO@;XLt6a!Da)A)DR&dczEV^}MVfz^qDT%4gRRLMz zc%?=H)LL5doUw}_!VDQac;P-_cISdFyxN)Sweqn&UMrq0gp~%%^fs`oi1e+ezEjie zwZA0yADj6&RVsgF^1an8wscF8VD~(%_@w9H@lIRa`t4ndUw#yA5a-^$)u{7(--V-d zu~l0ZN#rx4)X8n2GTYZuTe;;uyF}0|;-mMlzq26Bo=owC5&&N0oR%A0vU(MC`z%)`%LS86^|P z=F6&{aJ(67%y^7X{A$eUSvV@l#yG2SL?iC3jAdPEk3qE+8vP6hvR>9hh-QK(z>m;} z#c(~i8w00*257DGNCHXg4~;RF?^+o~xxfBye2EH+?wkWb>E1q;Lrm}8H#qi*hubCW zKjEm;B9l~e=eHVV0Pb+o~I6iH&(y>otU>O)<7*B9F}`lQyG^|_Di z&0Rip-UtmJ_iPpVtg{2JqLy{@MJmOxkBSg3)EMXp^!nGe6UyVuzczss&@niQ1a1MOwiM_x}D^>rc&4iB9Z!^vZgyZx9q8+ihv38CR#tS#}Zo6fQ#RaP> znsDYhT@Lt4ULV1q!U9%=fL!S#3@>ds&N_D|Y6r&aQ~gpD#MZ-4_OgBNG%q=6elz*A zESCWhX7D8O;87AWFznmKlX+S{6xYKl?fBxS-?JA^z-h3M?AnF#*L_F%ERwl1DA7V# za}2eMLTTAzJ}sS$`P}+7NtwDGz)E$_0#Ak4;5hUWV$AX?*B9aRu);1YTvOhCGpxm0 zt4Hn`W6*_NCC?2u0y?1gasEeo<<)ZSc7V=x&aKclPwXkU{bm6B3c7J#oZIb92OUcMG@?CPny_ z23%&+=_jC8}iBRYK(iuNQiKo%GViTgsjw~9k{bJbp zqb#OPy@^e_gZ;x}+U1q|Q_%_toekELFc6k}vF}M!$An78ct$ z%51+v{ffe)8N?KBMbhAiy|fYs@-7*G&V%4q+H6i95mF=H=jmvwgo#E-)aPMjt$jG= z1%f{UV_@sr&A%JA!4`_X*FjP`jQSGD` zujBR~3j)5xYvW&xd{vH>K%uOk({+_J&c|{u)}CDbvNRswmc$G$F3RCq5c*ta;mg&b z-hVEY5ppMi-4_RruwT|uQIr`-#D@hoDf4VC!pmSyt;wfSM>Tf>Prh-n6F}uMHp%gG zFYr|<94mmVt$5P~7b0vg{f0qazm3&-&fb}(K_rPi};{>>|w3ILYn}L&5)dCdgXYprPti?pjv+txbMMWT&X9|H1yZHG2 zm+@g}XU@a4=SDM}+8|h5wf4vR&nSBQF~qM_WUePtQi4IlC3~DYj6fM%_Fs9_U3ei~ zGxd3hrMM7d3ZmU;T&bX2f1R zh&&|`|2%9U#JhT5o)M|gEbtZT;E3NmZT%UIfxBTCYbK*Jw&Gu~zgGg7tF7O0EJ%h zhkoCM8Cb^6W78+uF5hMuF1lzVJi*ZW2>itmt<58E`!?H`H%f9$70gDrk}2O25Mfp} zI8nZ@T{jsjrlrQr{8n>wmooe$8LT8Sz}DM>e>(Ct8#*AVjrEG&0~VMamLZBi2c2D+ znHtvN7RkuY8&aF-2sezest^W}A}t{3v;gv58K>a7Z0M|uABd~9B)*_5_m{{|T96rb zAMzNT{c3bOE~w|Fi_SEx;T6ERbzKAnou}Ty-4-pDYDz#2)1gNyO+wvu@+4gPj-tvM zah`7Bvd0#95yJzyzumbmRAt6_19qXtYsNos04sGzo_+6)?i>>`I=j(PP-tz&^#Pb; zUL1&T00`dX;|14m6n@(&_CZD7*V)?hl_I z@Zhpf&~||xwVfOvRuS=x(dCfo_SbA01J=hX5(XhAC7e9w*O5rWm;Q~E3x-?5L{Q?u zkdO#0Q|4wv+4+IE>R20q_hwJJw=NEHfHf(b;d@}S& za?Fs277yK-N_1U=Ep?T}p43^9JL^?3ysxO`QS(^0ulyj3++il%IjgDrQ2Dn^mwVOy zY9x1dMEkEhBo7d&)DxNTxzPUpvmwwvyzD7qsW9enHL5ha9CX$sZY^v? z`}6llmY>hNADMDVSrtc<7hXRcR}x!q$cdv$k+nHjdxDp?l{8zEod&aebPFVNVlQU7 z6EkXU!CX!hue#p3wq)eL{gRI93q75OtN7tl)YG$QT!*U-bt+E_wH>DudrkLjxB!W; zmD|NL?@-YPU6>Q+&L~qN9-NaQZpUDLgnIFP^7CIsg*X@5A*VG26(YIXKc^U~Z4&UU z@5-dyAmJk!JQ6|-i=yYK=Bkaoy1wPR?XUS~Yyp42=2G-k=kBTX>EG753@Xo=s2QV7 z3Hku~3Yz!4sJW(aCFn)m0c?0D!YU^u&}kWZX~*TZDwE%xuviZVKn!XS~0OY*+KkL&?zV1Bgik?p=*%Zw{9mG}=s^VnNcm zC2wbGXLyx6*a8bNgI`c+*?D84{rCr?_a%endT?p;T#e`|FD75L$988;Oqi* z)BTXGs`NbE`HVVAZ#tb}b&z1KfPj*lnLX1jtviyKSeY{whF0NZ26E4^ef~#AnoURwE!2c zUM7=O-H`>kd;Miv{xW&MS;rLV zNa5%E1w@2M2FPQRuO04`-MQfiZGT{tuR#b@E~^KNU<>IdN6svt%zoEGM1!DfFJ zVmGQmJxXQFmbA@~D)51Zmrz>J9jsSs1)3ryS$X&r@WF&%QAG z%{{K?PNd#l{C%osJ|Ft6Ggvj;iQe!5KxKyoL7uOh4H#}cV}jJ`JjFj}ItV47PBT!F zW)cVOEvtUd&=HDXwFMlAWBI&sSo{4qvO=!8{*wjD#crkCa7*;+ug+xbD}PbGdgMB$ zs;_*7sK8!^==s=%Njo+e_Xc|veQL4;cRi&CcrX?{d;2rd~K{cqi*dI51cr z--$du`)lHTWnRnKBXVC=XW*K=lN`roA_O}i8Y#anQi5FG8@DO1PG}&}AGrEY@ds(| ze&1aJ>3+aVM7nqG$DGG_qs@ON!6WY~oVhAYUA}KDh`IXvQL((IuAT!~0w;4cp6;;% z^|^%qFFqT^lS@Vi2U2*Se~*O@kt2_4g24B@oM=Q*h9}&#HvLhi`0T#Y@*+rCN9wJ2 zE)p5h+&3AZS%LE=D`C75ay|?gm#N;uNjX|v#yA{xHOYfYSO&iKqD*%H>Jga1*#wsX z7#A4>dk4)I)IKWFrGu$A-Q;!4qbswpFQ#5zRp4IPWz;7qxTpIOViosv9PcD*qA_0B zA;oz$>&-H$9~lEkCKi+!Y25QaJUZQW+UE5&EyB%2yDQ%tbd4EF*Ml8qM64|x;jrDi zk^XI60?F#gM3FXZ10vbCNY#F>iq+UM%jexAWKx3i1{g#c?Kvch=~m*d(KLN$0pGrx z(`3_Jwyd=(cJU29P&uA`m0u3i4X-`np(0NG18|*cGXLTYuXZA7e=V$tB8Fx*$schv z^3`U;XzSOOmao~??-`VlbS!BATR~eW@bclTnfS~lxaVJOBrD5?l(@bBm5G& zU}}ll8+4p@+2s)@%!Vp zwj|2BIQsvI^5AZEr>now-@`KuqDA zbzipm;v0QAop$N})@EMN?knaA0db>PqNJkM&%H>HEyR3>|9wl2f}C|8gBf43(nenP z@AB8jKYT;Gn}xb_zXa<(b^7Dj$or}PDJ|^ceNkf$dBzSO#pJ$gLDA6P?<{IeHUza@ z>)xqQ)F(L78=dUKA|JjGNX)|qs8~>BwYov^2HDzJoRl*bUdYY4hsOP#Qt8!FL{fj< z=-nLnDP5>Ey)G<1CR07}BwEG3HZ}i|o-+3FtrUEpZYZtg|FRk)wtqB(IO>-!#3cP) zDa7E*Ki|W1UDB#}(v=M*juQgS#Wg~13>FE}U-{bY8kO+hqVgt7_J~{&GnF4t4n^<= zB6~OU#vJI6E)2(?a20Wg@F0F$gR!ikZXwU(!@2_YS?Q_hjr+hk1(IGX&s^RAt#_xg zW}tE9+X1Gq`Jm7LdzIn7J91Mcr+fJLg30pN$MbPf6c_o|^Qxl@lW9q4zoJMczk{!?a`*#b z5LUpd_96W&XR|W=8Mtx~>-v;Q3w&i-k7(UjS(6RFc;mK%(0G;Hb4kd`0}TEG^jg-8 z)eY^3BvyB&=PpvF2%g${ZyS4~2sLEitU0z`_d8ho`2c?<4q|w;f~bUQaRHv;+A4hT zcJVLDB0xa#oLFh_rKnt$WI(p?NM8hN1cO(U@M{m&H}$xTX56)5y>0IGaGm(YRQ|dihYFtf2#Tw|ePD@R6Gbc7U#&iK5vcAioc~DaZO3DK zM;tWgD*!q?y2>>%{d-4td8HrpkA&27F}AI;;Jmeec%JZCn*PaH#i?9J@$ zHXpo#ZbMflm}Wlyr5(;1gI)%o3SYY%EMr?G=ArQqSS(jt9wtA#!Ex`$DjW*gvF{iD zn`Fvi+tx)@<0HbK>)ksv;h!I2NH&iSNYe{1(xE*iqVj6?D$8V)*sXyTqJ1&I4a(~z zFIV*JAH=KHh(O%f{)4{@?DK>M_J$N--yDk&k6m@k<}k9Rr#8AP4st&nRd}JQAy%P` zE0+O16vQ~Nwx9*RRT;Wf%E~zwAeYai_rHOSyd~=)|MGf^0QZ==g5LN(w){#OSh2vS ztBKj;ZRPQ^lgA{gS4ci+NJ+I*`P@5LsJl@5mcpnaxWaZlZ+NtkS@6C*?XFx;xrV8@ zWQUSxyIr!o5%@)Yv7W04mVKXVfNXKA|5c~5Dl)kA0~;_zBo99|DCCuI(~ct{Uu9Ts zk)hxh47n7Wju+#BGB`l(E+x-whew+W*LGl?5g#dI-fSrJ-aJ-h^*5xY@sxS#HR+B%D!a z_SYC~2!?*M=o|=WzqIoD?z*dORi}1o{r2OuN_q%mrh)@s3}3CV-_Jwf28U{@FH&tE zyrsdiV4{fyzN1Htjdy$#BvEzj0#TqcgNp@lJX(TD`|9Xi+L!?TLkHn=Xo%~cBR8@1^>V-+7`0tL|K z8$KMMC}%PJ$Al)9_>KXgFN!2F4$_ramWr+^S3V#MzpU=Rm^2KFByN3aO|KtNku=v& zA)oolm(xZ?jO4y=T1MUt|4_aaP~>Kj!mgYRe6cV!9{A0q(v$xs3&w+MWNha6l6KC? z{~7E9yw5-4j8Ex|+l%}GB(`*OlK4VaDuMR9P>IB=m5HI>H=<HITuJwWfmCJbEBM zd*9}NmZ;^-82Sc^rq#4c{uNYs-^3_dx~W8d=jye%7}BF|^u+1I_OUis#I?=bgg?&> zF#1(*df~d~{=kNBh7;Iyk+7ra`!&-H1+9QTEx74#M=cH@^NY{leDS zB6F|JUm8lLX>@>LWvTZ$&b!NOFzRerExb?89#CjD+D6OFV2~5zf z9Zd6$(q@i`j{3ptogXs4thzoGZ|Z^%tOzZY18l|c;OE0poAqYZ?qNTNJ4xdqA49n| z`EJ@m;(x*S`w6oA&38sc4R_IpZ+Bhw^s<}R^&zhmF@*c={x9WrVZ%%#xz?a=x23gU zsDEJwOva5WAG0S`01t>mA-w>YWKc5|AeI|aFN7=w#U)hGn zMqJDkjV=p+)ppPOZL)5?_1|QA(xrPcO~DHE)V0XEKZ%=^&)hJIbz>u_BUwK0wCGXyT>+MI4$WFW5gK~mgt7N8Y^m%Zp zn4Iwg`e5Q)*J|oPjnWRA7osAl#lfv2d^lJuRhyahpVisrIAY1Y&R~OZW=r8bjX_iP zCL^=NpW_xo7k&g!y6C4KvyGaY`$!%{e35Lx;ktyr>&lO$+>8vmXR{XEfxRfv?nHSw z`4MaR!@!O zTn&u&pWFHgr|x6j%NC%YH&R0XNpY_xgUk0hf$N8fD<`R`DMC&)NMrBhV}805WF@vW zN_9O^DD%9!mO6^G2_mmMHR3KfB$_%3IlVAsEw?ebnPNo#?N8RLvE~JdgEnVwE7^&I z4hKI2=9FKAp`Fiy7Vge+H8dtoGMRwYX9q$S1TKs4DH_7_UyrdB2#)%CVlM(&;Ri>p zLPMo*-$WDpe<@UUej9&)VP_#8L|!r>Y%mK5`Rk%;lA~o?-N|t0;Ni%7EhUTfq?LPp z)|oP~Cg4BBDvq3@&H1!No_g@5B%2;H*1+34M-_z^Y-vXLh}i$jEZ=*703ivY1}8Aq zWsnHh;w;!NCd;-O>r4OpiWsSIX6=C}1u23jBy-cG@9VXPV8Tmx-&Fd|7&sF?N&}Rh z(XYIiaF*P8Z3T84Yxnm{4(00|x)2bh-?r2pPz3zl@?HvNp?Mh{m+-fO&q+_fcvXqhJ}NT=m1&C(`D?(R4(ijO^x_gt7y0P*P5PedfOKTxZ*?#PhB>*L-&U6jWtP< z7DMHO{U#Es+w%tOFB$gZg8YFW2VA}`|H%|Axy!p*g7f5*#WrVh+*JCsip}DezLL_5 zvb$A;Zh@8|U#X?qmf_fY{tX1j*K1%OvhzDgrG3}Tokh~YQ)}PlQ@U5f*+=c)zZjJ$8T#;o<}3*=XInXU7AhWJ~c{=@V{#-i1#* z?E=Q_0mD8&fC07j$^u8hN zTk~+9DCY|f=6|D@<-ax9DE9OzXxE9bR#R+qdVIu_9`eZcJ4*>w$TgkcI>*~QJCzpj zSKMaZ)F4Wl+CV+-S~A<^U!xVvO%ySX#%Y}YN^-BT&D(u_F7s;VH%E+x zvd(e&Jdo_k9UT7GPmx+r=O#s|LdSGKvpAah+{)84j?aia*8P5k;3f(*w}3LoaNpLw z8c---dM$bOE%4Hn`7vufM6t0+A;p^g7Nvmsn>`l1UZQJ1rjz?H)uH9Xpl54jj}{0< z%Z*LxXpMw4wE|8&FRV*WnT-N{z27(X=t&c>G4rtp?@i>^*tUha7lLH0%H^9A1j8oA z6;1j9<~SS0e^rv7RP5inpJVtVHTzCwwWSe7%r!F$+4xSAaaZhs*|=Op`XkS-W43x6 zRTdaC_7wc{*8Xc^6&2yc#PzU34Evd#8??1y=#%Ko?dLx^*yYns9MlX#m?v&S_ zF6o~rMid^xjyYqbR5^w?@g(LCgPS<&dH6Fy`lU;^K$uPm?ss z`XXi6u4`21zl%bg2mO$$Pq(c$AZ6mU9b`@TTVHJO)~N(69{s?~N5i_8-{@hyVVkG* zY}UExcERq`^R_~CQ1Cb59&;}`(fhj&$=Hz!eSC`|i*`dzG87cF~7P;S3+@{c*Wu3i6`G*Z(Ss6xs-Z`S=BiT%LR?iY*1Fg?!IPH zE+bfOHCH}nFDI=Cc&VtIT0i?@f;f_#ltM_Adt=#>@(WKnB=W9mDKaBhG{u-@E0Xwx zFiG3{rf2$3(~4aXGDq=KJ^{ZIfguDi3cId**Frq<0_vv-?<9lVSIQj=W?au%FM>C` zHOhO8bau&Nf1lr3IVhlyToSGbsL;En*65LA$y-;ARO<2Wcd;CXl06Lejb-b@Hc7c& z?NPyc@PhR}>Ma{;y#Mm#rmwm=I4M_8eaOkkL5?FBX-o5aHBvC>g@+mOntL~xJG|AK z_G90ARs$fN0GsZ+ERBabd{?;T>S$(q0BJ`|!zdp+F@%~ILcT$iOD`*ouT{0lJsQ^= zE#kTy1CK`N2Wvx;Yf}v(K{qSC|1`s0U@YNYOWY+PgUtX^*URY0r&r5=(nZ9?r{`G^ zozA#-akXF32^!4CST&2HN>=p`%~dy9<1$i%_nAu1$_wbH+9X`fDChxcRska^GOAuz zy4gR^G%Hz3?zu4BbEYjII;L3)ymDQpeN3JK(5e>^UBt&2{(ljVctjwBJ_E*Zyqyl0 zPcRZ4IYAPigRx)`~9#es~D3)o@5nv1&EnVuFp=8d|=cHM%(7u~3|OnvxCG`Di1Uh(Df2-omT#A`{vM>v;P%1VoCcfx4$P0ScluJ-a>tS-1QnY7P43}+v&~skPkKJ9-e(a z^>BDyZ^7E`s5`(mjz9!-)^s>wL#gY`kd+tlyXaWG#i2;_{_T>u5>FwLSGwnhqSYt% zVQzc!WAr;;O{;t)$MRiOUQ&(s=XwwXMWw3eW7-v3H*DEtrWM-$Kh$+rb$`c$QSYR%v6gn(K*8Y8n2`zN3K ze>}kJ4t`yme%6wI!bbO0(s*wz4YsY7Xd)rR*y(%G4MnZay9$s9h)KM%(I~X|YtLdU z?a76^b(IDD{K7WPXyd0PnD*mXSz7)7hF5I$$1lw-Wn$_TqdvfYs6E~R|3NoA-p5(mf8PLKCD-{Aj0gGqLBln>Tc+6(pB@K4QHip zBJ7eM%Chay|5r-uVQs+gG;(&2+qOJZ;m*du4@=&k1oTY-9r|WA^u2GjVUVeCcrS)w6{}u$;KKS%onhrESX;XcT){%Hq66(?Q z1$_{*gr74S)?z6Z>9LIH+Nl{g@t+F%nZoG$jX^PRQ^D3oCT2FiPFDHdYZxr{GE0rS zB=~u6h5~1KH;b>f?Wa5H7Oyo1s>qhZkJ4?dK3a;WHJi2*sYM&b)jkZCZ}DT5>!)(; zL7tCf4undUOuw7qPt*$hr`Ep;dUN3=n()IxZa|Jq6|t7ZhnS-aZ=eQu-$lIZu;#R$ z_m+;M#=9z`G`5R{{<>?{S47kTK)F+*SXy4PeS5A=uRx!9wdF%DtK1*q@hS-&U&v{u zGs4vZ?v;oY4A+1^z_lIuE^`GFo1bnrQtzicoSI^&mDT_#8}E0ST>Dq~a>wS@C7OTI zWea?nO!!FZ4wbJKe=wI{OBkC0HjerK%eEM0g6?O~6A2N={d>qS(t^tEvn2Omh6j&B zC|65RH6&6O4TfP^GkXg>CKNkAW?oXUYt9Zzgs)eJv@ALF&-!_2icVZ6`pp$(lI{{L zklHeyQ9;&msx;SMz5cpPCqqu|?HgYE(%N4aymmi~@>}Ef;Rm#aX3E|Z!hv4oY@c99 zLebCuG%LO8DdS$Cr!57$y_V(t?@{MzuYN-VXdigheBAj4(-|V_V1e44W^J@rGNx1~ z;gpzmXz$BsYHD%6qVsOKCK6nS6@i=kRN^TgJ|YU=`);@J-9oJKR@(~XwGpC%Pa(n+ z!O{VC63lU65zV}E@{);`_AkA&+!}X*5WT@QG#d_PpT4?}2Y7F)M%iZgj`LpJR57|Y&G}73!SM0vF?(MBhXm3H?^EK>L->ux zh(s}%R)e^0_Y2k$3hU|05r0WVq3K62Jx%k8;kZ})PL8~S=U5lIavrq7m7DfE z;2Oq@G*kEyQ<~OIFBB?zZ62a6GVAGCY6YA~lD+LpEX*Wp#3&zX1&7u_-~Mo6kb7F5 zM*B1<@CxsY^q%obiG$ z#9uS8igNVnpp<<`&XnJ8rY&hbSQp_^#PK2iU>uuz$KuVgSyN2$R z?hff@=y&wK@8|da1#{+n_TJ~ZuJv7Oo9%1if#B}xFyu{b-8xnbig?sp;g)nc%e86C zJU%DE1fIkdLB&=2f88mx;@eaMFgHEDMz}Hta+K*A_XKp^pe>MZ?LW?`hx@)Xbz({) zT+d#{Rr)4h^}rO<;;uIk6mW%SwDZ37_}x+44}~e_HQ>ykJVefX!T10QGBq@M*_X&J z4S`$6gyHNaX{<KOi%!ShDcYHPtM#zX@^@7D?>T7yJ_m(>*ahNw z91m2ZsXcEL8Grp9;GF!N2?rz(P16AS$%dwMY`0p==r#gP?hd)jJl^QEZ0l_%%>{{-Q_IVpf}jEK=P^%Qb%Bw5X(49uNfX}7K-V>r8EQ=59J zh;#WW&aQ;oI1JM}pB5wH9{JH%gCgCVqMP?TvR)sLh{HhE3L4mi>gNTsF%=p)3B2d5 zP|CKSv>pd5o`FZr)`o!&C*t3D=amtY>;LC=jlv3q0> z6u5LRB`T%`l6}fZRmy9Yw#VfCrWWoUx8|PNEY|V3aADuazOv>eQcmDG-_lVeQpr;# z-gEXM<7E~o&s2yR`pH1-hlGob)hsOmEzm00{gVyLz21X> zIi6)@PZNVD!=#AWW5i!kEi>Lil&A;tyTVlf1R~ANKJF_u{@f2sMlH8QaQ3;lYQJ%F ziJ%Z_x&r1Qf?&70n>Y`ttc zYL~jn%o<8AXkN352ibp5T-VPsC5ocxjxf}qxFCDTboT#h^>J4)Ic-rVMc`^6Ux@!e zC%=VA&06v8+qIq3sX4R~p|up%zGk@Lo=Dz)p+{Y<|jQ0bndXUQbVOU)rPWvVg@k| zmetVxJPQpX%effb&@Q!nTYg5G)>puaGZGod>ekaXFO?`nmED+J3~nH@6YLkyxOq1B zw2c)O^q&e)>CzcmjhlRF zYzRSZz-g$BcJ{k$^n%PWqv_}z={0@7CJL)x3pky+&_bcG=REyG)+w*01ON6eX86|$ zxcVz5Es5p9Nee3{X-%!HwcuyoCyV8p|XIHpNOmWOwO2|cwZ`0Uc=GgWU|R$d%;DcX!hH~ zZIZO%i9p+v11XGtY{&vcq&z~V`V^)QaWwIn|3$0>1Q5m%zQV27ZFqJdwMkpd{&a>Z z&fjh)tx=#&F>mT4G4Up@A!Y6=qON~#;UWqt&k-TOzsYcdMbHTZCOHDXkc?+-UOxSJ z|FH0a_Cc2JVZzNI(SQWmS8*?_<>Jd@MI1Yu3|7C}L)N)x{|iNpXKKTh(&IKK%p=tr zg5q%y)OGN62TDc!?YlYP=>?cGsm^<$9U);HSv!2WEOV&GWXDyR1uGRIHk@qLp786| z^DA!1+PnUDFa}Xyzf61q8AY0<0k21}`$xEF)nQj^%DkGR4uxz|uRgsCBB*M~o1JLF z2vsN8MPBNj=|+S-G=iZ!E*if)Rv|x^DX0SK(7Z4IcJ!0|tl<^BbcBKv_58nr^^KGZ z_bxV@<7qWQheeRe6oZMCu38S6f5lFUd z!y7hTRV}ehEIC-xgJ1(y z8Xc<0p}|tODf9-Fh_2=@-+cI7cm7u@bRp3_VV^$|JdJY;yaoi7k=g=F8_qE==aJ;; zG?Om}M6Y6=N-BL*lC!W=N0iF7%ZZQR+ubGnQp1;54nXSZg?Yx?ojN+4>}OMz!9svc zl_1f$#d4^rQ-nGsn0&T@2$}0P<$eh zB4<(i7y&~lUj^L0rKJBQa5qdDlp*WLPw@!gD?F#Y>=KQ)OnHQX#245Pd79L_n0~i9 z_lY+CxZ#p!a`JkKdNx}X%de%VyI`)BUzhH$MxQsmVvL!)CwFw&F@SFFxCyyP&S?wD zs^k1_L`Z0HQ|mS9L$Y7kv_BZ7*-}-hT(}}fFg)G4<|%wvVy15z)G2yaqKOav-$o+@ zRy?fV0rv6lgS+?ZhT0gSg4szZPr|^Qx?KM2Hln>}etWg@1$es+4x42uAB=YVTGds; zH&0K{W8ayXZ2DdKGsYZk==>P%!;QR#k9B?MH=qmsOr}2B=Ad+2V5V)jJalRQ)#lwG z7n4P%ckyda6i4ex02+)NJ|5sLRlA*HQah+SOq+vc&*8m9j9r+ashkd};P&KQY;J_}d z_-etXqs7S4IytUohN5Zc8xFJx_{;bGg;ztS z->}{9UxoG%1d=ob)+pT|1O`_z$x@$^I;z?YwPyQ;^RKn^GaOO&P*PJPh5yv&Dy!(N zysH)}94UM|d_NVK@p~Xzu?ICqOI6n*dPQGPja7PgwV2RuZyco6Y7IMAqh~Jaq{^%8 zs(PLbFu0G6So+0potn(Y{d%kOxzcBv4Pj;c$9o!#tp6<_ftaKhbYIeiTstyDb^d#e zuiskvjQ89tjkmkHA`O}9)D^T+^=%AGjhsjb0P1fR<#>XX19|I{W+TVi_D2A-%Fm>l zg~&kCw&n7lyq~9(&Sx<5NIW>M&(e-8cb63 z%$P&$_so%g;B=}7Tt%i${qfS-G-0oEK@)GQSG}T46j1*y1GOMQxAw-lQ02&d-=iuECnn4PEu6#xZWy)r zrilL6=yIT)8?o?t@Vi*QVm-~nr`y?XZs*;BeK#?T|72VAToYO`x0%l^;z(7N3z%r( z>DqW=(t2%!B1d^*_UD>0Q5*_X9k`BIP|}xBVV!Yq&;tv7!5D>~ssScAGog9lFzp@p zl~=T~UhMoBq*rT>TX4GcR^-1eqAUfKzaD`ZHro-SUUgufuiG7%UL(OHYn@szBxrHIVD_)C+rHFJIyg0uPd&F$+oXIB^ zs(}n5Meu1W+IkhqLmSb?=pgO0B!RPN^Zv~0`k zZ#sZYO&i_~&u$eQ#>X|2L&PE-IZ_0-;0}kh}U!S@Mc7OMmQByT9yL;V52nl1oPyt?kyJ|5DJ_Gw8G!N{s0%i{ zEMA-^R!^RKpioz&`G|OsQ4z>qW!av2=wvT0syFu^oRc~84&d;TcrT}%|7(Y*B4#pf z;G2oyL@cK@GwXD@Wru_br2W>)Cr_QA5oohFGS;)fg=mcWBPcddsnJPm zJ8xP>%CbZEXG@b4drIXGMRu^I9_vS>Q=Nit)qA2Zd(QyMQ)OvGI0?yBa!tGvc*OLW z$qCglv?YRTT_&b503z>0Qdu)Iior9AH@A0&DW*ZO;7}%TQ3+D`53)yaO3@ z<^b;o^<~sVbEi8S0D(LjYSIjk+O@f9$6Lb;>~hIF?d1vbZ*Nt!;@)v)Zw4cAvEQO< zmJ_tmMyqikj$z3P{IQcE3S7gV{V4%9GF;EqU#ai2LJ}0eE~Gd^@WZl#Kc=XGv+w(Y zFyqY6hRktkk@6n*GjV($eb0l7{cIgvS#pG{1 zjHDF8H^brc@3G}ck^k<+zW3#D=lC1+uKX)x8~85EV2s-Snj7LD>AqM`f=a?l!amb; zK4v0X*YDoOkkYr++LAE8oRQqQ7^Vg}4O3hdlS&JWC`Qr12}Yh~^x>jm%Cz3yizMjcjtBn`dM^ zwPuqkW~y?gSa?}~X(i1!3=DRM1NGM_QMxYu`~9*RwSf;yi2h{8&#K`sKajcwq<%%% zS5P%~0`nxnjy~;T9{5#=$M|qx0N60tZyf_7@Bo4{kSY` !KxmLvdXU-3ttP#4xn)jws4hpVe8GUNP!>57rK)B_ znf?Vk!W$8_9}qi$8_S#&)tmUA-3DEg%rDMZDEls=cS0`y5Q@6mxjSna`;l0%S#v|1 zErDEgm^Mq(9kD<4%S}D^&2vLJD(GoSwrj%`3Sx0;bq7)ALkl3 zgZ{7q#nOJc`mf7s+&tw!ggGq*5`Q8+nnZe0C)bRZcaxw_ga2DtdyHoYLExH^yCn&O z7?gdxL~}lG5yyKDYoD&i#@Rq!_JmqHnEiAVEi1^j$vsCwy}Y(SzMo;f3DCkZE8C<} zqTQe45g<8dn6xv$6qSN5^1ED8)kMCWbgb>l8lN%><9Cq{~Z4MWPw*K#(I@w{@X-__db|@4Ft#(+sT0? ztyJRH%#*>MYyS8dm0$Hx%^iHaYU}3K?Z`V>B zX$}>;UZPH21@Z%W2dcc=poVP4Pqk5f(U^Mt$bPt1^7yksj1zqPwr_FVk+2ZFN)Z5sf=YW-S8 z{PJi~ifpDT&DLPl7rM~fnok5Pj?^&`4!tGtal2BVZ9fR&T#;*y?k!w)t%&X6EKFMg z9qb04ALTQ#|Mz1X#v7DBe4kVq_I`1xxG8B^76!m3`7-T zm>o$@v~zp<<%4G(&qe(D*K2tca!ak9yphGqfD*Y`AB%a4ws!O4m?t0RHZa%TmG%y;>+qv17>z){TcR8EjnqsGkn! zTq8dgb!or8L5`;R0;i0XwDi=sVpvm+3vmN_{jGvqNrMDv65oF*4Ehp`z^zcr46i~H z*)s%6l8N(eA_Fh7iM3&(<)8IWIrS^30-KHfr@9+j8w4)huXI(^s@|>{k2M0+nKEFk zuteT`a{oh(B(5C|&-DSnO8i^*$_{z#)U7zCG}<%K8xrWA#mo zY>t+K$BEUm$-!dghgZ4j8t8R(=9Y@m<%IAb3xUyH-effK51!O~{(5JdR0+vrc2gLC zV?zIZ(q&q&R^Lmzj(IP^b{K)2=Z5MY6f*nOp4=6*%w z^gh6Ll&5%w(9yAqNm-WL=8IkmJG|A`-5QLH}fMJAUhKw7f&wJst`OEA)6`Jw9JcL^g;{OJP(!V zTj*|`e@bs1`flF1o{#a^MMEQ?8lm1Itd}^+sc(M9!waPK=87H+465aw6chJxLT9__ zik^8(x-ay62hVVGmYNoGo&*T|-_S_3HgO$Zs}>G@twHMr)k77sJ~~1E?~`&FlA9KU z$~fv2O7xeHK~&o9Oq-(*r{00=RRv&oTTDr^$r#aewQla$6yz2ef zOd|p8A;0p`)5_AhBL16-c8h#kLlfMDtRbW@UWi_vFR;?CD`grPzCIlAk+lEJxP4H6 z>=E7$sr(X1Fk#d?3-^{_zW$sb1bETq3BxZ_!IjG;nFPFh| z77sJkvXqlSM4?6?8OEAW`1JAC(GZKD6VWHBh|6gUbDN&hl4Ce7t&{;FRjQb#ZW2Gk z3!Y9$=6|9F_TyxN5aPzKPZ*GJgcOnu>lZ1*eQ>(+fxfBUZbh6yW+S!J?VMMMz=Y}t z5aF>U0{D7^+R#K#?jtW<;tGq8uQlnzDO0yRniLegZ_Z#epp`Sx$sxQMhXom+OyX3} zGbg5MO(v$feYI+2=7htprqCrzsLKrNul0sEFhIh16Y>r<&^`-MkhO}F^e2QROt21? zh&~n>THE}a6Mh)#P#)cIY|=-#Y6`=BG3bn`qk5J4>5ZkC&ZHBbVMykvYD%Qg1zJNP zkx3X9Fk@sekQoR2t&(_Iod_4_nX6h5Z>|sDH&P|Z5~j!gCiJ)rUT%lY*XEiXp~Fv7 z%57UxI#qwzWe#C!ZLj{#>|Al{>_pHv$1qZ5?t5isXMJ^|HhHUPgIpy!qEO9m9pxDE zO>ow{4ZpjW?GM!_NW;mokZ6Y`HLv7Xd0Rd z980+-ZF{LD1;QMCM-<^Oiv@#nXGkk!?1!!Zubmr10|O};#y-=y55=x*hib*WGmLK$ z7ls}`+VnYa86Z>&ZF2>b2fHL2JSKIY@0N?LaJ4(onlocFReH_%d!Ofd{!Btce9Z6K zSRt-W3KY?VAyt$q*U8q0rGNJ?Spuns5}HBMt`~0~8SDA_xs-4u@XXlM(SRo?zy!uP zT8wnQsvOg)lA(^KND^Lwy5n17E)S6wkHvVex^;NM+B3i^C9bHggaCBNigv?SkKa0n zM8f=h2jOd(BAkgZghq=L7W>WRc^F(8Xg9^{vvjC`i)@5VlSM|t53+M>pq~AmLs;J- z&<**5M=>47{LpXWM3AgN6Cay|2u;*cJz-l}8Bc-D>1gmL8$ZQ88I^8an}=25FafM| z?svnP^jpEjI@kE`p`3iocnh78gZ)VI*`hjthIO7bdh7K&YqT*4Rtr4l-XB73M4^^{*|p3U&wfKd;(6uR>!}F+VE^Y_ zPuQayf+7o7>({ThcZ+tYeIYDs>@QElg3wx4yNryhT9+D4N!E@l^)2((WRPp>CtK71leEq=)*Wpi`f_L)n zgF=DEcCF^X8hRKyt&Z`!idnJfgl%>wo(;yRk=*_ZdYdzgonf_hB(I7 zTOQ7(mIT+2dA8x0Zl?i6h=-a7We$f0ThamznYE82>+PFtUjmS_B6avdqfqGafQA5S z7?oUH{yvGip^G7!)<*BP076Kl$jP=182v>`yw&fD;DwV4!||z=7{qwp@H%N!Y4se2 zor=g#phqHlv$X+cJZ zkk^flnsKOr*H&5u{T>i@4HBN2I9tEk*Qicmb|&xMI0dTOY;f?7$guy$dShC3T?Uuj zf|T(Aiq^;}*ZeJh(B@%WWIlE0voVB>9B%q z=V#kjw=7HFraOEe$O-))Ht8Y1A4JkhX{1U92SJzTaSp;Sm%I;J$lu~p`{F!`qMpc? zdq$##`Fs-WvtKZ%8nLR88pSJO$Z3F-1AX|G+J2`Z*Ja=GSp2kl)^N%$;5 z9Uv9;)B6qht*(ZvYc_7hdCMzi1{0d=(3^QxkCn^*BI=g4_GW!@v;)nwQSF`GL1#gA z*w|PEM31mqF9B4UhP%Z8T^WdD=;uY+$2b~gs=p6Agwqc=&;|SmPvPahxO2ybkJ3Ly z={%Dlyzdt{8IE#H6^D7kNB!}7#0scql!Ren63lM9#<~N$WO<4`^Emt7SVgNFeK%Co zkpuJ9XSk}7*TC{L@#3jHi_N5CZby*4ms2x*(}O*TmAJ2IS=7KdgYpeNRnl>TpX&Of zOn?AkBfNA$bgMe7WI^9g5QFcZ9lspZj#TKIWJH2e=4RT=EJ{DGt|vdCciS7|H6;w+ zDYoN#@elG%4m|S}jln|ih4AT=yK8C$@v{(Bd|UU{x;P)xX%Zm)_I?nmLOUKR2j?!v zM}=lJ@VmS@e~Vmu+hn<+`yNWhw6Q4InMw5tmuFBkUc4@F`)j(DNLhFwwXJl^j4?aS9P+n{tm zYZpJj-oxv%0jUmb>?eez6tRaLx#q`P^qMv~hP5I}Z3$lc;%)2Y0yUH)p{F>Vu19Or z*vCum{)n*VOOmom6$otjOH<>Eo_w$Ly+mMCygXZ=bZThkKJA6`aD`lT1X~rtV5@lP1(y(a$Py3&dwy+v zt3B`&{;DOYZNsPIL9d(>>u@y2xK?RN4_><2&-OPJS;%Y2>(o&X7(i9*er=F|j5U(ZRP$eZRebmK1!$@o;i+ z^7-E3XhpyAw0u$#d=npOHXv~2Bk#w3E{)5iOYVzgixj|eUJB6Vmb{ukkBf~imNRA6 z`z_Kdo!tu)$wp!BSQR2M@Ea}!hoeF6k+9NBIJUIR+qMjW%vK6GrF&Br4RArgqDl@O~F9+>jHRt?%^FZr*7Qc zyxg6`bf}JgI>sC!Vj=Vb2@`&$&pl~5q)aum1&o*KKN%J7yGLZY3dQkJ(8GVgN%*O5 z&;Jlq3~WdkLth$p0f64Y945@4N+H{h*YrTr1Dr6e_Q=ot%l%lV&Zu3#{Ts(X)vJ^k zK{-5PfD*PC0(1@u>lEwuL%YgR!v%8rX|(tid~_Q^h~K44sCKzW@N-v1lrQ0G~iEQ%4S$zF_HM8cW2q!UVvH-1k9&D@vu7>@pXx1MXMp zyib4U0^evsaDaMR)5f&GKh7qw#t|`x?6%gg+wH#na17u`2gEvh;+r019)%ti-|OsJ zR;a5OGJHRBOei6pp)a!*&A!l2h9z?wk?s$LF21~unb%_(o(J;ihmz-T6cqJphgmj1 zZPIt#eh+v)Ioqjm`joo3xxR7(;E$u6w;#n3Z#%Qku|l?GhAHcz>|b(a21thG;`PXL z$%@9C*}Av>I|n^=|&Fuj|S(Sy?}=!fXp8t*B_M zvO9q2lnIa~0=}3C;X4}Q4Te1)V}yJ}cQE^U2YDj%{3LWVTkk!9b4TSV4nmTyWVU!A znOCYBC;jMQv_;SowXinU)}r@gmR{`BDUAQ^=^My!fxE}t#8u^~Pv~<0hCVFGnX#?U zOFIt5wgJkwnVjoVlx>@%@$Zwz%|LqxaU`EQ`58x-r%E97Pk5|Za5Lk_of|?%r6;6D zjv*`bICB5|w%B*Dx?4O&swd93IPchmjo%nT6J}$FblU|uR0GjBo_!Xnv%IKmohWc+ zlg&t~7@}pcI=nBq8e^dH7*F`^Lq;fHdoc6VQML(ZsaU6_Ssq>LqzFmL6ew}3BUaYr zo<93&G44*}`HTNc`~YMkwZbL8w929EsrC)|?yPabPu5lK0jA?VHAEt&!UoMy6)80F zifCQXBjKok#hAXk`W3N;2sA1D>zzQaV$kY2X53_tTHw~ z5H$Nsmh@HBfZRjHb#q@pY)asU}SLXav8MqP7n8LCE5vJZ=oXT$%JdistvK)cQmB~uW7aiL|@Ac zmlpSSUj%=S=`2Vu=nD;qd0)r1{XSD$sEJ1=)R7N}(&Yg*l~U-aaf=GLJ~x1Bv;F$zNW~D{?!rNF zsOE~6%(><%_S$wVYI{{pwZi7D>Bf-D%80=6A5Xo^`Qrfggbh4$E{p|c=sZj_d9;>C z_C0bHoUhZ`+!8GuwnS{MB++6f`Qy#q)w=&59Y(9L8@FDvWdlpCUFG=5yQ|i-WV&r; z0=BBeJ7_AsXz4^wj*Hd?s9)xF0|K(OQ>QgVtdbfuP!!Z)|1=H*eJ(i#_b{j`DFA;xCa)|NRi8DPd#ngW$M_dld zml!`X{5~rF(zsO5)x@4T&!AdCV~lX( z9LWMcg-t*?aQuc3T{#R41v@1#z?WMK6^`Q@Y*1DI;{$@G?|v87Fvl5_LHWCF!^2`Y zJ9nXlNBe%AFMD`9y{>(4a=8CO{XFbu;C-A1 zYoTDQ+ukeYdp?GCiAG}ma&aCn0xa~^1iKQZKaJz$b*R8Rw&&SEX*COQLa*z;lQ}d) zKkee@1yQ`PxCXB?f(=X>0f4Xe!6cs%g5-x?r#`=7!?AVdcaVL#YVwTk9fIvAWKVTZ zi)Z6Pb+KtM&p2E->R1JDYHEw7V%#$5F_#}zyo7hp~o= z3pDXbGZ+F>Kxo1QH`^2T2D$(kj4;k^3}>1GdtPnlJO{kYgdyjeWZJ%|6ducl3=cq3 z2!2Y+5T?I{SNRDRw?dOeI8w<#L8ILtQcU$ap4Ay#9T)r7 zb)+=SZ>ldF0!vFpZ78w%ns;6f?Se;gzL>pa}yo?!BLQ9A}_`qV2a z!4rn(6f{{L=YXe3NaiV%oleIA>t~*w zJ9ue9&S6qeE|A{!85l-AF*;~S5ks@{5#J==$Np>A85bDg-;{17g~rvmjYY7*>Oim3 zqf(;nT#bK%`+yAiXuley>ot9|?=>>EPch+lCp^f&c^KAMxiWnTsl~I zWRt4fn6j&(B>6Npc=INzNA1GUh5YCEM22?5MK`Ngv zLn6$)7h{0pYmjldAd_q^E(V45_@+-)UHA5=5=6PW`FOE|AKw=$Sc5XU=Hq-D z2QxZI+ES}89%n&B2UMtIkTtZ7=OC8*$7xlo;iJDvJpYI~x?5Ma&);$F7-2H4?-Kwz zuH4Y1c9$k;Oi##_qebYtiXC;oTlXt$coEuzwT<)llhkye6_=?h zwbZSMMT~{#vS{|Kn-wx~0@K3PN2dMpchHj7)j^UN-Q#3X$C(L2EG# z7a0VLSi|z@;YRqV-`T;WX}_UJSQF|?_1^jgy_yT^05=C<_@0TZcpPV`13Wia0Dk>Y zk=+6pQc!JCWOte`P8*(;XIeI&Ka9qN&rFn;Vp!(7DMl+DFc-?5wpF5df)sNI7fxm=Yq46`I@#a*~xMw&XoT6?dEVk(-i;1XYg;Jr`}B-_2wsph1&}zZL@9S^=))n+y6d#O<(7JFK;yGVr0K@@NUg%ODu3 zpZMy2*izdSO4K~Qc%pV1j7rxfaATVYbKU%T`}HC7_&emz1(C#>Ha_MbJBIc7 z<2m6h$7i146&dq_F*F!^c7(zihXaXOywbQn{{FScK%FR&i#xlRLpQm_s8ZG-lkY^N ze0r(FqwXaDOl2}~yZS7snq>dfCsqB87UxPHn$V~dnyzGc(9xc#wL;Y%CS%i-szHe^Ee8QkC|aX15H1|t5uQNejQz>L z211LQJaJ4;pbLUy0jGT}{_9MNIU?=ewvuQ-vHV8Iq_zUaPbBbTBm!%J$jwi~iswmN zsI_$fh8gBRuEM{hysK?HU`Zl~gYO=N`$%^vGNTNhmWF}KEI@y{xgRt#@E2v1zk<}5}Cf4V@yjIkUyey6w9xXOcK& z)VqBJ&Y5>29eN)K#I)zytyy59=p>kEhN=e>h!4sz#Mb<-olTZJAwl;>xE9^;2midV zxS*HD)0)KjQlZI>b^VR1nNKDF+Z~A7d&6#Tj*>L0Xiu%55WwP>;b5=VXrm6D!)DP#5%0*!~~OXgUOjmCui=??j1{B z$McVkpXm1<10BRoHkCS!kQ~G(&iXJ0#Y2ON=PQ!EAxd{o=lR; zZBDYZ`m-y0Ejy2-n`tB|?P+yT@zoNA>)xJU)~nWCGB>dCiz|YG2t!#ol(72EN^18f zI;UPdxVhpXumuIhx~K&@@a0qm&=BUAz)tHdN^GMNT*`ag_jqnt)mhMwef+=NJgT2& zTN^(5N|;}Q+b?1MT(Fmby+i0Gba3~_>rl2J)+E!DOjHWTbdUj;_8Pomt1b`24}zFt>44Fub_rQ0)fel`h`}mswumEV&J1%$4KW~|G6kRf z#zI0ynVamG+O1H9<8T76-U;u&GqnmQn2cmj z>{owPT_32H2^P=z1Sv<-VRLc9aTECKc9d6K;*y%0AVsHsC|`W-H#Be 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 + + + + + + + executable game + + + + nsp + true + true + + + Ryujinx emulator on Kodi + Ryujinx frontend for Kodi. + + Ryujinx.png + fanart.jpg + resources\screenshot-01.jpg + resources\screenshot-02.jpg + resources\screenshot-03.jpg + + See ryujinx.org for latest updates + GPL-3.0-or-later + https://github.com/Ryujinx/Ryujinx + + diff --git a/plugin.program.ryujinx/main.py b/plugin.program.ryujinx/main.py new file mode 100644 index 0000000000..2f3b4328cc --- /dev/null +++ b/plugin.program.ryujinx/main.py @@ -0,0 +1,160 @@ +# Module: main +# Author: Roman V. M. +# Created on: 28.11.2014 +# License: GPL v.3 https://www.gnu.org/copyleft/gpl.html +""" +Ruyjinx game addon +""" +import sys +from urllib.parse import urlencode, parse_qsl +import xbmcgui +import xbmcplugin +import xbmcaddon +import xbmcvfs +import json +import subprocess +import base64 +import os +from PIL import Image +import io +import platform + +# Get the plugin url in plugin:// notation. +_URL = sys.argv[0] +# Get the plugin handle as an integer number. +_HANDLE = int(sys.argv[1]) + +MONITOR_MODEL='XWAYLAND17' +def get_url(**kwargs): + """ + Create a URL for calling the plugin recursively from the given set of keyword arguments. + + :param kwargs: "argument=value" pairs + :return: plugin call URL + :rtype: str + """ + return '{}?{}'.format(_URL, urlencode(kwargs)) + + +def list_games(): + """ + Create the list of playable games in the Kodi interface. + + :type category: str + """ + emulator_path = xbmcaddon.Addon().getSettingString('emulator_path') + game_dir_path = xbmcaddon.Addon().getSettingString('game_dir_path') + result = subprocess.run([emulator_path, '--list-games', game_dir_path], stdout=subprocess.PIPE) + xbmc.log('------ {}'.format(result), xbmc.LOGINFO) + arrayMetadataGame = json.loads(result.stdout.decode('utf-8')) + + + # Set plugin content. It allows Kodi to select appropriate views + # for this type of content. + xbmcplugin.setContent(_HANDLE, 'games') + # Iterate through games. + for game in arrayMetadataGame: + # Create a list item with a text label and a thumbnail image. + list_item = xbmcgui.ListItem(label=game['title_name']) + # Set additional info for the list item. + # 'mediatype' is needed for skin to display info for this ListItem correctly. + title_name = game['title_name'] + list_item.setInfo('game', {'title': title_name, + 'path': game['path'], + 'mediatype': 'game'}) + # Set graphics (thumbnail, fanart, banner, poster, landscape etc.) for the list item. + # Here we use the same image for all items for simplicity's sake. + # In a real-life plugin you need to set each image accordingly. + img_data = game['icon'] + im = Image.open(io.BytesIO(base64.b64decode(img_data))) + img_name = title_name + '.png' + temp_folder = xbmcvfs.translatePath('special://temp') + img_dir = os.path.join(temp_folder, 'Ryujinx') + if not os.path.exists(img_dir): + os.makedirs(img_dir) + img_path = os.path.join(img_dir, img_name) + im.save(img_path) + + list_item.setArt({'thumb': img_path, 'icon': img_path, 'fanart': img_path}) + # Set 'IsPlayable' property to 'true'. + # This is mandatory for playable items! + list_item.setProperty('IsPlayable', 'true') + # Create a URL for a plugin recursive call. + url = get_url(action='play', game=game['path']) + # Add the list item to a virtual Kodi folder. + # is_folder = False means that this item won't open any sub-list. + is_folder = False + # Add our item to the Kodi virtual folder listing. + xbmcplugin.addDirectoryItem(_HANDLE, url, list_item, is_folder) + # Add a sort method for the virtual folder items (alphabetically, ignore articles) + xbmcplugin.addSortMethod(_HANDLE, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE) + # Finish creating a virtual folder. + xbmcplugin.endOfDirectory(_HANDLE) + + +def play_game(path): + """ + Play a game by the provided path. + + :param path: Fully-qualified game path + :type path: str + """ + # Create a playable item with a path to play. + #play_item = xbmcgui.ListItem(path=path) + # Pass the item to the Kodi player. + #xbmcplugin.setResolvedUrl(_HANDLE, True, listitem=play_item) + + env=os.environ.copy() + #Ignore wayland + if platform.system() == 'Linux': + env['GDK_BACKEND'] = 'x11' + #TODO: Run in same screen as kodi (for multimonitor config + #env['DISPLAY'] = ':0.1' + + emulator_path = xbmcaddon.Addon().getSettingString('emulator_path') + command = [emulator_path, '--run-once', '-f', path, '--move', MONITOR_MODEL] + xbmc.log('------ {}'.format(command), xbmc.LOGINFO) + p = subprocess.Popen(command, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + #p.wait() + stdout, stderr = p.communicate() + xbmc.log('------ subprocess result {}'.format(stdout), xbmc.LOGINFO) + xbmc.log('------ subprocess result {}'.format(stderr), xbmc.LOGINFO) + #TODO: Listen to ESC or EXIT on kodi to kill process + #p.terminate() + + +def router(paramstring): + """ + Router function that calls other functions + depending on the provided paramstring + + :param paramstring: URL encoded plugin paramstring + :type paramstring: str + """ + + # Parse a URL-encoded paramstring to the dictionary of + # {: } elements + params = dict(parse_qsl(paramstring)) + # Check the parameters passed to the plugin + if params and 'action' in params: + action = params['action'] + if action == 'play': + # Play a game from a provided URL. + play_game(params['game']) + else: + # If the provided paramstring does not contain a supported action + # we raise an exception. This helps to catch coding errors, + # e.g. typos in action names. + raise ValueError('Invalid action: {}!'.format(action)) + else: + # If the plugin is called from Kodi UI without any parameters, + # display the list of games + list_games() + + +if __name__ == '__main__': + # Call the router function and pass the plugin call parameters to it. + # We use string slicing to trim the leading '?' from the plugin call paramstring + xbmc.log('------ {}'.format(sys.argv), xbmc.LOGINFO) + paramstring = sys.argv[2][1:] + router(paramstring) diff --git a/plugin.program.ryujinx/resources/language/resource.language.en_gb/strings.po b/plugin.program.ryujinx/resources/language/resource.language.en_gb/strings.po new file mode 100644 index 0000000000..113fe3ab57 --- /dev/null +++ b/plugin.program.ryujinx/resources/language/resource.language.en_gb/strings.po @@ -0,0 +1,19 @@ +# plugin.program.ryujinx language file +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" + +msgctxt "#32000" +msgid "Paths" +msgstr "" + +msgctxt "#32001" +msgid "Ryujinx path" +msgstr "" + +msgctxt "#32002" +msgid "Game folder path" +msgstr "" + diff --git a/plugin.program.ryujinx/resources/language/resource.language.es_es/strings.po b/plugin.program.ryujinx/resources/language/resource.language.es_es/strings.po new file mode 100644 index 0000000000..938f6d7349 --- /dev/null +++ b/plugin.program.ryujinx/resources/language/resource.language.es_es/strings.po @@ -0,0 +1,19 @@ +# plugin.program.ryujinx language file +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" + +msgctxt "#32000" +msgid "Paths" +msgstr "Rutas" + +msgctxt "#32001" +msgid "Ryujinx path" +msgstr "Ruta de Ryujinx" + +msgctxt "#32002" +msgid "Game folder path" +msgstr "Ruta del directorio de juegos" + diff --git a/plugin.program.ryujinx/resources/settings.xml b/plugin.program.ryujinx/resources/settings.xml new file mode 100644 index 0000000000..daafbc1fe5 --- /dev/null +++ b/plugin.program.ryujinx/resources/settings.xml @@ -0,0 +1,32 @@ + + +
+ + + + 0 + + + false + executable + true + + + 32001 + + + + 0 + + + false + true + + + 32002 + + + + +
+